четверг, 12 июня 2008 г.

Инфраструктура Kerberos, рабочая станция

Рабочая станция, при включении в инфраструктуру должна осуществлять аутентификацию, через PAM, брать авторизационную информацию из источников, настроенных в /etc/nsswitch.conf, и, заодно, быть включенной в какую либо систему управления.

Самое первое, это на каждой машине установить поддержку kerberos:
aptitude install heimdal-clients
и настроить /etc/krb5.conf также, как и на KDC в первой заметке из серии (проверяем пытаясь получить билет и тп).

Для начала аутентификация. В нашем случае это, конечно же, kerberos, что как мы помним, дает нам множество неоспоримых преимуществ. Для этого ставим модули pam:
aptitude install libpam-heimdal libpam-ccreds
Модуль ccreds нам понадобится для локального кеширования пароля, на случай отсутствия связи с сервером (особенно актуально для ноутбучников). Пароль конечно не хранится в чистом виде - это хеш, что исключает его подбор в обозримом будущем, в случае кражи файла с парольным кешем.

Настройки PAM.
/etc/pam.d/common-auth

auth [success=done default=ignore] pam_unix.so nullok_secure try_first_pass
auth [authinfo_unavail=ignore success=1 default=2] pam_krb5.so use_first_pass minimum_uid=1000 forwardable debug
auth [default=done] pam_ccreds.so action=validate use_first_pass
auth [default=done] pam_ccreds.so action=store
auth [default=bad] pam_ccreds.so action=update

/etc/pam.d/common-account

account sufficient pam_krb5.so forwardable minimum_uid=1000
account required pam_unix.so use_first_pass

/etc/pam.d/common-session

session required pam_unix.so
session optional pam_foreground.so
session optional pam_krb5.so
session required pam_mkhomedir.so umask=0022 skel=/etc/skel


Теперь при входе получается билет, пароль кешируется, все замечательно. Вот только не будет работать. Вся информация о наших пользователях хранится в ldap, надо ее доставить на рабочие станции:
aptitude install libnss-ldapd libnss-db nss-updatedb
Здесь у нас опять таки помимо необходимой библиотеки идет кеширующий комплект - nss-updatedb забирает информацию из ldap и дублирует ее в локальные базы - на случай отсутствия связи с сервером. Запускать через cron или через cfengine (советую почитать - интересная вещь).

Редактируем /etc/nss-ldapd.conf:

uri ldap://kdc.realm.tld
base dc=realm,dc=tld
ldap_version 3
scope sub
use_sasl on
krb5_ccname FILE:/tmp/krb5cc_0


В /etc/nsswitch.conf, правим только эти две строки:

passwd: files ldap [NOTFOUND=return] db
group: files ldap [NOTFOUND=return] db


А так как для libnss-ldapd демона мы указали, что ему нужно получать доступ к каталогу с помощью ключа Kerberos, то надо ему этот ключ предоставить. Здесь мы возращаемся к настройке сервера.
В /etc/inetd.conf должна присутствовать строка:
kerberos-adm stream tcp nowait root /usr/lib/heimdal-servers/kadmind kadmind

В /etc/heimdal-kdc/kadmind.acl:

deepwalker/admin all

Это немного другой пользователь, добавьте его в базу kerberos. Также, я думаю, вы уже сами настроили bind и прямую и обратную зоны и время у вас на машинах сильно не различается, потому что описываться это будет несколько позже. Вернемся к рабочей станции, получаем билет:

sudo su >>> root
kinit deepwalker >>> получаем билет
ktutil get host/`hostname -f` >>> загружаем с сервера ключи для машины
kdestroy >>> теперь ключ администратора не нужен - убираем его
kinit -k host/`hostname -f` >>> получаем билет для машины
/etc/init.d/nslcd restart >>> Рестартуем демона ldapd
/etc/init.d/nscd restart >>> рестартуем nscd
exit >>> больше нам root не нужен

Теперь должно быть возможным заходить под пользователем из каталога LDAP с паролем Kerberos. Здесь я не описывал, но вообще то в каталоге надо создать предварительно контейнер, где KDC будет хранить ключи рабочей станции, что то вроде:

dn: dc=kdc.realm.tld,ou=hosts,dc=realm,dc=tld
uid: host/kdc.realm.tld
krb5PrincipalName: host/kdc.realm.tld@REALM.TLD
objectClass: top
objectClass: krb5KDCEntry
objectClass: krb5Principal
objectClass: domainRelatedObject
objectClass: dcObject
objectClass: dNSDomain
objectClass: posixAccount
associatedDomain: kdc.realm.tld
uidNumber: 5002
krb5KDCFlags: 126
dc: kdc.realm.tld
gidNumber: 5000
homeDirectory: /home/cfengine
cn: kdc.realm.tld
krb5KeyVersionNumber: 0

dn: uid=nfs,dc=kdc.realm.tld,ou=hosts,dc=realm,dc=tld
objectClass: krb5KDCEntry
objectClass: krb5Principal
objectClass: account
uid: nfs
krb5KDCFlags: 126
krb5PrincipalName: nfs/kdc.realm.tld@REALM.TLD
krb5KeyVersionNumber: 0

