НАСТРОЙКА SSO KERBEROS

Для включения аутентификации с использованием службы Kerberos нужно выполнить следующие условия:

  • Kerberos_ENABLED=true (включение доступной стратегии авторизации kerberos)
  • KERBEROS_KEYTAB_PATH=/etc/krb5_multi.keytab (абсолютный или относительный путь к keytab файлу (ссылка генерация keytab файла)).
  • Убедится, что в DNS существует A и RTP запись для сервера, где будет расположен PLAN-R
  • Настроить браузеры для SSO
  • Выполнена интеграция с Active Directory. Подробнее с настройкой подключения к Active Directory, можно ознакомиться в разделе «ИНТЕГРАЦИЯ С ACTIVE DIRECTORY»

При соблюдении всех условий при авторизации должна появится кнопка «kerberos», при нажатии на которую происходит аутентификация по сеансу операционной системы.

register imageКнопка аутентификации по сеансу операционной системы

Генерация keytab файла

SPN (Service Principal Name) — уникальный идентификатор экземпляра сервиса. SPN используется аутентификацией Kerberos для сопоставления экземпляра сервиса с учетной записью сервиса (service logon account). Это позволяет клиентским приложением аутентифицироваться в роли сервиса, даже не зная имени пользователя.

До того, как аутентификация Kerberos сможет использовать SPN для аутентификации сервиса, SPN должен быть привязан к учетной записи, которая будет использоваться для входа. SPN может быть привязан только к одной учетной записи. Если учетная запись, привязанная к SPN, изменяется, то необходимо заново выполнить привязку.

Когда клиент хочет воспользоваться сервисом, он находит экземпляр сервиса и составляет SPN для этого экземпляра, далее использует этот SPN для аутентификации.

Keytab-файл — это файл, содержащий пары Kerberos принципалов и их ключей (полученных с использованием Kerberos пароля). Эти файлы используются для аутентификации в системах, использующих Kerberos, без ввода пароля. Если пароль принципала изменится, то keytab-файл необходимо будет сгенерировать заново.

Windows DC

  1. Создание пользователя для привязки SPN (Необходимо запретить смену пароля и не ограничивать его срок действия, иначе придётся пересоздать keytab-файл)

register imageСоздание пользователя на windows DC

  1. В командной строке доменного контролера выполнить привязку SPN к учётной записи
  • setspn -A HTTP/test-planr.dppm.ru planr-sso

register imageПривязка SPN к созданной учетной записи

Корректность выполнения привязки SPN к учётной записи, можно проверить командой:

  • setspn -L planr-sso

register imageПроверка_привязки SPN к созданной учетной записи

  1. Создание и привязка keytab файла происходит с помощью следующей команды:
  • ktpass -princ HTTP/test-planr.dppm.ru@DPPM.RU -mapuser planr-sso -pass Pa$$word -ptype KRB5_NT_PRINCIPAL -crypto AES256-SHA1 -out C:\planr.keytab

где:

  • -princ — имя принципала, содержащее SPN и Kerberos-область (realm);
  • -mapuser — пользователь, к которому привязывается SPN;
  • -pass — пароль пользователя;
  • -ptype — указывает тип принципала (рекомендуется KRB5_NT_PRINCIPAL);
  • -crypto — используемый алгоритм шифрования (рекомендуется AES256-SHA1);
  • -out — путь и имя генерируемого файла.

register imageСоздание Keytab файла

Проверку аутентификации Kerberos с помощью keytab-файла и его работоспособность, можно выполнить с помощью следующей команды(выполняется в среде linux):

register imageПроверка авторизации

  1. Заходим в оснастку ADUC и убеждаемся, что для созданной учетной записи «User logon name» сменилось на имя привязанной SPN. Включена поддержка 128 и 256 битного шифрования для Kerberos.

