Статья написана в стиле "пометка что-бы не забыть", многие моменты подразумеваются известными и акцент делается на "подводные камни". В интернете по этому вопросу увы ничего не нашел, так же бьються над аналогичными проблемами ребята из 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 получается обычно с использованием команды:
- КОД: ВЫДЕЛИТЬ ВСЁ
#kinit DomainAdministrator
Enter DomainAdministrator's password: ***********
kinit: NOTICE: ticket renewable lifetime is 1 week
и в файле-кеше ключей (обычно /tmp/krb5cc_0, т.к. все делается из под рута) появляется TGT, используя который
другие службы (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
создается файл unixmachine.keytab в который пишутся ключи, которые могут быть использованы для авторизации без пароля,
используя команду на FreeBSD
- КОД: ВЫДЕЛИТЬ ВСЁ
kinit -k HOST/my_bsd_hostname@NT-DNS-REALM-NAME
Файл unixmachine.keytab требует переноса на FreeBSD и манипуляции для впихивания его в /etc/krb5.keytab - системный файл для хранения ключей
по-умолчанию. Подробности в статье [http://technet.microsoft.com/en-us/library/bb742433.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
эта команда получает ключи в файл (по умолчанию) /etc/krb5.keytab
- КОД: ВЫДЕЛИТЬ ВСЁ
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
Требования: Реализация Kerberos на FreeBSD heimdal не использует (пока что) tcp для Kerberos запросов, поэтому пользователь
DomainAdministrator должен быть в одной единственной группе (Domain Admins) и по возможности в самом верхнем OU.
Иначе будут ошибки
- КОД: ВЫДЕЛИТЬ ВСЁ
response too big for UDP, use TCP instead
Получив ключи, следует произвести некоторые магические действия с Active Directory.
В моем случае был Microsoft Windows Server 2008 Enterprise SP1, по традиции при его выпуске была допущена ошика
в реализации kerberos из-за чего при использовании
- КОД: ВЫДЕЛИТЬ ВСЁ
kinit -k HOST/my_bsd_hostname@NT-DNS-REALM-NAME
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 в домене:
- КОД: ВЫДЕЛИТЬ ВСЁ
userAccountControl = 0x411000 (4263936 decimal) [ WORKSTATION_TRUST_ACCOUNT | DONT EXPIRE PASSWD | DONT REQUIRE PREAUTH ]
После установки патча, манипуляций с объектов Computer account, представляющего FreeBSD и прописав в cron
- КОД: ВЫДЕЛИТЬ ВСЁ
0 * * * * /usr/bin/kinit --renew
* 2 * * * /usr/bin/kinit -k HOST/my_bsd_hostname@NT-DNS-REALM-NAME
получаем рабочее решение по актуальному постоянному присутствию в Kerberos Realm-e
- КОД: ВЫДЕЛИТЬ ВСЁ
# 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