Kerberos - Настройка доменной авторизации для одного домена

Настройка файлов конфигурации AD


1. В домене создать технического системного пользователя и добавить spn для него, например:
Логин:        doczilla
Пароль: doczPswd! 

описание команды: 

https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/cc731241(v=ws.11)
пример команды:

setspn -A HTTP/doczilla.testdomain.local  doczilla

2. Создать krb5.keytab файл, с параметрами созданного системного пользователя.

описание команды:  https://docs.microsoft.com/en-us/windows-server/administration/windows-commands/ktpass

пример команды, верхний и нижний регистр очень важен:

ktpass -princ HTTP/doczilla.testdomain.local@TESTDOMAIN.LOCAL -mapuser doczilla@testdomain.local -crypto ALL -ptype KRB5_NT_PRINCIPAL -pass doczPswd! -out krb5.keytab

Если используется шифрование AES256-SHA1

Необходимо в Свойствах системной учетной записи в AD поставить галку «Поддержка Kerberos AES 256»



3. В папке проекта по пути ./conf/spnego/ доступны шаблоны конфигурационных файлов:

  • jaas.conf
  • krb5.ini

их нужно или вынести за пределы проекта (по умолчанию в /opt/doczilla/conf/spnego/), или при обновлении проекта шаблоны файлов не перезаписывать.

4. Файл krb5.keytab полученный в п.2 скопировать в папку (по умолчанию в /opt/doczilla/conf/spnego/) с файлами конфигурации из п.3

5. Скопированные файлы из п.3 отредактировать согласно комментариям внутри файлов

6. В файле проекта, путь по умолчанию /opt/doczilla/bin/service.sh 

- Раскомментируйте для включения расширенных логов для отладки, режим доменной авторизации и замените наименование домена, в переменной (обязательно Большими Буквами):

DEBUG="true"

SSO="SPNEGO"

DOMAIN="TESTDOMAIN.LOCAL"

- замените значения переменных приведенных ниже, если файлы конфигов перенесли:

JAVA_OPTS="$JAVA_OPTS -Djava.security.krb5.conf=$HOME/conf/spnego/krb5.ini"
JAVA_OPTS="$JAVA_OPTS -Djava.security.auth.login.config=$HOME/conf/spnego/jaas.conf"

- проверить и посмотреть содержимое файла ”krb5.keytab”

klist -kte  krb5.keytab

## или командами
ktutil ktutil: read_kt krb5.keytab ktutil: list

7. Настройка доверенной зоны

Для работы доменной авторизации Windows должен учитывать, что запрошенный URL-адрес находится в Местной интрасети (локальной).

описание:  https://docs.microsoft.com/en-us/troubleshoot/browsers/prompt-for-username-and-password

Запустите "Панель управления" - "Свойства браузера" - вкладка "Безопасность" - "Местная интрасеть" - кнопка "Сайты" - кнопка "Дополнительно" - добавить в зону сайт приложения - кнопка "Добавить" - "Закрыть"


Содержимое шаблонов


jaas.conf:

/**
replace principal with "HTTP/<doczilla-address>@<DOMAIN-REALM>"
replace keyTab path if different
*/

com.sun.security.jgss.initiate {
    com.sun.security.auth.module.Krb5LoginModule required
    principal="HTTP/doczilla.testdomain.local@TESTDOMAIN.LOCAL"
    keyTab="/opt/doczilla/conf/spnego/krb5.keytab"
    useKeyTab=true
    storeKey=true
    debug=true
    isInitiator=false;
};

com.sun.security.jgss.accept {
    com.sun.security.auth.module.Krb5LoginModule required
    principal="HTTP/doczilla.testdomain.local@TESTDOMAIN.LOCAL"
    useKeyTab=true
    keyTab="/opt/doczilla/conf/spnego/krb5.keytab"
    storeKey=true
    debug=true
    isInitiator=false;
};

krb5.ini:

# replace default_realm
# replace default_keytab_name if different