register imageПроверка учетной записи

  1. Далее, нужно перенести созданный keytab файл на сервер Plan-R и указать к нему путь с помощью переменной KERBEROS_KEYTAB_PATH в файле .env.

Samba DC

  1. Создание пользователя для привязки SPN к пользователю.
  • samba-tool user create --random-password planr-sso
  • samba-tool user setexpiry planr-sso –noexpiry
  • samba-tool spn add HTTP/plan-r.ru planr-sso

register imageСоздание и привязка SPN к пользователю

  1. Далее необходимо убедиться, что для созданной учетной записи «User logon name» сменилось имя на имя привязанной SPN. Если этого не произошло, то нужно вписать имя привязанной SPN в поле «User logon name» вручную, и только после этого приступать к генерации keytab файла. Также убедимся, что включена поддержка 128 и 256 битного шифрования для Kerberos.

register imageИмя учетной записи «User logon name»

  1. Генерируем keytab файл с помощью следующей команды.

register imageГенерация keytab файла для samba DC

  1. Перенести файл на сервер и указать путь к нему с помощью переменной KERBEROS_KEYTAB_PATH

РЕД ОС

  1. Создание сервисного аккаунта для привязки SPN
  • Служба каталогов РЕД АДМ -> Управление объектами домена -> Пользовтели -> Создать
    Внимание! Срок действия пароля должен быть неограничен

register imageУправление объектами домена.Пользовтели

  1. Создание SPN
  • Служба каталогов RED ADM -> Управление доменом -> Глобальная конфигурация -> SPN -> Добавить

register imageГлобальная конфигурация.SPN

  • Далее, в поле SPN вводим имя SPN. В поле Привязать к... нажимаем на ... и находим пользователя, которого мы создали в предыдущем пункте для привязки к SPN и нажимаем Выбрать

register imageSPN.Добавить SPN

register imageSPN.Поиск объекта

  • В итоге, поля в окне Добавить SPN должны быть заполнены, следующим образом. Нажимаем, Добавить

register imageСоздание SPN

  • Далее, необходимо в свойствах созданного пользователя изменить параметр Имя для входа
    РЕД АДМ -> Управление объектами домена -> Пользователи -> Выбираем созданного пользователя -> Учётная запись -> Имя для входа -> Заменяем на имя привязанной SPN -> Сохранить

register imageУчётная запись.Имя для входа

  1. Генерация keytab файла
  • Переходим на контроллер домена и под учётной записью администратора домена, генерируем keytab файл с помощью следующей команды в терминале:
samba-tool domain exportkeytab /tmp/planr.keytab --principal=HTTP/planr.dp.red.ru@DP.RED.RU
  • Проверку аутентификации Kerberos с помощью keytab-файла и его работоспособность, можно выполнить с помощью команды:
kinit -5 -V -k -t /tmp/planr.keytab HTTP/planr.dp.red.ru@DP.RED.RU

  1. Переносим созданный keytab файл на сервер Plan-R и указываем к нему путь с помощью переменной KERBEROS_KEYTAB_PATH в файле .env.

Настройка браузера для SSO

Настройка браузеров Google Chrome, Microsoft Edge, Яндекс Браузер для авторизации Kerberos

Для настройки браузеров Google Chrome, Microsoft Edge, Яндекс Браузер для работы с Kerberos, необходимо выполнить следующие действия:

  • Откройте Панель управления -> Свойства браузера -> вкладку Безопасность -> Местная интрасеть -> Сайты

register image

Настройка SSO.Свойства браузера

  • Далее нажмите вкладку Дополнительно

register image

Настройка SSO.Местная интрасеть

  • В поле Добавить в зону следующий узел введите доменное имя хоста на котором запущены сервисы PLAN-R и нажмите Добавить

register image

Настройка SSO.FQDN

Настройки для всех трёх браузеров в Windows, будут идентичны.

Настройка браузера Firefox для авторизации Kerberos

