Создание SPN и keytab-файла для сервисной учетной записи в домене под управлением AD
Service Principal Name (SPN) и keytab-файл используются для аутентификации по протоколу Kerberos.
Service Principal Name (SPN) или имя принципала — это уникальное имя сервиса, которое привязывается к учетной записи сервиса в домене Microsoft Active Directory. SPN используется для идентификации сервиса, к которому пользователи хотят получить доступ.
Keytab-файл содержит пары ключей и имен принципалов, которые используются для аутентификации в системе Kerberos. Этот файл обычно хранится на сервере сервиса. Когда сервис запускается, он использует информацию из keytab-файла для аутентификации в системе Kerberos без необходимости ввода пароля.
Перед началом работы убедитесь, что выполнены предварительные условия:
-
Active Directory установлен и настроен. Определено имя домена, например,
DEMO.OSMAX.INNO.TECH. -
Определены имена хостов отдельно для каждого из модулей, например:
-
«Кабинет администратора» —
admin-console.osmax.mycompany.com. -
«Магазин приложений» —
application-shop.osmax.mycompany.com.
-
Ниже приведен пример создания SPN (Service Principal Name) и keytab-файла для сервисной учетной записи в домене под управлением Active Directory. Все команды выполняются в PowerShell из под учетной записи с правами администратора домена.
Создание и настройка технической учетной записи
Предварительная настройка домена Active Directory
В актуальных версиях JDK (17 или выше) не поддерживается старый тип шифрования RC4_HMAC_MD5. Чтобы его отключить, выполните действия:
-
Перейдите в Control Panel > Administrative tools > Local Security Policy.
-
В открывшемся окне перейдите в раздел Local Policies > Security Options и измените значение параметра Network security: Configure encryption types allowed for Kerberos.
-
В отображаемом списке протоколов шифрования отключите устаревший RC4_HMAC_MD5 и включите остальные.
Создание технической учетной записи
| Создаваемая техническая учетная запись должна входить в группу Domain Users. |
Чтобы создать техническую учетную запись, выполните действия:
-
Перейдите в Control Panel > Administrative tools > Active Directory Users and Computers.
-
В требуемой директории домена создайте нового пользователя с определенным именем (например,
osmax_backend_svc).Для созданной учетной записи рекомендуется задать постоянный пароль и отключить истечение его срока действия. -
В свойствах созданной учетной записи на вкладке Account активируйте опции This account supports Kerberos AES 128 bit encryption и This account supports Kerberos AES 256 bit encryption.
Создание Service Principal Name (SPN) для технической учетной записи
| Подробное описание особенностей SPN см. в официальной документации. |
Для созданной технической учетной записи необходимо создать несколько SPN:
-
Arbitrary SPN — уникальный идентификатор, который назначается целевому сервису (в данном случае
osmax-core). Например:OSMAX/core. Этот SPN будет использоваться в настройках модуляosmax-core(см. файлapplication.properties). -
Host SPN для модулей «Кабинет администратора» и «Магазин приложений». Пример значений:
-
HTTP/admin-console.osmax.mycompany.com. -
HTTP/application-shop.osmax.mycompany.com.
-
Для создания SPN используйте команду:
setspn -A <ServiceClass>/<Host | ServiceName> <ServiceAccount>
Где:
-
<ServiceClass>— тип SPN. Опираясь на примеры выше, это могут быть:OSMAXдля Arbitrary SPN илиHTTPдля Host SPN; -
<Host>— хост одного из модулей «Кабинет администратора» и «Магазин приложений»; -
<ServiceName>— имя сервиса для Arbitrary SPN. Согласно примеру выше — этоcore; -
<ServiceAccount>— имя ранее созданной технической учетной записи. В данном случае — этоosmax_backend_svc.
Примеры:
> setspn -A OSMAX/core osmax_backend_svc Checking domain DC=demo,DC=osmax,DC=inno,DC=tech Registering ServicePrincipalNames for CN=osmax_backend_svc,CN=Users,DC=demo,DC=osmax,DC=inno,DC=tech OSMAX/core Updated object > setspn -A HTTP/admin-console.osmax.mycompany.com osmax_backend_svc Checking domain DC=demo,DC=osmax,DC=inno,DC=tech Registering ServicePrincipalNames for CN=osmax_backend_svc,CN=Users,DC=demo,DC=osmax,DC=inno,DC=tech HTTP/admin-console.osmax.mycompany.com Updated object > setspn -A HTTP/application-shop.osmax.mycompany.com osmax_backend_svc Checking domain DC=demo,DC=osmax,DC=inno,DC=tech Registering ServicePrincipalNames for CN=osmax_backend_svc,CN=Users,DC=demo,DC=osmax,DC=inno,DC=tech HTTP/application-shop.osmax.mycompany.com Updated object
Проверка созданных SPN
Чтобы посмотреть все SPN, назначенные учетной записи, выполните команду:
setspn -L <ServiceAccount>
Где <ServiceAccount> — имя ранее созданной технической учетной записи (osmax_backend_svc).
Пример выполнения команды:
> setspn -L osmax_backend_svc Registered ServicePrincipalNames for CN=osmax_backend_svc,CN=Users,DC=demo,DC=osmax,DC=inno,DC=tech: OSMAX/core HTTP/admin-console.osmax.mycompany.com HTTP/application-shop.osmax.mycompany.com
Проверка атрибутов сервисной учетной записи
Проверьте атрибуты сервисной учетной записи, выполнив команду:
get-aduser -Identity <ServiceAccount> -properties servicePrincipalName
Где <ServiceAccount> — имя ранее созданной технической учетной записи (osmax_backend_svc).
Пример выполнения команды:
> get-aduser -Identity osmax_backend_svc -properties servicePrincipalName
DistinguishedName : CN=osmax_backend_svc,CN=Users,DC=demo,DC=osmax,DC=inno,DC=tech
Enabled : True
GivenName : lcm_backend_svc
Name : lcm_backend_svc
ObjectClass : user
ObjectGUID : d903b450-e6c3-4324-9770-0236b00f83f8
SamAccountName : lcm_backend_svc
servicePrincipalName : { OSMAX/core, HTTP/admin-console.osmax.mycompany.com, HTTP/application-shop.osmax.mycompany.com }
SID : S-1-5-21-1700660301-2837393460-1517524629-1105
Surname :
Создание keytab-файла
Чтобы создать keytab-файл, выполните команду:
ktpass -princ <ServiceClass>/<ServiceName>@<DomainName> -mapuser <ServiceAccount>@<DomainName> -pass <ServiceAccountPassword> -crypto All -ptype KRB5_NT_PRINCIPAL -out <TargetPath>\<KeytabFilename>
Где:
-
<ServiceClass>/<ServiceName>— созданный ранее Arbitrary SPN (OSMAX/core); -
<DomainName>— имя домена Active Directory; -
<ServiceAccount>— имя ранее созданной технической учетной записи (osmax_backend_svc); -
<ServiceAccountPassword>— пароль технической учетной записи; -
<TargetPath>\<KeytabFilename>— полный путь генерируемого keytab-файла.
Пример выполнения команды:
> ktpass -princ OSMAX/core@DEMO.OSMAX.INNO.TECH -mapuser osmax_backend_svc@DEMO.OSMAX.INNO.TECH -pass "Qwerty123" -crypto All -ptype KRB5_NT_PRINCIPAL -out C:\temp\osmax_ad.keytab Targeting domain controller: dc-winsrv.osmax.inno.tech Using legacy password setting method Successfully mapped OSMAX/core to osmax_backend_svc. Key created. Key created. Key created. Key created. Key created. Output keytab to osmax_ad.keytab: Keytab version: 0x502 keysize 65 OSMAX/core@DEMO.OSMAX.INNO.TECH ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x1 (DES-CBC-CRC) keylength 8 (0x894ca425cb159eb0) keysize 65 OSMAX/core@DEMO.OSMAX.INNO.TECH ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x3 (DES-CBC-MD5) keylength 8 (0x894ca425cb159eb0) keysize 73 OSMAX/core@DEMO.OSMAX.INNO.TECH ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x17 (RC4-HMAC) keylength 16 (0x59fc0f884922b4ce376051134c71e22c) keysize 89 OSMAX/core@DEMO.OSMAX.INNO.TECH ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x12 (AES256-SHA1) keylength 32 (0x555027fe7864fdd549ea517ff1cff1077fb2bf83de7e6e28eeeb6ed66db556bc) keysize 73 OSMAX/core@DEMO.OSMAX.INNO.TECH ptype 1 (KRB5_NT_PRINCIPAL) vno 4 etype 0x11 (AES128-SHA1) keylength 16 (0xe8dfe5b65a4fdb3bc0c367637c5a0606)
|
При создании keytab-файла на контролере домена Active Directory в атрибутах сервисной учетной записи записывается актуальный KVNO ключей из состава keytab-файлов. Работа с ключами с устаревшей версией KVNO не поддерживается, поэтому после генерации новых keytab-файлов подключение с использованием сгенерированных ранее невозможно. Версию KVNO из ключей в keytab-файле можно уточнить командой в следующем разделе:
|
Команды для просмотра содержимого keytab-файла
Чтобы просмотреть содержимое созданного файла, выполните команду:
klist -K -e -t -k <KeytabFilename>
Пример выполнения команды:
> klist -K -e -t -k /opt/osmax-core/osmax_ad.keytab Keytab name: FILE:/opt/osmax-core/osmax_ad.keytab KVNO Timestamp Principal ---- ----------------- -------------------------------------------------------- 23 01/01/70 03:00:00 OSMAX/core@DEMO.OSMAX.INNO.TECH (DEPRECATED:des-cbc-crc) (0x16cdc11ae5f83845) 23 01/01/70 03:00:00 OSMAX/core@DEMO.OSMAX.INNO.TECH (DEPRECATED:des-cbc-md5) (0x16cdc11ae5f83845) 23 01/01/70 03:00:00 OSMAX/core@DEMO.OSMAX.INNO.TECH (DEPRECATED:arcfour-hmac) (0x59fc0f884922b4ce376051134c71e22c) 23 01/01/70 03:00:00 OSMAX/core@DEMO.OSMAX.INNO.TECH (aes256-cts-hmac-sha1-96) (0x57576e3ab78065762d6b450134367b5f40427942827129eb7bcfc679faab1443) 23 01/01/70 03:00:00 OSMAX/core@DEMO.OSMAX.INNO.TECH (aes128-cts-hmac-sha1-96) (0x8330205fcc577afc946ac1dfc2c3e7c6)
|
Windows не предоставляет встроенных средств для просмотра содержимого keytab-файла.
Однако, если у вас на компьютере установлена версия Java JRE/JDK, используйте утилиту Например: "c:\Program Files\Java\jre1.8.0_181\bin" klist.exe -K -e -t -k C:\temp\osmax_ad.keytab |
Сохраните файл на сервере, на который будет устанавливаться бэкенд продукта. Путь к файлу
необходимо будет указать на этапе его настройки. Также измените права доступа к файлу, предоставив доступ к
нему только для пользователя, от имени которого будет запускаться systemd-служба osmax.
|
Настройка модуля osmax-core для интеграции с Microsoft Active Directory
В файле application.properties задайте следующие
параметры (пример приведен с учетом используемых в документе значений):
# Имя Arbitrary SPN
quarkus.kerberos.service-principal-name=OSMAX/core
# Домен Active Directory
quarkus.kerberos.service-principal-realm=DEMO.OSMAX.INNO.TECH
# Далее нужно либо указать пароль от технической учетной записи
quarkus.kerberos.service-principal-password=Qwerty123
# Либо абсолютный путь до keytab-файла
quarkus.kerberos.keytab-path=/opt/osmax-core/osmax_ad.keytab