Частые проблемы при настройке 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-принципала
-
Авторизуйтесь на сервере с 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
-
-
Запустите действие Manage Kerberos. Если у вас нет локальных прав администратора, то отключите флаг Set up principals and keytabs, чтобы пропустить создание принципалов и keytab-файлов. В таком случае вам нужно создать все принципалы и keytab-файлы самостоятельно.
Так, 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).
Как исправить
Удалите существующие принципалы из старого контейнера вручную. Пример, как это сделать, показан ниже.
Пример
-
Проверьте существующие принципалы во всех контейнерах домена, используя следующий фильтр:
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
-
-
Удалите существующие конфликтные принципалы. 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
-
После удаления всех сервисных принципалов из контейнера выполните действие (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)