Аутентификация SPNEGO

SPNEGO (Simple and Protected GSS API Negotiation Mechanism) — механизм, применяемый для определения технологии защиты, которая будет использоваться при безопасном подключении. В частности он используется, когда ни сервер, ни клиент не знают о поддерживаемых протоколах безопасности друг друга. SPNEGO использует протокол для определения доступных механизмов GSS API, выбирает один из них и делегирует ему все операции, связанные с безопасностью.

Когда сервер получает запрос от браузера, он может запросить, чтобы тот использовал для аутентификации протокол SPNEGO. Этот протокол осуществляет Kerberos-аутентификацию через HTTP. Детально процесс выглядит так:

  1. На запрос с заголовком WWW-Authorization: Negotiate сервер возвращает код 401 Unauthorized.

  2. Браузер связывается с сервисом выдачи тикетов (Ticket Granting Service, TGS) для получения тикета.

  3. Полученный тикет оборачивается в закодированный в base64 токен SPNEGO и отправляется на сервер с последующим запросом аутентификации.

  4. Токен разворачивается, и сервер аутентифицирует тикет.

Настройка браузера

Некоторым браузерам требуется дополнительная настройка для Kerberos-аутентификации с помощью SPNEGO. Инструкции для самых популярных браузеров представлены ниже.

  • Mozilla Firefox

  • Google Chrome

  1. В строке поиска введите команду about:config и запустите её.

  2. Измените следующие параметры, присвоив им соответствующие значения:

    • network.negotiate-auth.trusted-uris — ваш домен, защищенный Kerberos (например, .ru-central1.internal).

    • network.automatic-ntlm-auth.trusted-uris — ваш домен, защищенный Kerberos (например, .ru-central1.internal).

    • network.auth.use-sspi — false.

  3. Перезапустите браузер и проследуйте к защищенному ресурсу.

Для корректного процесса аутентификации требуется установить дополнительные политики для браузера.

  • В Windows откройте редактор регистра и раскройте HKEY_LOCAL_MACHINESOFTWAREGoogleChrome. Для добавления новых политик нажмите правой кнопкой мыши в пустом месте, затем NewString value и введите название политики и её значение:

    • AuthSchemes — digest,ntlm,negotiate.

    • AuthServerAllowlist — <domain>. Если этот параметр не установлен, то Google Chrome проверит, есть ли сервер, запрашивающий аутентификацию в интранете. Если есть, то процесс продолжится, а в противном случае — Google Chrome будет игнорировать запросы на аутентификацию, поступающие от этого сервера.

    • AuthNegotiateDelegateAllowlist — <domain>. Если этот параметр не установлен, то Google Chrome не будет передавать учетные данные пользователей даже серверам, находящимся в интранете.

      В описаниях параметров выше <domain> — ваш домен, защищенный Kerberos (e.g. .ru-central1.internal).

      Обратите внимание, что хост с Windows обязан находиться в домене, в то время как для Linux это необязательно.

  • В Linux перейдите в директорию (создайте недостающие папки) /etc/opt/chrome/policies/managed и создайте файл политики (например, test_policy.json) со следующим содержимым:

    {
      "AuthServerAllowlist": "<domain>",
      "AuthNegotiateDelegateAllowlist": "<domain>",
      "AuthSchemes": "digest,ntlm,negotiate"
    }

Правильность создания политик можно проверить, запустив команду chrome://policy в поисковой строке.

Политики Google Chrome для SPNEGO
Политики Google Chrome для SPNEGO
Политики Google Chrome для SPNEGO
Политики Google Chrome для SPNEGO

При правильной настройке вы сможете получить доступ к запрашиваемым ресурсам с помощью тикета Kerberos, выданного в вашей системе. В противном случае вы продолжите получать ошибку 401 Unauthorized.

Поддерживаемые сервисы

Следующие сервисы ADH поддерживают аутентификацию в веб-интерфейсах с помощью SPNEGO:

  • Flink

  • HDFS

  • Hive

  • HUE

  • Impala

  • Kyuubi

  • Spark/Spark 3

  • SSM

  • YARN

Чтобы включить для них механизм SPNEGO (если не указано иначе в инструкции для сервиса), необходимо установить флаг Authentication on WEB UIs при активации Kerberos.

Параметр Authentication on WEB UIs
Параметр "Authentication on WEB UIs"
Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней