Многие сервисы Linux (apache, nginx и др.) могут использовать keytab файлы для Kerberos аутентификации в Active Directory без ввода пароля. В keytab файле хранятся имена принципалов Kerberos и соответствующие им зашифрованные ключи (ключи получаются из паролей Kerberos). В этой статье мы покажем, как создать keytab файл для SPN связанной учетной записи Active Directory с помощью утилит ktpass.
Чаще всего для службы, которая требует использование keytab файла создается отдельная учетная запись пользователя ActiveDirectory (но можно использовать и объект компьютера), затем к ней привязывается имя сервиса (ServicePrincipalName — SPN). SPN используется аутентификацией Kerberos для сопоставления экземпляра сервиса с учетной записью в AD (благодаря этому приложения могут аутентифицироваться в качестве сервиса даже не зная имени пользователя).
Сначала создайте сервисную учетную запись в AD и задайте ей известный пароль. Можно создать учетную запись из графической консоли ADUC или с помощью PowerShell командлета New-ADUser (из модуля PowerShell для Active Directory):
New-ADUser -Name "web" -GivenName "nginx web app" -SamAccountName "web" -UserPrincipalName "[email protected]" -Path "OU=Services,OU=SPB,DC=test,DC=com" –AccountPassword (ConvertTo-SecureString “Bergam0ttapoK” -AsPlainText -force) -Enabled $true
Включите для сервисной учетной записи опции “User cannot change password” и “Password never expires“ через графическую консоль или PowerShell:
Get-ADUser web | Set-ADUser -PasswordNeverExpires:$True -CannotChangePassword:$true
Следующий шаг – привязка имени сервиса (SPN) к учетной записи пользователя. Этот шаг делать отдельно не обязательно, т.к. его автоматически выполняет утилита ktpass при создании keytab файла (я оставлю этот шаг здесь для общего понимания процесса).
Привяжите следующую SPN запись к учетной записи web:
setspn -A HTTP/[email protected] web
Выведите список SPN записей, привязанных к пользователю:
setspn -L web
Чтобы создать keytab файл используется следующая команда:
ktpass -princ HTTP/[email protected] -mapuser web -crypto ALL -ptype KRB5_NT_PRINCIPAL -pass Bergam0ttapoK -target dc01.test.com -out c:\ps\web_host.keytab
Successfully mapped HTTP/www.test.com to web. Password successfully set! Key created. Key created. Key created. Key created. Key created. Output keytab to c:\ps\web_host.keytab: Keytab version: 0x502 keysize 53 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x1 (DES-CBC-CRC) keylength 8 (0x73f868856e046449) keysize 53 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x3 (DES-CBC-MD5) keylength 8 (0x73f868856e046449) keysize 61 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x17 (RC4-HMAC) keylength 16 (0x9365b81e20c6137186d956c06ade2e77) keysize 77 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x12 (AES256-SHA1) keylength 32 (0x16b6c95e8047e7e70b1dc3cd502353df 5eeab2c24d4097c41165b0ca65b9b31f) keysize 61 HTTP/[email protected] ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x11 (AES128-SHA1) keylength 16 (0x72c8b1cde771e59b6f1bc6501d614e32)
Данная команда создала keytab файл (c:\ps\web_host.keytab) для SPN записи сервиса HTTP/[email protected]. При этом SPN запись привязывается к учетной записи web с указанным паролем.
Проверьте, что для SPN записи службы была создана успешно (если вы не создавали ее вручную):
setspn -Q */[email protected]
Видно, что SPN запись найдена (Existing SPN found!). Она привязана к учетной записи web,
В Windows нет встроенных средств для просмотра содержимого keytab файла. Но если, у вас а компьютере установлена версия Java JRE, вы можете воспользоваться утилитой klist.exe, которая входит в комплект java.
cd "c:\Program Files\Java\jre1.8.0_181\bin"
klist.exe -K -e -t -k c:\PS\web_host.keytab
Key tab: c:\PS\web_host.keytab, 5 entries found.
Посмотрим на содержимое key-tab файла. Здесь хранятся имена SPN, ключи, временные метки, алгоритм шифрование и версия ключа (KVNO — key version number).
При создании keytab файла утилита ktpass увеличивает значение атрибута msDS-KeyVersionNumber учетной записи (можно посмотреть в редакторе атрибутов AD) и использует это значение в качестве номера KVNO в keytab таблице.
При смене пароля учетной записи значение этого атрибута увеличивается на единицу, при этом все keytab записи с предыдущим номером KVNO становятся невалидными (даже если старый и новый пароли совпадают). Если пароль пользователя в AD изменится, то keytab-файл придется сгенерировать заново.
В одном keytab файле могут хранится ключи нескольких SPN. Дополнительные имена SPN и ключи добавляются в keytab файл с помощью отдельных параметров утилиты ktpass (-in, -setupn, -setpass).
Дальнейшее использование полученного keytab файла зависит от конкретного сервиса, где он применяется. Например, здесь можно посмотреть особенности использования keytab-файла для прозрачной SSO аутентификации пользователей в системе мониторинга Zabbix. Также не забывайте о необходимости обеспечения безопасности keytab файлов (все, кто могут прочитать содержимое keytab смогут воспользоваться любыми ключами из него).
Добрый день. Спасибо большое за статью.
Если вдруг знаете, можете подсказать по такому вопросу:
На контроллере отключены некоторые алгоритмы шифрования (ИБ посчитали их ненадежными) и после создания keytab файла и загрузке его на прокси сервер не проходит его проверка. При включении всех алгоритмов на контроллере, все проверки проходят.
Можно ли создать keytab файл с определенными алгоритмами или как сделать так, чтобы эта проверка прошла?
У ktpass есть параметр:
[/crypto {DES-CBC-CRC|DES-CBC-MD5|RC4-HMAC-NT|AES256-SHA1|AES128-SHA1|All}]
Функция «-CannotChangePassword:$true» не нужна, так как ktpass сам всё-равно её разблокирует.
И лучше, с точки зрения безопасности указывать в ktpass не фиксированный пароль, а позволить ему создать рандомный через «ktpass +rndpass -minpass XX»
Добрый день!
Прошу исправить маленькую, но очень досадную ошибку во фрагменте с » -princ HTTP/[email protected]» верно указан верхний регистр домена, а вот дальше команда и результат вывода уже показан домен в нижнем регистре. Из-за этого в линуксе данный keytab не будет функционировать.
Т.е. команда правильная, а скриншоты нет?
Здравствуйте
Что может означать запись после выполнения команды ktpass:
Failed to set property ‘userPrincipalName’ to ‘user/[email protected]’ on Dn ‘CN=user1,OU=USERS,DC=domen,DC=org’ : 0x13
Warning: Failed to set UPN user/[email protected] on CN=user1,OU=USERS,DC=domen,DC=org.
kinits to ‘user/[email protected]’ will fail.
имена для примера выбраны непонятно, зачем два раза test.com ?
Добрый день, почему при проверке keytab файла через утилиту klist.exe Time stamp: Jan 01, 1970 05:00:00 а не текущая дата создания файла?