kerberos
Прозрачная аутентификация Kerberos — пользователь автоматически входит в приложение под доменной учетной записью, под которой он зашел в операционную систему.
Общие сведения о Kerberos-аутентификации и особенности реализации в SMP
Основные понятия и определения
-
Kerberos — сетевой протокол аутентификации, позволяющий безопасно передавать данные через незащищённые сети для безопасной идентификации.
Также Kerberos — набор бесплатного программного обеспечения от Массачусетского технологического института MIT (Massachusetts Institute of Technology), разработавшего этот протокол. Организация протокола направлена в первую очередь на клиент-серверную модель и обеспечивает взаимную аутентификацию — оба пользователя через сервер подтверждают личности друг друга. Сообщения, отправляемые через протокол Kerberos, защищены от прослушивания и атак повторного воспроизведения.
- Realm — область (домен) аутентификации в инфраструктуре Kerberos. Значение чувствительно к регистру символов.
- SPN (Service Principal Name) — имя участника службы — уникальное имя, по которому идентифицируется экземпляр сервиса. Это способ сопоставить учетную запись Windows, ответственную за запуск экземпляра службы, с сервером и службой.
- UPN (User Principal Name) — логин пользователя. Имя, сокращенное относительно полного имени пользователя. Пример: user@domain.ru.
- KDC (Key Distribution Center) — сервер аутентификации в инфраструктуре Kerberos. Контроллер домена.
- TGS (Ticket Grant Service) - билет на предоставление доступа к сервису. В нашем случае это билет kerberos на доступ в приложение.
- Keytab - файл, содержащий одну или несколько пар SPN и долговременного ключа шифрования.
Принцип поиска логина во внутренней базе данных при прозрачной аутентификации
После успешной проверки kerberos-билета от пользователя:
- Приложение извлекает из него логин, например, user@msk.example.com. Логин, получаемый из билета, соответствует атрибуту sAMAccountName в Active Directory.
-
Приложение производит последовательный поиск нескольких вариантов логина во внутренней базе данных:
- user
- user@MSK.EXAMPLE.COM
- user@MSK
- MSK\user
-
Приложение прекращает дальнейший поиск при первом найденном варианте логина и разрешает вход под этим пользователем.
Если найдено несколько пользователей с идентичными логинами, например два user (аномальная ситуация) или не один вариант логина не найден, будет возвращена ошибка.
Включить или отключить регистронезависимость логинов можно в конфигурационном файле dbaccess.properties (параметр login.casesensitive
Также расширить правила поиска логина внутри системы можно с помощью конфигурации файла realm-rules-config.xml (см. Настройка соответствия имен доменов и Realm. Конфигурационный файл realm-rules-config.xml).
Требования к инфраструктуре для использования Kerberos-аутентификации
Требования к инфраструктуре для использования прозрачной аутентификации с использованием протокола Kerberos (дополнение к техническим требованиям эксплуатации):
- Наличие KDC (Key Distribution Center) - сервер аутентификации в инфраструктуре Kerberos, контроллер домена Active Directory под управлением ОС MS Windows Server 2008 R2 и выше;
- Рабочие станции пользователей под управлением ОС MS Windows XP выше;
- Используемый браузер Microsoft Edge, Mozilla Firefox 3.6 и выше, Google Chrome 18,19 и выше;
- Рабочие станции пользователей включены в домен, пользователи используют доменные учетные записи;
- Логины пользователей в системе должны соответствовать логинам в AD (как правило, для этого используется механизм импорта оргструктуры из Active Directory);
- При использовании разветвленной доменной инфраструктуры, в случае если домен пользователя отличается от домена KDC, между доменами должны быть установлены двусторонние доверительные отношения на уровне лесов (Forest Trust).
Для сервера приложения не обязательно:
- иметь доступ до контроллеров домена, если только одновременно не настроена LDAP-аутентификация на форме;
- принадлежать домену, в котором настраивается аутентификация;
- запускаться под доменной учетной записью.
Прозрачная аутентификация может работать на удаленном рабочем столе (пользователь должен войти под доменной учетной записью).
Настройка Kerberos-аутентификации
Данные, используемые в документации для примера настройки
| Данные | Значение | Описание |
|---|---|---|
| Домен |
msk.example.com |
Полное имя домена аутентификации (домен, в котором зарегистрированы пользователи) |
| Второй домен |
spb.example.com |
Полное имя второго домена аутентификации (используется для примеров с мультидоменной конфигурацией) |
| Сервер приложений |
srv-app.local |
DNS A-запись сервера приложения |
| Ссылка на приложение |
https://support.msk.example.com |
Ссылка, по которой пользователи работают в приложении. Домен не обязан совпадать с доменом аутентификации и взят для примера |
| Служебная учетная запись |
naumen-spnego@msk.example.com |
Пользователь, к которому привязывается SPN |
| Пароль служебной учетной записи |
myP@ssw0rd |
Пароль пользователя, к которому привязывается SPN. Используется при генерации keytab-файла |
| Пользователь-клиент |
myuser@msk.example.com |
Пользователь-клиент приложения |
| Realm |
MSK.EXAMPLE.COM, SPB.EXAMPLE.COM |
Область аутентификации Kerberos. Записывается заглавными буквами. Соответствует полному имени домена аутентификации |
Создание SPN и keytab-файла
Чтобы настроить сервер аутентификации в инфраструктуре Kerberos (Key Distribution Center), выполните следующие действия:
-
Создайте учетную запись пользователя (User Logon Name = naumen-spnego) в Active Directory с помощью Active Directory Users and Computers:
- При создании снимите флажок User must change password at next logon;
- Введите и запомните пароль (myP@ssw0rd).
Убедитесь, что в Active Directory нет учетной записи компьютера с таким же именем.
-
В параметрах созданного аккаунта (Account options) включите AES128 kerberos шифрование, в Java 17 это минимально допустимый тип шифрования kerberos.
При переходе на Java 17 перестало поддерживаться шифрование arcfour-hmac, поэтому требуется перегенерировать keytab-файл, если в нем использовано только такое шифрование
-
Создайте SPN, привязанный к служебной учетной записи, и сгенерируйте keytab-файл, который будет использован для аутентификации сервером приложения, с помощью команды:
ktpass -princ HTTP/srv-app.local@MSK.EXAMPLE.COM -crypto AES128-SHA1 -mapuser naumen-spnego@msk.example.com -pass myP@ssw0rd -SetPass -out c:\TEMP\naumen.keytab
где
-
-princ HTTP/srv-app.local@MSK.EXAMPLE.COM — principal name, сформированный по следующему принципу:
- HTTP/srv-app.local — SPN, составленный из специального префикса HTTP/ (не указывать HTTPS!) и имени сервера, на котором работает приложение
- @MSK.EXAMPLE.COM — реалм, для которого выписывается keytab. Указывается название домена большими буквами..
- -crypto AES128-SHA1 — тип шифрования ключа в keytab-файле, рекомендуемые значения AES128-SHA1 или AES256-SHA1, выбранный тип шифрования должен быть включен в параметрах служебной учетной записи
- -mapuser naumen-spnego@msk.example.com — имя служебной учетной записи, к которой привязывается SPN.
- -pass myP@ssw0rd — пароль служебной учетной записи, указанной после опции -mapuser. Если пароль не совпадает с действительным паролем этой учетной записи, то keytab считается невалидным.
- -SetPass — отключение сброса пароля на служебной учетной записи к значению указанному после опции -pass.
- -out c:\TEMP\naumen.keytab — путь, по которому будет сформирован keytab-файл
Если в профиле пользователя AD включены два типа шифрования, то тип шифрования ключа в keytab-файле нужно указать как -crypto ALL
В результате будет создан файл naumen.keytab.
После генерации keytab-файла пароль служебной учетной записи naumen-spnego не должен меняться, иначе keytab-файл окажется невалидным. При необходимости сменить пароль учетной записи перегенерируйте keytab-файл повторным запуском указанной выше команды.
Имя хоста в SPN должно соответствовать полному доменному имени сервера приложения.
-
-
Чтобы использовать для доступа к серверу приложения дополнительные имена (при наличии дополнительных записей DNS типа CNAME), зарегистрируйте SPN на основное DNS-имя и добавьте SPN для всех дополнительных записей типа CNAME, с помощью команды:
setspn -A HTTP/support.msk.example.com@MSK.EXAMPLE.COM msk.example.com\naumen-spnego
где support.msk.example.com — CNAME на основной домен srv-app.local
- Выведите список SPN, привязанных к учетной записи, и убедитесь в их корректности с помощью команды:
setspn -L msk.example.com\naumen-spnego
- Безопасно скопируйте keytab-файл на сервер приложения, например, программой WinSCP, в любой каталог, например, /opt/naumen/nausd4/conf/naumen.keytab.
Сдвиг по времени системных часов компьютеров, входящих в инфраструктуру Kerberos, является достаточно распространенной проблемой в настройке. Разница системного времени не должна превышать 5 минут.
Настройка сервера приложений
Настройка krb5.conf (krb5.ini)
Имя области аутентификации (REALM) задается в системном файле /etc/krb5.conf для Linux, C:\Windows\krb5.ini для Microsoft Windows.
В файле krb5.conf (krb5.ini) пропишите имя области аутентификации (имя домена заглавными буквами):
[libdefaults] default_realm = MSK.EXAMPLE.COM
Настройка параметров аутентификатора (dbaccess.properties)
Описание всех параметров настройки аутентификации в файле dbaccess.properties (раздел Аутентификация и авторизация).
Чтобы настроить параметры аутентификатора в конфигурационном файле dbaccess.properties:
-
Добавьте аутентификатор SPNEGO в список используемых типов аутентификаторов.
ru.naumen.core.authentication.authenticators=SPNEGO,INTERNAL
-
Укажите необходимые параметры аутентификатора (SPN, путь до keytab-файла):
ru.naumen.core.authentication.authenticators=SPNEGO,INTERNAL ru.naumen.core.authentication.spnego-authenticator.service-principal=HTTP/srv-app.local ru.naumen.core.authentication.spnego-authenticator.keytab=file:/opt/naumen/nausd4/conf/naumen.keytab ru.naumen.core.authentication.spnego-authenticator.debug=true
- ru.naumen.core.authentication.spnego-authenticator.service-principal - SPN, для которого выписан keytab. Возможно дополнительно явно указать realm, тогда можно не указывать default_realm в krb5.conf (krb5.ini). Realm указывается через символ @ после имени SPN: HTTP/srv-app.local@MSK.EXAMPLE.COM.
-
ru.naumen.core.authentication.spnego-authenticator.keytab - путь до keytab-файла, путь обязательно должен содержать префикс file:. Пример значения параметра для Windows: file:C:/naumen/nausd4/conf/naumen.keytab. Также можно использовать переменную, содержащую путь к каталогу с конфигурационными файлами приложения ${ext.prop.dir}: file:${ext.prop.dir}/naumen.keytab.
В пути до keytab-файла рекомендуется использовать прямой слеш / не зависимо от используемой операционной системы. Обратный слеш \ в сочетании с некоторыми символами может быть интерпретирован Java как управляющий символ.
- ru.naumen.core.authentication.spnego-authenticator.debug - рекомендуется устанавливать в true. Дополнительный вывод не может значительно увеличить объем журналов приложения.
- Перезапустите сервис приложения, чтобы изменения конфигурации вступили в силу.
Настройка браузера
Настройка рабочего места пользователя сводится к конфигурации браузера.
Чтобы настроить браузер Mozilla Firefox, выполните следующие действия:
- Запустите Mozilla Firefox.
- В адресной строке введите about:config и нажмите Enter.
- В поле "Поиск" (Filter) введите negotiate, чтобы ограничить список опций.
- Дважды кликните на строке с параметром network.negotiate-auth.trusted-uris.
-
В диалоговом окне введите:
- Чтобы разрешить SPNEGO аутентификацию только по конкретной ссылке, введите полностью домен из ссылки (например, support.msk.example.com).
- Чтобы разрешить SPNEGO аутентификацию для целого домена, введите имя домена с точкой в начале (например, .msk.example.com).
- Чтобы разрешить SPNEGO аутентификацию для нескольких доменов, введите их через запятую. После запятой можно ставить пробел.
Настройка браузера заключается в добавлении параметра запуска --auth-server-allowlist="*.msk.example.com".
До 86 версии Chrome этот параметр назывался --auth-server-whitelist.
Чтобы добавить параметр запуска, выполните следующие действия:
- Кликните правой кнопкой мыши на ярлыке Google Chrome.
- Выберите "Свойства".
-
В поле "Объект" к строке запуска браузера допишите --args --auth-server-allowlist="*.msk.example.com".
Пример:
"C:\Program Files\Google\Chrome\Application\chrome.exe" --args --auth-server-allowlist="*.msk.example.com"
Альтернативным вариантом настройки является настройка Edge по инструкции для соответствующего браузера на одной рабочей станции с Chrome. В этом случае Google Chrome берет системные настройки свойств браузера (Internet Options) и не требует запуска с дополнительными параметрами.
Настройка браузера заключается в добавлении сайта в местную сеть Интранет (Intranet).
Настройка браузера Microsoft Edge выполняется через панель управления Windows.
Добавление сайта в местную сеть Интранет (Intranet)
Чтобы выполнить настройку:
- Откройте панель управления (Control Panel) и выберите "Свойства браузера" (Internet Options).
- Перейдите на вкладку "Безопасность" (Security).
- Выберете зону "Местная интрасеть" (Local Intranet) и нажмите кнопку Узлы (Sites).
- В диалоговом окне убедитесь, что флажок "Автоматически определять принадлежность к интрасети" (Include all sites that bypass the proxy server) установлен и нажмите кнопку "Дополнительно" (Advanced).
- В диалоговом окне "Местная интрасеть" (Local Intranet)" добавьте все относительные доменные имена, которые будут использоваться в сети Интранет (например, *.msk.example.com или просто support.msk.example.com).
- Нажмите "OK" и закройте диалоговое окно.
При стандартных настройках этого должно быть достаточно для работы прозрачной аутентификации в приложении.
Проверки при ошибке
Если после добавления сайта в сеть Интранет при переходе в приложение возникает ошибка, выполните проверки:
-
Установлена ли автоматическая аутентификация для зоны Intranet:
- перейдите на вкладку "Безопасность" (Security), выберете зону "Местная интрасеть" (Local Intranet) и нажмите кнопку "Другой..."(Custom Level);
- в диалоговом окне "Параметры безопасности" (Security Settings) прокрутите вниз список к секции "Проверка подлинности пользователя" (User Authentication) и выберете "Автоматический вход в сеть только в зоне интрасети" (Automatic logon only in Intranet zone). Эта настройка позволит пользователям избавиться от повторного ввода логина и пароля;
- нажмите "OK", чтобы закрыть диалоговое окно.
-
Проверьте разрешение на использование встроенной аутентификации:
- перейдите на вкладку "Дополнительно" (Advanced);
- в разделе "Безопасность" (Security) установите флажок "Разрешить встроенную проверку подлинности Windows" (Enable Integrated Windows Authentication);
- нажмите кнопку "OK".
Yandex Browser для организаций
Редакция "Yandex Browser для организаций" отличается возможностью централизованной настройки на уровне групповых политик.
Настройка прозрачной аутентификации для этой редакции описана в официальной документации
Yandex Browser "Домашняя редакция"
Настройка заключается в добавлении параметра запуска --auth-server-whitelist="*.msk.example.com".
Чтобы добавить параметр запуска, выполните следующие действия:
- Наведите курсор на ярлык Yandex Browser и нажмите правую клавишу мыши.
- В контекстном меню выберите "Свойства".
-
В поле "Объект" к строке запуска браузера допишите --args --auth-server-whitelist="*.msk.example.com".
Пример:
"C:\Users\Username\AppData\Local\Yandex\YandexBrowser\Application\browser.exe" --args --auth-server-whitelist="*.msk.example.com"
Альтернативным вариантом настройки является настройка Internet Edge по инструкции для соответствующего браузера на одной рабочей станции с Yandex Browser. В этом случае Yandex Browser берет системные настройки свойств браузера (Internet Options) и не требует запуска с дополнительными параметрами.
Дополнительные настройки Kerberos-аутентификации
Настройка соответствия имен доменов и Realm. Конфигурационный файл realm-rules-config.xml
При прозрачной аутентификации приложение пытается найти пользователя в своей базе данных по атрибуту "Логин". Принцип перебора логинов см. Принцип поиска логина во внутренней базе данных при прозрачной аутентификации.
Расширить набор правил поиска логина во внутренней базе данных можно с помощью определения соответствия между доменом пользователя и внутренним наименованием домена.
Внутреннее наименование домена — это часть атрибута "Логин" класса "Сотрудник" (employee), представляющая домен. В зависимости от настроек синхронизации пользователей системы и Active Directory, логины сотрудников могут иметь вид login@domain, login и прочие.
В файле realm-rules-config.xml представлен набор правил, каждое из которых указывает соответствие между определенным наименованием домена внутри приложения и областью аутентификации (realm).
Например, по каким-то причинам логины из домена MSK.EXAMPLE.COM в системе заведены как @example и @example.com. В этом случае логины не могут быть найдены по встроенным правилам поиска. Для расширения правил поиска конфигурационный файл realm-rules-config.xml должен иметь следующий вид:
<?xml version="1.0" encoding="UTF-8"?> <realm-rules xmlns="http://naumen.ru/xmlschema/core/realm-rules-config/"> <realm-accordance-rule internal-domain="example.com" realm="MSK.EXAMPLE.COM" /> <realm-accordance-rule internal-domain="example" realm="MSK.EXAMPLE.COM" /> </realm-rules>
В свойстве internal-domain определяется внутреннее наименование домена, в realm — имя области аутентификации пользователя.
После указанной настройки поиск логина user@msk.example.com будет дополнительно осуществлен по:
- "user@example.com"
- "user@example"
- "example.com\user"
- "example\user"
Конфигурационный файл realm-rules-config.xml должен находиться в каталоге c конфигурационными файлами приложения. Путь к этому каталогу указывается в java-опции -Dext.prop.dir — Linux, Windows.
Стандартно путь до конфигурационного файла realm-rules-config.xml следующий [каталог приложения]/conf/realm-rules-config.xml.
В общем случае наличие файла realm-rules-config.xml не обязательно.
Настоятельно рекомендуется настроить логирование ошибок аутентификации. Логирование ошибок несущественно увеличивает файл журнала sdng.log, поэтому рекомендуется включить его на постоянной основе.
Отображение ошибок аутентификации в логе приложения настраивается в конфигурационном файле log4j2.properties.
За вывод в лог информации о процессе аутентификации отвечают следующие настройки.
Поиск авторизованного через службу пользователя в БД SD:
logger.authdb.name=ru.naumen.sec.server.employee logger.authdb.level=DEBUG
Общие части аутентификаторов:
logger.springauth.name=org.springframework.security.authentication logger.springauth.level=DEBUG
Логеры Kerberos/SPNEGO аутентификатора
logger.secserver.name=ru.naumen.sec.server logger.secserver.level=DEBUG logger.sepnego.name=ru.naumen.sec.server.spnego logger.sepnego.level=DEBUG
Логеры LDAP & AD аутентификаторов
logger.ldap.name=org.springframework.security.ldap logger.ldap.level=DEBUG logger.ldapsearch.name=org.springframework.security.ldap.search logger.ldapsearch.level=DEBUG logger.ldapauth.name=org.springframework.security.ldap.authentication logger.ldapauth.level=DEBUG logger.nauldap.name=ru.naumen.core.server.ldap logger.nauldap.level=DEBUG
Указанные настройки включены в шаблоне файла log4j2.properties, который можно скачать с сайта NAUMEN (ссылка для скачивания).
Дополнительное логирование на сервере приложения
Для вывода дополнительных сообщений в tomcat/logs/catalina.out добавьте следующую java-опцию сервиса Tomcat:
-Dsun.security.krb5.debug=true.
Логирование ошибок на стороне клиента
В некоторых случаях помогает включение записи ошибок Kerberos на клиентской машине. Для этого установите ключ реестра через regedit.exe:
Путь: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters Ключ: LogLevel Тип: REG_DWORD Значение: 1
После перезапуска рабочей станции вы можете найти ошибки kerberos в журнале событий Windows (eventvwr.msc) в разделе System.
Команда setspn используется для управления SPN записями в домене:
-
Добавление SPN к учетной записи:
setspn -A SPN user@domain
-
Удаление SPN:
setspn -D SPN user@domain
-
Список SPN, привязанных к пользователю:
setspn -L user@domain
-
Поиск пользователей, к которым привязан указанный SPN:
setspn -Q SPN
-
Поиск дублей SPN (может работать медленно):
setspn -x
Подробнее о команде setspn можно прочитать в официальной документации Microsoft.
Просмотр содержимого keytab-файла
Существует несколько способов просмотреть список ключей в keytab-файле:
-
Утилита klist
-
ОС Linux. Используется утилита klist:
klist -K -e -t -k ./naumen.keytab
В Ubuntu Server утилита klist является частью пакета krb5-user. В CentOS/RHEL необходимо установить пакет krb5-workstation.
После запуска утилиты будут выведены все содержащиеся ключи с типом шифрования, realm и SPN, для которого создавался ключ.
-
-
Любой текстовый редактор.
Keytab-файл является бинарным, но в нем можно найти SPN и realm открытым текстом.
Изменение типа шифрования для keytab-файла
По умолчанию ключи в keytab-файле шифруются с помощью шифрования rc4-hmac.
Чтобы изменить тип шифрования, выполните следующие действия:
-
Установите свойство для служебной учетной записи в Active Directory:
- "Данная учетная запись поддерживает 128-разрядное шифрование";
- "Данная учетная запись поддерживает 256-разрядное шифрование".
-
Сгенерируйте новый keytab-файл с ключом нужного шифрования.
Для этого в команду ktpass передайте опцию /crypto AES128-SHA1 или /crypto AES256-SHA1, см. Создание SPN и keytab-файла.
Если в профиле пользователя AD включены два типа шифрования, то в команду ktpass нужно передать /crypto ALL.
- Скопируйте обновленный keytab-файл на сервер приложения. Путь до файла указан в конфигурационном файле dbaccess.properties (параметр ru.naumen.core.authentication.spnego-authenticator.keytab).
Настройка прозрачной аутентификации при доступе в приложение по разным ссылкам
Чтобы пользователи могли входить в приложение по ссылкам https://support.msk.example.com и https://sc.msk.example.com, выполните следующие действия:
- Если имена support.msk.example.com и sc.msk.example.com являются записями типа CNAME, то для работы прозрачной аутентификации дополнительной настройки не требуется.
-
Если имена support.msk.example.com и sc.msk.example.com являются записями типа A, то создайте дополнительные SPN, соответствующие DNS-именам при помощи команды setspn:
setspn -A HTTP/support.msk.example.com naumen-spnego@msk.example.com setspn -A HTTP/sc.msk.example.com naumen-spnego@msk.example.com
Изменение ссылки на приложение
Для смены ссылки на приложение добавьте новую CNAME на запись, на которую выписан SPN.
Для новой ссылки добавьте дополнительный SPN:
setspn -A HTTP/sc.msk.example.com msk.example.com\naumen-spnego
Если изменяется A-запись DNS, на которую выписан SPN, то для сохранения работы прозрачной аутентификации необходимо выполнить ряд действий. В примере рассматривается смена адреса приложения с support.msk.example.com на sc.msk.example.com (A-записи DNS)
Для сохранения работы прозрачной аутентификации при изменении ссылки на приложение, выполните следующие действия:
-
Откройте список всех SPN:
setspn -L msk.example.com\naumen-spnego
-
Удалите все существующие SPN
setspn -D HTTP/support.msk.example.com msk.example.com\naumen-spnego
(в примере SPN один):
-
Создайте новый keytab-файл:
ktpass -princ HTTP/sc.msk.example.com@MSK.EXAMPLE.COM -mapuser naumen-spnego@msk.example.com -pass myP@ssw0rd -SetPass -out c:\TEMP\naumen.keytab
-
Безопасно скопируйте новый keytab-файл на сервер приложения вместо старого. Путь до файла указан в конфигурационном файле dbaccess.properties (параметр ru.naumen.core.authentication.spnego-authenticator.keytab).
Если имя keytab-файла не изменилось, перезапуск приложения не требуется.