>>> Ну следующая запись требуется только для сервера, если конечно вы не хотите поднять LDAP для каких либо иных нужд
dn: uid=ldap,dc=kdc.realm.tld,ou=hosts,dc=realm,dc=tld
objectClass: krb5KDCEntry
objectClass: krb5Principal
objectClass: account
uid: ldap
krb5KDCFlags: 126
krb5PrincipalName: ldap/kdc.realm.tld@REALM.TLD
krb5KeyVersionNumber: 0


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

10 комментариев:

Анонимный комментирует...

Напишу комментарий к этой статье, т.к. не нашел Ваши контакты. Спасибо за хорошие статьи, прочитал на одном дыхании.Читал не как how-to, а пытался понять идею организации. Интересен был механизм SSO. Давно хочу внедрить у себя не предприятии. Один логин для системы, почты, прокси, джаббера, файл-сервера...
Интересно как Вы организовали доступ к сетевым сервисам? Если какой-нибудь интерфейс для управления пользователями? В общем, куча вопросов.
Андрей Л.

Deepwalker комментирует...

Спасибо за комментарий. Прдпочитаю общение в онлайне - чтобы все обсуждения оставались для поисковиков, поэтому и не указываю личных контактов.
Про управление опишу еще, в основном это конечно возня с LDAP, с вытекающими отсюда инструментами.
А вы не пробовали пройти по шагам? Было бы ценным поправить ошибки, которые здесь точно есть, так как я все таки уже давно все настроил и половину пишу по памяти. Очень не хватает обратной связи.

Анонимный комментирует...

По шагам скоро начну пробовать как определюсь с некоторыми вопросами. Может и вы поможете, с высоты опыта )
1) какую ось выбрать? redhat EL или аналоги StartCom|Centos, а может быть ubuntu server?
2) выбрать openldap или начинающий набирать обороты fedora-ds?
Но это все мелочи ) я не могу понять вот что "кто осуществляет функции аутентификации/авторизации"? Нужен ведь домен? А где он? Про самбу ничего не было. В одной статье нашел "установив дружеские отношения с доменом Active Directory, я фактически решил проблему взаимодействия Linux и Windows сред" (LDAP VS Kerberos). Linux может пройти авторизацию в openldap, а как быть с виндовс-клиентами?
Вот такие у меня вопросы )

Deepwalker комментирует...

1) наиболее удобный для вас, особого значения это не имеет. Знаю только, что любимый мной heimdal в Ubuntu/Debian есть;
2) я бы пока брал openldap наверное, хотя если выберете rpm based дистрибутив, то ставиться FDS будет легко. Хорошей интеграции с kerberos там тоже нет.

Шапки сейчас активно изобретают FreeIPA, тоже можете посмотреть - как раз по теме. А эта серия статей как раз описывает начинку этого решения - протоколы взаимодействия.

Функции аутентификации осуществляет kerberos, авторизация у каждой службы своя.

Можно как раз настроить дружбу сферы kerberos и AD, вполне все работает, в шары пускает, LDAP читать дает. Домена в понятии AD здесь нет - это же сборка на коленке. Те никаких dcpromo и тп. Для kerberos, в общем случае, LDAP вообще не нужен, например, можно и hesiod обойтись, но много потеряется.

Анонимный комментирует...

небольшое замечание по Debian/unstable:
демон nslcd запускается под пользователем nslcd и такой же группой и соответственно не у демона не разрешений на файл /tmp/krb5cc_0 и, как следствие, соединение с ldap не может быть установлено.

Deepwalker комментирует...

Так как проблема наблюдается только в отдельном случае, путь решения будет комментарием:

Для решения проблемы надо или перевести nslcd в работу от root или получать билет примерно так:
su nslcd -c "/usr/bin/kinit -k host/`hostname -f`"
Права выдать на /etc/krb5.keytab или выгрузить ключи в другой кеш и задать его через export KRB5_KTNAME="FILE:/etc/nslcd.keytab" в стартовом скрипте. Для kinit также требуется указание нового кеша через параметр -t.

Вроде ничего не забыл : )

elementai комментирует...

весьма насущный вопрос : есть ли стандартный способ ограничить пользователю возможность логиниться на разные хосты/сервисы/etc ?

yolkov комментирует...

Кто-нибудь пробывал FreeIPA в качестве DC. Интересует узнать про возможноть перемещаемых профилей и авторизации в оффлайн(ноуты), или для этого нужно связывать FreeIPA с самбой?

Temporary комментирует...

Добрый день. Надеюсь вы ещё посещаете свой блог. Отличные статьи про керберос, как раз то что мне нужно.
Вроде сделал всё по статье, и билет для хоста получил и даже авторизация прошла, вот только срок действия билета истёк и на это всё. Я правильно понимаю что nslcd должен сам снова запрашивать билет на основании keytab?
Отсюда вопрос: какую версию nslcd вы использовали?
З.Ы. У меня дебиан поэтому сделал по инструкции в коментарии. Указал путь к ключу через export и на всякий случай запускаю nscld от рута. билет получил через kinit только кэш указывается параметром -с

Deepwalker комментирует...

А ключ обновлять придется как-то, демоны этого не умеют обычно.
Я давненько забросил эту тему, VoIP меня перетянул в свой стан, поэтому рекомендую ознакомиться с современными методами обновления ключей. Уже тогда начинали демоны разные использовать.