Для корректной авторизации пользователей, использующих браузер Firefox, с помощью Kerberos необходимо в браузере перейти по адресу about:config и указать доменное имя хоста на котором запущены сервисы PLAN-R в следующих конфигурационных параметрах:

network.negotiate-auth.trusted-uris

network.negotiate-auth.delegation-uris

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

Устранение неполадок

При возникновении проблем с Kerberos-авторизацией необходимо проверить логи:

  1. В файле .env добавьте или раскомментируйте переменную:
    KERBEROS_LOG_LEVEL=debug
    
  2. Перезапустите приложение командой ./start.sh
  3. Проверьте логи Nginx командой:
    docker logs planr-proxy-1
    

В DNS должна быть A-запись, указывающая на IP-адрес сервера. Имя SPN должно строго совпадать с этой A-записью (например, если A-запись planr.ru, то SPN должен быть HTTP/planr.ru).

Диагностика

На стороне сервера: Зайдите в контейнер прокси-сервера (в зависимости от вашей архитектуры имя может отличаться):

docker exec -it planr-proxy-1 bash

Внутри контейнера можно выполнить следующие проверки:

  • Просмотр содержимого keytab (какие SPN и алгоритмы шифрования в нем заданы):
    klist -ke /etc/krb5_multi.keytab
    
  • Проверка авторизации Kerberos с помощью keytab файла (эмулируя работу Nginx):
    kinit -5 -V -k -t /etc/krb5_multi.keytab HTTP/<вписать SPN>
    

На стороне клиента:

  • Просмотр списка привязанных SPN к конкретной сервисной учетной записи в AD:
    setspn -L <ИмяСервиснойУчетки>
    
  • Поиск учетной записи в AD по известному SPN (помогает найти дубликаты):
    setspn -Q HTTP/plan-r.ru
    
  • Просмотр текущих билетов Kerberos в оперативной памяти клиентского компьютера (убедиться, что билет был получен браузером):
    klist
    
  • Полная очистка кэша билетов Kerberos (выполнять на клиенте при смене пароля сервисной учетной записи или перегенерации keytab):
    klist purge
    

Объединение нескольких keytab-файлов

Если вы используете несколько доменных зон, вам потребуется объединить их ключи в один общий файл krb5_multi.keytab. Для этого в Linux используется интерактивная утилита ktutil:

# Запустите утилиту
ktutil

# Прочитайте по очереди keytab-файлы:
ktutil: rkt domain1.keytab
ktutil: rkt domain2.keytab

# Запишите результат в новый общий файл:
ktutil: wkt krb5_multi.keytab
ktutil: quit

Возможные ошибки

  1. Бесконечный запрос пароля или ошибка 401 Unauthorized в браузере
    • Причина: Браузер не передает Kerberos-билет на сервер.
    • Решение: Проверьте, добавлен ли URL-адрес системы в зону Местная интрасеть (Local Intranet) в настройках Windows. Убедитесь, что клиентский ПК находится в домене и может связаться с контроллером домена для получения билета.
  2. Ошибка Nginx: Cannot find key for HTTP/xxx kvno X in keytab
    • Причина: Версия ключа (KVNO) в AD увеличилась (например, был изменен пароль сервисной учетки или перевыпущен SPN), а на сервере находится старый файл keytab.
    • Решение: Сгенерируйте новый keytab файл на контроллере домена и замените его на сервере. При необходимости выполните klist purge на клиентских ПК.
  3. Ошибка Permission denied при доступе к keytab файлу
    • Причина: У Nginx нет прав на чтение примонтированного файла krb5_multi.keytab. Может возникнуть при переносе файла на Linux-хост, когда файл получает права, разрешающие чтение только root-пользователю.
    • Решение: Проверьте владельца и права доступа к файлу на хост-машине. Убедитесь, что файл доступен для чтения (например, выполните chmod 644 krb5_multi.keytab).

602.0-37145e8f