вторник, 30 октября 2012 г.

Kerberos автоматическое обновление билетика

Наработки и интересные статейки ... каша в общем:


Почем не отрабатывает команда "kinit --renew"

Источник: http://forum.lissyara.su/viewtopic.php?f=53&t=36884#p328801


Непрочитанное сообщение sudo » 2012-06-16 7:45:37
_skeletor писал(а):
sudo писал(а):
КОД: ВЫДЕЛИТЬ ВСЁ
*    */1       *       *       *       root    /usr/bin/kinit --renew > /dev/null 2>&1  

Не подойдёт, так как kinit требует введения пароля, что в использовании Cron невозможно.


У меня китайская FreeBSD, в ней все возможно.

Билет просрочен как видим еще в мае...
КОД: ВЫДЕЛИТЬ ВСЁ
[8:04 root@srv12]# klist
Credentials cache: FILE:/tmp/krb5cc_0
        Principal: ALEX@DOMAIN.LOCAL

  Issued           Expires        Principal
May 11 09:49:51  >>>Expired<<<  krbtgt/DOMAIN.LOCAL@DOMAIN.LOCAL


Вводим тупо. Не дает обновиться...

Оно и понятно почему - потому, что хоть иногда надо читать маны.

-R, --renew
Try to renew ticket. The ticket must have the `renewable' flag
set, and must not be expired.



КОД: ВЫДЕЛИТЬ ВСЁ
[8:12 root@srv12]# kinit --renew
kinit: krb5_get_kdc_cred: KDC can't fulfill requested option


Возьмем новый билет и ставим флаг

КОД: ВЫДЕЛИТЬ ВСЁ
[8:10 root@srv12]# kinit -p ALEX
ALEX@DOMAIN.LOCAL's Password: 
[8:10 root@srv12]# klist
Credentials cache: FILE:/tmp/krb5cc_0
        Principal: ALEX@DOMAIN.LOCAL

  Issued           Expires          Principal
Jun 16 08:10:41  Jun 16 18:10:41  krbtgt/DOMAIN.LOCAL@DOMAIN.LOCAL
[8:12 root@srv12]# kinit --renewable
ALEX@DOMAIN.LOCAL's Password:


Обновим билет пару раз для наглядности (прошу заметить, что никаких паролей не требуется)

КОД: ВЫДЕЛИТЬ ВСЁ
[8:13 root@srv12]# kinit --renew
[8:13 root@srv12]# klist
Credentials cache: FILE:/tmp/krb5cc_0
        Principal: ALEX@DOMAIN.LOCAL

  Issued           Expires          Principal
Jun 16 08:13:23  Jun 16 18:13:23  krbtgt/DOMAIN.LOCAL@DOMAIN.LOCAL
[8:21 root@srv12]# kinit --renew
[8:21 root@srv12]# klist
Credentials cache: FILE:/tmp/krb5cc_0
        Principal: ALEX@DOMAIN.LOCAL

  Issued           Expires          Principal
Jun 16 08:21:11  Jun 16 18:21:11  krbtgt/DOMAIN.LOCAL@DOMAIN.LOCAL



Особое внимание прошу обратить на время выдачи билетов и их время жизни. Кто сказал, что невозможно ?

Вы бы лучше другую мою ошибку заметили, что написав команду под рутом crontab -e в конфигурации cron'a я указал root, что возможно только при правке системного crontab :smile:




Авторизация FreeBSD heimdal в AD используя ключи. (Согласен с автором ... 3 вариант самый оптимальный, но FreeNAS после ребута не хотел принимать старый билетик и приходилось опять же ручками получать новый)


Непрочитанное сообщение infrasty » 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 получается обычно с использованием команды:
КОД: ВЫДЕЛИТЬ ВСЁ
#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





Мои наработки: 

В вебке нужно запустить и залогиниться в AD (В "Управлении службами" в вебадминке настроить службу "Active Directory" и запустить ее) иначе в файлик /etc/kb5.conf не прописывается параметры "kdc = out;" и " admin_server = out;"  ==> ЭТА ОШИБКА ИСПРАВЛЕНА В FreeNAS 8.3.0 <==

Получаем билетики прям с АД-шки
# net -U storage-adm ads keytab ADD HOST

Авторизуемся с помощью этих билетиков
# kinit -k HOST/storage@DOMAIN

Забираем оба файлика /etc/krb5.conf и /etc/krb5.keytab и кладем куданить в другое место (где они не перезатрутся)


Автоматизация ... самая банальная ... создадим скрипт:

#!/bin/bash
cp -fr /mnt/zpool_data/data_domain/krb5.* /etc/
cp -fr /mnt/zpool_data/data_domain/krb5cc_0 /tmp/krb5cc_0
chown root:wheel /etc/krb5.*
chown root:wheel /tmp/krb5cc_0
chmod 600 /tmp/krb5cc_0
chmod 644 /etc/krb5.conf
chmod 600 /etc/krb5.keytab

kinit --renewable -k HOST/storage@DOMAIN

cp -fr /etc/krb5.* /mnt/zpool_data/data_domain/
cp -fr /tmp/krb5cc_0 /mnt/zpool_data/data_domain/


Моя строчка в CRONTAB (это все лучше запихнуть в отдельный скрипт и кинуть хотяпы в папку с ограниченным доступом ... т. к. здесь пароль в открытом виде получается):

cp -fr /mnt/zpool_data/data_domain/krb5.conf /etc/ ; chmod 644 /etc/krb5.conf ; echo YOUR_PASSWORD > /tmp/storage-adm.pwd ; kinit --password-file=/tmp/storage-adm.pwd storage-adm@DOMAIN ; rm -fr /tmp/storage-adm.pwd


Полезные команды:

# kdestroy - удалить полученные билетики (просмотреть их можно командой "klist")

ktutil - просмотр редактирование *.keytab файликов (с помощью них можно организовать получение билетиков без пароля).
Основные ее полезные применения: 
# ktutil list - просмотр основного krb5.keytab (с помощью доп параметра можно просмотреть keytab находящийся в любом месте в системе)
С помощью "ktutil copy" можно производить слияние нескольких ketab-ов к примеру в основной krb5.keytab:
ktutil copy mykeytab-1 krb5.keytab
ktutil copy mykeytab-2 krb5.keytab
ktutil copy mykeytab-3 krb5.keytab