Авторизация FreeBSD heimdal в AD используя ключи
Добавлено: 2009-05-19 11:17:26
Статья написана в стиле "пометка что-бы не забыть", многие моменты подразумеваются известными и акцент делается на "подводные камни". В интернете по этому вопросу увы ничего не нашел, так же бьються над аналогичными проблемами ребята из Juniper Networks (не подсоединяет к домену) и IBM ( не получает список пользователей).
Для того, что бы службы на FreeBSD могли получать TGS (Ticket Granting Service - тикет на доступ к службе)
от Active Directory Key Distribution Center необходимо что бы в системе FreeBSD был TGT (Ticket Granting Ticket - тикет на получение тикетов).
В стандартном варианте настройке родного Kerberos (Heimdal 0.x_чего_то_там) на FreeBSD (вплоть до версии 7.1.) используется файл
/etc/krb5.conf [man krb5.conf]
в этом файле указывается REALM (область, за которую отвечает KDC) и серверы, с которых можно спрашивать TGT и TGS.
Первоначальный TGT получается обычно с использованием команды:
и в файле-кеше ключей (обычно /tmp/krb5cc_0, т.к. все делается из под рута) появляется TGT, используя который
другие службы (pam_krb5, ldap, samba) могут обращаться к службам AD.
Для автоматизации получения ключа используются разные методы. Все они используют cron, для периодического получения/обновления ключа.
1.) Самый простой это
Метод прост, но "светит пароль" администратора, что не является хорошим тоном.
2.) Второй способ описан в статье Microsoft "Step-by-Step Guide to Kerberos 5 (krb5 1.0) Interoperability"
Заключается метод в следующем: создается пользовательский аккаунт, через который будет авторизоваться сервер.
С использованием команды из пакета Windows Resource Kit или Windows Support Tools
создается файл unixmachine.keytab в который пишутся ключи, которые могут быть использованы для авторизации без пароля,
используя команду на FreeBSD
Файл unixmachine.keytab требует переноса на FreeBSD и манипуляции для впихивания его в /etc/krb5.keytab - системный файл для хранения ключей
по-умолчанию. Подробности в статье [http://technet.microsoft.com/en-us/libr ... 42433.aspx,
Путь TechNet->TechNet Library->Windows->Windows Server->Windows Server 2000->How To... ->Step-by-Step Guide to Kerberos 5]
3.) Наиболее элегантный.
Для получения ключей используется Samba 3.xx, которая чаще всего используется в связке с Active Directory.
Метод также подразумевает получение ключей в /etc/krb5.keytab и авторизацию через
для получения ключей наобходимо использовать
эта команда получает ключи в файл (по умолчанию) /etc/krb5.keytab
Требования: Реализация Kerberos на FreeBSD heimdal не использует (пока что) tcp для Kerberos запросов, поэтому пользователь
DomainAdministrator должен быть в одной единственной группе (Domain Admins) и по возможности в самом верхнем OU.
Иначе будут ошибки
Получив ключи, следует произвести некоторые магические действия с Active Directory.
В моем случае был Microsoft Windows Server 2008 Enterprise SP1, по традиции при его выпуске была допущена ошика
в реализации kerberos из-за чего при использовании
Microsoft Windows Server 2008 всех версиий возвращает KRB5KDC_ERR_C_PRINCIPAL_UNKNOWN из-за неправильной
интерпретации косой черты ("/") в имени принципала.
Лечится это частным патчем от Microsoft [KB951191], который Microsoft почему то высылает только по запросу
на электронный адрес, да еще в придачу защифрованным паролем. (актуально на 15.05.2009)
Далее для авторизации через kinit к сожалению не используется аттрибут serivcePrincipalName объекта
типа Computer, который создается при подключении Samba к домену и чьи ключи Samba помещает в /etc/krb5.keytab.
Для того, что бы этот аккаунт использовался для авторизации необходимо сделать два вещи
а.) установить аттрибут userPrincipalName в HOST/my_bsd_hostname@NT-DNS-REALM-NAME (по умолчанию он пуст для объекта Computer)
б.) установить отметку "Без предварительной проверки Kerberos". Это легче сказать чем сделать, т.к. диалоговое окно для таких
манипуляций доступно только для объектов типа User. Отметка это лишь бит в целом числе, поэтому...
Я использовал ADSI Edit (входит в поставку Windows Server 2008) для правки аттрибута userAccountControl объекта типа Computer, представляющего
FreeBSD в домене:
После установки патча, манипуляций с объектов Computer account, представляющего FreeBSD и прописав в cron
получаем рабочее решение по актуальному постоянному присутствию в Kerberos Realm-e
Для того, что бы службы на FreeBSD могли получать TGS (Ticket Granting Service - тикет на доступ к службе)
от Active Directory Key Distribution Center необходимо что бы в системе FreeBSD был TGT (Ticket Granting Ticket - тикет на получение тикетов).
В стандартном варианте настройке родного Kerberos (Heimdal 0.x_чего_то_там) на FreeBSD (вплоть до версии 7.1.) используется файл
/etc/krb5.conf [man krb5.conf]
в этом файле указывается REALM (область, за которую отвечает KDC) и серверы, с которых можно спрашивать TGT и TGS.
Первоначальный TGT получается обычно с использованием команды:
Код: Выделить всё
#kinit DomainAdministrator
Enter DomainAdministrator's password: ***********
kinit: NOTICE: ticket renewable lifetime is 1 week
другие службы (pam_krb5, ldap, samba) могут обращаться к службам AD.
Для автоматизации получения ключа используются разные методы. Все они используют cron, для периодического получения/обновления ключа.
1.) Самый простой это
Код: Выделить всё
echo MyPassword | kinit DomainAdministrator
2.) Второй способ описан в статье Microsoft "Step-by-Step Guide to Kerberos 5 (krb5 1.0) Interoperability"
Заключается метод в следующем: создается пользовательский аккаунт, через который будет авторизоваться сервер.
С использованием команды из пакета Windows Resource Kit или Windows Support Tools
Код: Выделить всё
C:>Ktpass.exe -princ HOST/my_bsd_hostname@NT-DNS-REALM-NAME -mapuser user_account_for_bsd -pass account_password_for_bsd -out unixmachine.keytab
используя команду на FreeBSD
Код: Выделить всё
kinit -k HOST/my_bsd_hostname@NT-DNS-REALM-NAME
по-умолчанию. Подробности в статье [http://technet.microsoft.com/en-us/libr ... 42433.aspx,
Путь TechNet->TechNet Library->Windows->Windows Server->Windows Server 2000->How To... ->Step-by-Step Guide to Kerberos 5]
3.) Наиболее элегантный.
Для получения ключей используется Samba 3.xx, которая чаще всего используется в связке с Active Directory.
Метод также подразумевает получение ключей в /etc/krb5.keytab и авторизацию через
Код: Выделить всё
kinit -k
Код: Выделить всё
net -U DomainAdministrator net ads keytab ADD HOST
Код: Выделить всё
Vno Type Principal
5 des-cbc-crc HOST/my_bsd_hostname@NT-DNS-REALM-NAME
5 des-cbc-md5 HOST/my_bsd_hostname@NT-DNS-REALM-NAME
5 arcfour-hmac-md5 HOST/my_bsd_hostname@NT-DNS-REALM-NAME
DomainAdministrator должен быть в одной единственной группе (Domain Admins) и по возможности в самом верхнем OU.
Иначе будут ошибки
Код: Выделить всё
response too big for UDP, use TCP instead
В моем случае был Microsoft Windows Server 2008 Enterprise SP1, по традиции при его выпуске была допущена ошика
в реализации kerberos из-за чего при использовании
Код: Выделить всё
kinit -k HOST/my_bsd_hostname@NT-DNS-REALM-NAME
интерпретации косой черты ("/") в имени принципала.
Лечится это частным патчем от Microsoft [KB951191], который Microsoft почему то высылает только по запросу
на электронный адрес, да еще в придачу защифрованным паролем. (актуально на 15.05.2009)
Далее для авторизации через kinit к сожалению не используется аттрибут serivcePrincipalName объекта
типа Computer, который создается при подключении Samba к домену и чьи ключи Samba помещает в /etc/krb5.keytab.
Для того, что бы этот аккаунт использовался для авторизации необходимо сделать два вещи
а.) установить аттрибут userPrincipalName в HOST/my_bsd_hostname@NT-DNS-REALM-NAME (по умолчанию он пуст для объекта Computer)
б.) установить отметку "Без предварительной проверки Kerberos". Это легче сказать чем сделать, т.к. диалоговое окно для таких
манипуляций доступно только для объектов типа User. Отметка это лишь бит в целом числе, поэтому...
Я использовал ADSI Edit (входит в поставку Windows Server 2008) для правки аттрибута userAccountControl объекта типа Computer, представляющего
FreeBSD в домене:
Код: Выделить всё
userAccountControl = 0x411000 (4263936 decimal) [ WORKSTATION_TRUST_ACCOUNT | DONT EXPIRE PASSWD | DONT REQUIRE PREAUTH ]
Код: Выделить всё
0 * * * * /usr/bin/kinit --renew
* 2 * * * /usr/bin/kinit -k HOST/my_bsd_hostname@NT-DNS-REALM-NAME
Код: Выделить всё
# klist -vf
Credentials cache: FILE:/tmp/krb5cc_0
Principal: HOST/my_bsd_hostname@NT-DNS-REALM-NAME
Cache version: 4
Server: krbtgt/NT-DNS-REALM-NAME@NT-DNS-REALM-NAME
Ticket etype: arcfour-hmac-md5, kvno 2
Auth time: May 19 11:10:22 2009
End time: May 19 21:10:22 2009
Renew till: May 26 11:10:22 2009
Ticket flags: forwardable, renewable, initial