[libdefaults]
default_realm = TESTDOMAIN.LOCAL
default_keytab_name = FILE:/opt/doczilla/conf/spnego/krb5.keytab
permitted_enctypes = aes128-cts aes256-cts arcfour-hmac-md5
default_tgs_enctypes = aes128-cts aes256-cts arcfour-hmac-md5
default_tkt_enctypes = aes128-cts aes256-cts arcfour-hmac-md5

# replace. kdc - Key distribution center
[realms]
TESTDOMAIN.LOCAL = {
   kdc = testdomain.local
   admin_server = testdomain.local
   default_domain = testdomain.local
}

# replace
[domain_realm]
.testdomain.local = TESTDOMAIN.LOCAL

[appdefaults]
autologin = true
forwardable = true


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

1. Ошибка Password set failed!

При выполнении утилиты ktpass можно получить следующую ошибку Password set failed! 0x00000020

- Данная ошибка возникает в том случае, если используемый при генерации keytab файла технический пользователь содержит в своем DN-пути не латинские символы - например, кириллицу. Единственным верным решением будет перенести данного пользователя в расположение с латинскими символами - например, в стандартный контейнер Users. По завершению генерации keytab файла, пользователя можно будет вернуть на его прежнее место.


2. Ошибка GSSException: Invalid name provided

ERROR Z8 - SpnegoUserRealm: failed to establish GSSContext
GSSException: Invalid name provided (Mechanism level: KrbException: Cannot locate default realm)

 - не найдены файлы конфигурации или файл keytab, необходимо проверить пути в конфигурационных файлах


3. Ошибка GSSException: No valid credentials provided

ERROR Z8 - SpnegoUserRealm: failed to establish GSSContext
GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos credentials)

- учетные данные логин/пароль в keytab файле, не найдены или не совпадают с учетной записью в домене


4. Ошибка GSSException: Failure unspecified at GSS-API level

ERROR Z8 - SpnegoUserRealm: failed to establish GSSContext
GSSException: Failure unspecified at GSS-API level (Mechanism level: Invalid argument (400) - Cannot find key of appropriate type to decrypt AP REP - AES256 CTS mode with HMAC SHA1-96)
Caused by: KrbException: Invalid argument (400) - Cannot find key of appropriate type to decrypt AP REP - AES256 CTS mode with HMAC SHA1-96

- ошибка возникает когда не совпадает используемое шифрование, например, в доменной учетной записи включено шифрование AES 256, а keytab сформировали  RC4-HMAC-NT


5. Ошибка GSSException: Defective token detected

ERROR Z8 - SpnegoUserRealm: failed to establish GSSContext
GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)

- необходимо проверить, добавлен сайт в Местную интрасеть?
- необходимо включить журнал Kerberos у пользователя на Windows или на контролере домена, для диагностирования ошибок

 ошибка KDC_ERR_S_PRINCIPAL_UNKNOWN

- отсутствующие или дублирующиеся SPNs, зарегистрированные в AD.
- неправильные имена серверов или Суффиксы DNS, используемые клиентом, например, клиент гонится за записями DNS CNAME и использует итоговую запись A в SPNs.
- использование имен серверов, не использующих FQDN, которые необходимо разрешить через границы леса AD.

 ошибка KRB_AP_ERR_MODIFIED

- когда SPN задается на неправильной учетной записи, и не совпадает с учетной записью, с которой работает сервер.
- пароль между KDC, выпускающим билет, и сервером, на который размещена служба, не синхронизирован.

 

Включить ведение журнала событий Kerberos на клиенте (Win7SP1 / Srv2012R2 и выше)
https://docs.microsoft.com/ru-ru/troubleshoot/windows-server/identity/enable-kerberos-event-logging

HKLM\SYSTEM\CurrentControlSet\Control\Lsa\Kerberos\Parameters
Значение реестра: LogLevel
Тип значения: REG_DWORD
Данные значения: 0x1 (отключить: 0x0)

Перезагрузка компьютера не требуется.

Пуск - Панель управления - Средства Администрирования Windows - Просмотр событий - Журналы Windows