Частые проблемы при настройке AD Kerberos

В данной статье описаны частые проблемы, возникающие при настройке AD Kerberos, а также способы их решения. Для удобства работы и визуализации структур LDAP-сервера можно использовать Apache Directory Studio либо иной аналогичный инструмент.

ПРИМЕЧАНИЕ
В этой статье термин контейнер означает запись LDAP, которая является base DN (search base) для сервисных принципалов текущего пользователя. Такая запись может содержать Organsation Unit (OU) и другие элементы DIT, а ее значение используется в поле Container DN при выполнении операции Manage Kerberos.

Некоторые известные кейсы с возможными решениями приведены ниже.

Ошибка создания HTTP-принципала на хосте в домене AD

 
Такая ошибка возникает в процессе включения Kerberos, если на хосте AD установлено обновление KB5008382 и хосты кластера находятся в одном домене с хостом AD. Ниже представлен пример сообщения о данной ошибке.

######################## STDOUT ########################
adding new entry "CN=HTTP/dl-dev-h3-kdc.adp.local,OU=svc,OU=EIAP,DC=adp,DC=local"

######################## STDERR ########################
ldap_add: Constraint violation (19)
	additional info: 000021C7: AtrErr: DSID-03200E89, #1:
	0: 000021C7: DSID-03200E89, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 90303 (servicePrincipalName)

Как исправить

Существует два решения:

  • Удалить хосты из домена AD, провести керберизацию, а потом вернуть хосты.

  • Создать HTTP-принципал с правами администратора AD перед керберизацией.

Создание HTTP-принципала

  1. Авторизуйтесь на сервере с AD как администратор AD с правами на управление хостами AD. Это можно сделать двумя способами:

    • Подключитесь к Windows-серверу с AD и перейдите в раздел AD Users and Computers. Создайте принципал HTTP/<fqdn>@<realm> для каждого хоста.

    • Подготовьте среду (см. Полезная информация), затем подключитесь через консоль с помощью ldap-клиента и запустите следующую команду:

      ldapadd -H "ldaps://kru-win-new.fresh.com" -x -D administrator@FRESH.COM -w "mypassword" -f adduser.ldif

      Пример конфигурационного файла adduser.ldif представлен ниже.

      DN: CN=HTTP/kru-test-adps.ru-central1.internal,OU=Hadoop,DC=fresh,DC=com
      changetype: add
      objectClass: top
      objectClass: person
      objectClass: organizationalPerson
      objectClass: user
      accountExpires: 0
      userPrincipalName: HTTP/kru-test-adps.ru-central1.internal@FRESH.COM
      servicePrincipalName: HTTP/kru-test-adps.ru-central1.internal
      distinguishedName: CN=HTTP/kru-test-adps.ru-central1.internal,OU=Hadoop,DC=fresh,DC=com
      userAccountControl: 514
  2. Запустите действие Manage Kerberos. Если у вас нет локальных прав администратора, то отключите флаг Set up principals and keytabs, чтобы пропустить создание принципалов и keytab-файлов. В таком случае вам нужно создать все принципалы и keytab-файлы самостоятельно.

Полезная информация

 

  • Для подготовки среды Kerberos на хосте вы можете установить ldap-клиент со всеми настройками кластера используя Manage Kerberos со включенной опцией Custom kerberization settings и установленными флагами Setup Kerberos Clients и Cluster configuration.

    ad http constraint 1
    Customize action
  • Важно разместить HTTP-принципал в той же директории, которая указана в поле Container DN в окне, открывающемся при запуске Manage Kerberos, так как локальный администратор должен иметь права на управление принципалом.

Так, Kerberos будет включен с использованием существующего HTTP-принципала. Пароль принципала будет сгенерирован, а keytab-файл будет записан на все хосты.

Принципал уже существует, но в другом контейнере

 

ADCM не может выполнять поиск/удаление/создание сервисных принципалов в контейнерах, если имя контейнера отличается от значения Container DN, указанного при включении/отключении Kerberos. Поскольку текущий администратор может не иметь прав на весь домен AD, такие принципалы, существующие в разных контейнерах с одинаковыми именами, приводят к конфликту:

######################## STDERR ########################
ldap_add: Constraint violation (19)
    additional info: 000021C8: AtrErr: DSID-03200BE8, #1:
    0: 000021C8: DSID-03200BE8, problem 1005 (CONSTRAINT_ATT_TYPE), data 0, Att 90290 (userPrincipalName).

Как исправить

Удалите существующие принципалы из старого контейнера вручную. Пример, как это сделать, показан ниже.

Пример

  1. Проверьте существующие принципалы во всех контейнерах домена, используя следующий фильтр:

    ldapsearch -H ldap://{ldap-server-url} -o ldif-wrap=no -x -W -D 'cn=userA,ou=kerberos,ou=adh,dc=foo,dc=bar' -b 'dc=foo,dc=bar' name={principal-name} | grep dn

    Где:

    • -b 'dc=foo,dc=bar' состоит из частей доменного имени (например, 'dc=com,dc=hostname'), соответствующего Kerberos REALM.

    • -o ldif-wrap=no отключает перенос строк (results wrapping) для результатов ldapsearch. Если не указывать параметр, результаты ldapsearch могут быть обрезаны и grep не найдет полное значение DN, необходимое для удаления принципала.

    Вызов ldapsearch возвращает Container DN(s), например:

    # Пример 1:
    dn: CN=hdfs/test-principal-name.ru-central1.internal,OU=e_ivanov_krb1_ou,OU=kerberos,OU=adh,DC=ad,DC=ranger-test
    
    # Пример 2:
    dn: CN=del_me,CN=Users,DC=adh-sec,DC=com
  2. Удалите существующие конфликтные принципалы. ADCM пересоздаст принципалы с актуальным значением Container DN. Например:

    ldapdelete -H ldap://<ldap-server-url> -x -W -D 'cn=userA,ou=kerberos,ou=adh,dc=ad,dc=ranger-test' CN=hive/test-principal-name2.ru-central1.internal,OU=userB,OU=kerberos,OU=adh,DC=ad,DC=ranger-test
  3. После удаления всех сервисных принципалов из контейнера выполните действие (Re)Enable Kerberos. Действие должно выполниться без конфликтов.

У администратора нет прав на base_dn в кастомном ldap.conf

 
В этом случае при расширении компонента (expand) на новый хост или при добавлении новых сервисов возможна следующая ошибка:

<timestamp> DEBUG adcm_check ansible adcm_check: title: Hdfs-Datanode: Add principal, title: <principal-name>, message:######################## STDOUT ########################

######################## STDERR ########################
ldap_sasl_bind(SIMPLE): Can't contact LDAP server (-1)

Как исправить

Проверьте, соответствует ли base_dn в файле ldap.conf актуальному значению Container DN для текущего пользователя. Если это не так, измените base_dn в файле ldap.conf или выполните действие Re-enable Kerberos с корректным значением Container DN.

Нашли ошибку? Выделите текст и нажмите Ctrl+Enter чтобы сообщить о ней