Создание SPN и keytab-файла для сервисной учетной записи в домене под управлением AD

Service Principal Name (SPN) и keytab-файл используются для аутентификации по протоколу Kerberos.

Service Principal Name (SPN) или имя принципала — это уникальное имя сервиса, которое привязывается к учетной записи сервиса в домене Microsoft Active Directory. SPN используется для идентификации сервиса, к которому пользователи хотят получить доступ.

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

Перед началом работы убедитесь, что выполнены предварительные условия:

  1. Active Directory установлен и настроен. Определено имя домена, например, DEMO.OSMAX.INNO.TECH.

  2. Определены имена хостов отдельно для каждого из модулей, например:

    1. «Кабинет администратора» — admin-console.osmax.mycompany.com.

    2. «Магазин приложений» — application-shop.osmax.mycompany.com.

Ниже приведен пример создания SPN (Service Principal Name) и keytab-файла для сервисной учетной записи в домене под управлением Active Directory. Все команды выполняются в PowerShell из под учетной записи с правами администратора домена.

Создание и настройка технической учетной записи

Предварительная настройка домена Active Directory

В актуальных версиях JDK (17 или выше) не поддерживается старый тип шифрования RC4_HMAC_MD5. Чтобы его отключить, выполните действия:

  1. Перейдите в Control Panel > Administrative tools > Local Security Policy.

  2. В открывшемся окне перейдите в раздел Local Policies > Security Options и измените значение параметра Network security: Configure encryption types allowed for Kerberos.

  3. В отображаемом списке протоколов шифрования отключите устаревший RC4_HMAC_MD5 и включите остальные.

    1

Создание технической учетной записи

Создаваемая техническая учетная запись должна входить в группу Domain Users.

Чтобы создать техническую учетную запись, выполните действия:

  1. Перейдите в Control Panel > Administrative tools > Active Directory Users and Computers.

  2. В требуемой директории домена создайте нового пользователя с определенным именем (например, osmax_backend_svc).

    Для созданной учетной записи рекомендуется задать постоянный пароль и отключить истечение его срока действия.
  3. В свойствах созданной учетной записи на вкладке Account активируйте опции This account supports Kerberos AES 128 bit encryption и This account supports Kerberos AES 256 bit encryption.

    2

Создание Service Principal Name (SPN) для технической учетной записи

Подробное описание особенностей SPN см. в официальной документации.

Для созданной технической учетной записи необходимо создать несколько SPN:

  1. Arbitrary SPN — уникальный идентификатор, который назначается целевому сервису (в данном случае osmax-core). Например: OSMAX/core. Этот SPN будет использоваться в настройках модуля osmax-core (см. файл application.properties).

  2. Host SPN для модулей «Кабинет администратора» и «Магазин приложений». Пример значений:

    1. HTTP/admin-console.osmax.mycompany.com.

    2. 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 :
3. Создани

Создание keytab-файла

Чтобы создать keytab-файл, выполните команду:

ktpass -princ <ServiceClass>/<ServiceName>@<DomainName> -mapuser <ServiceAccount> -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 -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-файле можно уточнить командой в следующем разделе:

3

Команды для просмотра содержимого 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, используйте утилиту klist.exe, которая входит в комплект программного продукта.

Например:

"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