понедельник, 26 мая 2008 г.

Инфраструктура Kerberos, начало

Как и обещал, попробую написать, как это делается. Приветствуются замечания, предложения, улучшения. Если есть что добавить к документу - я всеми руками за. Указывайте на ошибки, ругайте и тп : )

Вообще автор ждет Samba4, а пока спасается как может.

Итак, мы строим следующую структуру:
1. Heimdal KDC - центр распределения ключей;
2. OpenLDAP 2.4 - каталог, здесь будет храниться вся сетевая конфигурация. Такая как ключи kerberos, DNS, конфигурация (в предыдущих постах я описывал SCFL, только вот пока не выложил).

Я использую ubuntu 8.04, поэтому, как обычно, правит каждый сам под себя. Да и вообще - не надо всему, что вы прочли в интернете, слепо верить - стоит почитать документацию.

Ставим минимальный набор:

aptitude install heimdal-kdc slapd heimdal-clients pdns-server pdns-backend-ldap


Правим /etc/heimdal-kdc/kdc.conf:

[kdc]
logging = FILE:/var/log/heimdal-kdc.log
database = {
realm = REALM.TLD
dbname = ldap:dc=realm,dc=tld
mkey_file = /var/lib/heimdal-kdc/m-key
acl_file = /etc/heimdal-kdc/kadmind.acl
}


Правим /etc/ldap/slapd.conf:

include /etc/ldap/schema/core.schema
include /etc/ldap/schema/cosine.schema
include /etc/ldap/schema/nis.schema
include /etc/ldap/schema/inetorgperson.schema
include /etc/ldap/schema/hdb.schema
include /etc/ldap/schema/dnsdomain2.schema #PowerDNS схема расширяющая стандартную

pidfile /var/run/slapd/slapd.pid
argsfile /var/run/slapd/slapd.args
loglevel 0

modulepath /usr/lib/ldap
moduleload back_bdb
moduleload syncprov #Для синхронизации

sizelimit 500
tool-threads 1
backend bdb
sasl-realm REALM.TLD
sasl-host kdc.realm.tld

# Следующая строчка преобразует пользователя, подключающегося через sasl механизм
# GSSAPI(kerberos) к его реальному DN в дереве.
# В данном случае поиском, так как у меня они не лежат в одной папке.
authz-regexp uid=([^,]*),cn=realm.tld,cn=gssapi,cn=auth
ldap:///dc=realm,dc=tld??sub?(uid=$1)


database bdb #Мне тут сказали, что лучше использовать hdb. Попробую, почитаю.
suffix "dc=realm,dc=tld"
checkpoint 512 30
directory "/var/lib/ldap"

# Далее настройки хранилища bdb какие были по умолчанию. Надо бы разобраться и докрутить.
dbconfig set_cachesize 0 2097152 0
dbconfig set_lk_max_objects 1500
dbconfig set_lk_max_locks 1500
dbconfig set_lk_max_lockers 1500

# Настройки индекса. В общем то надо расширить их значительно.
index objectClass,uid eq
lastmod on

access to attrs=userPassword,shadowLastChange
# Везде рекомендуют вначале привести к нормальному имени.
# Пометим как TODO
by dn="gidnumber=0+uidnumber=0,cn=peercred,cn=external,cn=auth" write
by * none

access to attrs=krb5Key
by dn="gidnumber=0+uidnumber=0,cn=peercred,cn=external,cn=auth" write
by * none

access to dn.base="" by * read
access to dn.subtree="ou=config,dc=realm,dc=tld"
# Мне можно править : )
by dn.base="uid=deepwalker,ou=users,dc=realm,dc=tld" manage
# Остальным читать
by users read
by anonymous auth
by * none

access to *
by dn="gidnumber=0+uidnumber=0,cn=peercred,cn=external,cn=auth" write
by users read
by anonymous auth
by * none
# Последняя строчка для синхронизации
overlay syncprov

Теперь надо инициализировать LDAP, но для начала в /etc/default/slapd вставляем строчку:

SLAPD_SERVICES="ldap:/// ldapi:///"

Это заставит демон слушать на локальном сокете. Перезапускаем, и создаем файлик base.ldif с содержимым:

# realm.tld
dn: dc=realm,dc=tld
objectClass: dcObject
objectClass: organization
o: realm
dc: realm

# users, realm.tld
dn: ou=users,dc=realm,dc=tld
ou: users
objectClass: top
objectClass: organizationalUnit

# hosts, realm.tld
dn: ou=hosts,dc=realm,dc=tld
ou: hosts
objectClass: top
objectClass: organizationalUnit

# groups, realm.tld
dn: ou=groups,dc=realm,dc=tld
ou: groups
objectClass: top
objectClass: organizationalUnit

Теперь загрузим его в базу:

cat base.ldif | ldapadd -H ldapi:/// -Y EXTERNAL

Здесь это делается от root, мы подключаемся к локальному сокету и аутентифицируемся по специальному sasl механизму external - просто локальные пользователи.

Ну и инициализация KDC:

# /etc/init.d/heimdal-kdc restart
# kadmin -l
> init REALM.TLD

Далее надо по идее создать пользователя. Если вы в kadmin сделаете "add deepwalker", то создаст он вам пользователя немного не так, как хотелось бы, а по сему делаем tmpuser.ldif:

dn: uid=TMPUSER,ou=users,dc=realm,dc=tld
uid: TMPUSER
krb5PrincipalName: TMPUSER@REALM.TLD
objectClass: top
objectClass: posixAccount
objectClass: shadowAccount
objectClass: inetOrgPerson
objectClass: organizationalPerson
objectClass: person
objectClass: userSecurityInformation
objectClass: krb5KDCEntry
objectClass: krb5Principal
loginShell: /bin/bash
uidNumber: TMPUIDNUM
krb5KDCFlags: 126
gidNumber: 2000
sn: TMPUSER
homeDirectory: /home/TMPUSER
krb5KeyVersionNumber: 1

И используем:

root@kdc:~# a=`ldapsearch -H ldapi:/// -Y external uidNumber | grep ^uidNumber | cut -c 12- | sort |tail -n 1`; let last_uid=$a+1
root@kdc:~# cat tmpuser.ldif | sed s/TMPUSER/deepwalker/g | sed s/TMPUIDNUM/$last_uid/g | ldapadd -H ldapi:/// -Y external
root@kdc:~# kadmin -l cpw deepwalker

Можно посмотреть содержимое каталога LDAP:

slapcat
# или
ldapsearch -Y external -H ldapi:///

Теперь надо настроить /etc/krb5.conf:

[libdefaults]
default_realm = REALM.TLD
default_tgs_enctypes = des-cbc-crc
default_tkt_enctypes = des-cbc-crc
default_etypes = des-cbc-crc
default_etypes_des = des-cbc-crc

fcc-mit-ticketflags = true


[realms]
REALM.TLD = {
kdc = kdc.realm.tld
admin_server = kdc.realm.tld
}

[domain_realm]
realm.tld = REALM.TLD
.realm.tld = REALM.TLD

Пробуем получить билет:

kinit deepwalker

Далее пишем гневные комментарии и ждем следующей части.

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

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

Было бы замечательно прочитать статью о том, как это работает в принципе, зачем это нужно и какие выгоды несет. С небольшими и простыми схемами.

Спасибо за статью.

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

Со схемами? У меня тут уже была запись -> LDAP vs Kerberos

Плюсы перечислю:
1. SSO - один ввод пароля, прозрачная аутентификация;
2. Хранение всего в LDAP - удобное управление - удаляем хост, удаляются его DNS записи, удаляем пользователя, удаляются его ключи kerberos и тп.;
3. Взаимодействие с AD - ну вы же в курсе, что там тоже kerberos? Так вот это работает!

Есть еще Samba, но она у нас пока только NT4 домен поддерживает, а Samba4 использовать строго не рекомендуют, так что ждем, посмотрим, но мне кажется это будет самое лучшее решение, года через 2 : )

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

Кстати относительно uid номера, из статьи:

root@kdc:~# cat tmpuser.ldif | sed s/TMPUSER/deepwalker/g | sed s/TMPUIDNUM/1000/g | ldapadd -H ldap:/// -Y external

Можно получить последний uid автоматически и инкремент сделать:

a=`ldapsearch uidNumber | grep ^uidNumber | cut -c 12- | sort |tail -n 1`; let b=$a+1;echo $b

Напоминаю - питон я знаю гораздо лучше : )

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

Решил заняться настройкой керберос и сразу появились неразрешимые для меня ошибки (

~$ sudo apt-get install heimdal-kdc
Настраивается пакет heimdal-kdc (1.0.1-5ubuntu4) ...
kstash: writing key to `/var/lib/heimdal-kdc/m-key'
kstash: writing master key file: unable to find realm of host ubuntu-server
dpkg: не удалось обработать параметр heimdal-kdc (--configure):
подпроцесс post-installation script возвратил код ошибки 1
При обработке следующих пакетов произошли ошибки:
heimdal-kdc
E: Sub-process /usr/bin/dpkg returned an error code (1)
$ cat /etc/hosts
#127.0.0.1 localhost
127.0.1.1 ubuntu-server.chelsi.local ubuntu-server localhost

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Где моя ошибка?

Андрей Л.

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

Дома на тоже самое наткнулся, решил, но навскидку не припомню. Попробуйте переписать /etc/hosts:

127.0.0.1 localhost
192.168.0.1 ubuntu-server.chelsi.local ubuntu-server

# The following lines are desirable for IPv6 capable hosts
::1 ip6-localhost ip6-loopback
fe00::0 ip6-localnet
ff00::0 ip6-mcastprefix
ff02::1 ip6-allnodes
ff02::2 ip6-allrouters
ff02::3 ip6-allhosts

Просто смысл без сети все равно теряется, так что без нее лучше и не пытаться.
Далее обязательно нужно соответствие и домен по умолчанию в /etc/krb5.conf:

default_realm = CHELSI.LOCAL
[domain_realm]
chelsi.local = CHELSI.LOCAL
.chelsi.local = CHELSI.LOCAL


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

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

Эта ошибка разрешилась, как мне показалось, после установки heimdal-servers.
В дополнение к статье, теперь вроде схему hdb не надо подключать, она включена по-умолчанию.

Почему-то у меня выдается ошибка: slapd.conf unknown attr "krb5Key"
(
Андрей Л.

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

include /etc/ldap/schema/hdb.schema <- эта строка есть? А файл? Если файла вдруг нет, могу выложить. Или сами скачайте из дистрибутива heimdal.

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

В дистрибутиве heimdal не нашел hdb.schema (http://www.h5l.org/dist/src/heimdal-1.0.1.tar.gz)
Нашел в инете hdb.schema (hdb.schema,v 1.3 2000/02/22 21:51:53 lukeh Exp), но как только подключаю эту схему, то получаю ошибку:

/etc/ldap/schema/hdb.schema: line 79 attributetype: AttributeType inappropriate matching rule: "generalizedTimeOrderingMatch"
/etc/ldap/slapd.conf: line 15: include> handler exited with 1!

Выложи пожалуйста свою схему.

Андрей Л.

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

http://pastebin.com/m14022c42

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

Продолжаю биться )
# cat tmpuser.ldiff | sed s/TMPUSER/loukash/g | sed s/TMPUIDNUM
/$last_uid/g | ldapadd -H ldapi:/// -Y external
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
adding new entry "uid=loukash,ou=users,dc=chelsi,dc=local"
ldap_add: Object class violation (65)
additional info: object class 'posixAccount' requires attribute 'cn'

Атрибут cn не надо прописать в tmpuser.ldiff?
Может посоветуете какой-нибудь интерфейс под ldap?

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

Видимо надо, раз просит : )

Интерфейсов много, мне нравится luma. Ни одного с поддержкой атрибутов kerberos не встречал.

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

Что означает эта строка в конфиге? Нет ли тут ошибки? ЛДАП не хочет запускаться из-за нее.

authz-regexp uid=([^,]*),cn=realm.tld,cn=gssapi,cn=auth
ldap:///dc=realm,dc=tld??sub?(uid=$1)

Андрей Л.

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

Странно, у меня работает. А что пишет?

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

Хотелось бы понять что это за параметры в ldif
objectClass: krb5KDCEntry
objectClass: krb5Principal
krb5KeyVersionNumber: 1

и каким образом потом добавляются пользователи? в kerberos сразу же? они появятся в ldap?

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

objectClass: krb5KDCEntry
objectClass: krb5Principal

Эти параметры указывают, что эта запись должна обладать какими то атрибутами, и еще может содержать какие то. Понятно, что атрибуты необходимые для KDC, такие как krb5PrincipialName, krb5Key.

krb5KeyVersionNumber: 1

Это номер версии ключей, просто для инициализации учетной записи.

Пользователь добавляется вначале в LDAP, а потом через kadmin вы ему меняете пароль. Суть в том, что я генерировать ключи не умею, а то вставил бы это в один из скриптов. Поэтому я просто пользуюсь программой, которая делает это легко и непринужденно - kadmin.

Подводный камень - если вы будут создавать пользователя сразу через kadmin, то он создаст совершенно не то, чего бы вам хотелось. Можете впрочем проэкспериментировать.

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

>Подводный камень - если вы будут >создавать пользователя сразу через >kadmin, то он создаст совершенно не то, >чего бы вам хотелось.

Интересно, у меня при вводе пользователя в kadmin получается ошибка, с чем бы это могло быть связано:

kadmin> add test
kadmin: connect(kdc.myrealm.local): Connection refused
kadmin: failed to contact kdc.myrealm.local
Max ticket life [unlimited]:
Max renewable life [unlimited]:
Principal expiration time [never]:
Password expiration time [never]:
Attributes []:
test@MYREALM.LOCAL's Password:
Verifying - test@MYREALM.LOCAL's Password:
kadmin: connect(kdc.myrealm.local): Connection refused
kadmin: failed to contact kdc.myrealm.local
kadmin: kadm5_create_principal: Operation failed for unspecified reason
kadmin: adding test: Operation failed for unspecified reason

Как вы понимаете в /etc/hosts
kdc.myrealm.local естественно добавлен

127.0.1.1 kdc.myrealm.local kdc
192.168.82.246 kdc.myrealm.local kdc myrealm.local

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

kadmin -l

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

я бы просто хотел понять почему такая ошибка происходит, если рассматривать данную статью http://www.securitylab.ru/analytics/264318.php ,то так описывается онлайн администрирование, как я все же понимаю это из-за DNS. Is not it?

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

Если вы используете просто kadmin, без -l, то вам нужно будет настроить kadmind и /etc/krb5.conf:
REALM.TLD = {
kdc = kdc.realm.tld
admin_server = kdc.realm.tld
}

http://www.h5l.org/manual/heimdal-1-2-branch/info/heimdal.html#Remote-administration

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

Так в том и есть проблема что настроен вроде как =)

[kdc]
database = {
dbname = ldap:dc=realm,dc=local
acl_file = /etc/heimdal-kdc/kadmind.acl
log_file = /var/log/heimdal-kdc.log
}
addresses = 127.0.0.1 192.168.0.246

[libdefaults]
default_realm = REALM.LOCAL
dns_lookup_realm = false
dns_lookup_kdc = false
default_tgs_enctypes = des-cbc-crc
default_tkt_enctypes = des-cbc-crc
fcc-mit-ticketflags = true

[realms]
REALM.LOCAL = {
kdc = kdc.realm.local
admin_server = kdc.realm.local
default_domain = realm.local
}

[domain_realm]
.realm.local = REALM.LOCAL
realm.local = REALM.LOCAL

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

Все понял, я сглупил.
Благодарю за все очень интересный блог и топик.
Ошибка была в том что не запустил openbsd-inetd =(

Еще раз СПАСИБО =)

Mike Grozak комментирует...

Вопрос: насколько я понял, керберос в данном случае использует в качестве базы данных ЛДАП? МИТ Керберос не умеет видимо такого...

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

Умеет, только я не в курсе как именно. Там есть некий бекэнд для работы с каталогом LDAP. Кто то утверждал, что в отличие от умеет работать с каталогом на другой машине.

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

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

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

Наткнулась на k5expire, необходимость в помощи отпала, прошу прощения за тупость :)

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

Не вижу тупости в вашем вопросе. Часто бывает что пока ждешь ответа, решение находишь сам : )

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

Топику три года, но это единственное теоретическое пояснение вопроса в моем топе гула. Выражаю признательность за подробное объяснение! Да в описанной конфигурации придется добавлять ключи вручную. Но на сегодняшний день уже есть smbk5pwd oerlay для openlpad. Пользовались ли вы им и был ли успех?

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

Нет, не доводилось. В общем я уже как-то не особо в теме, да и LDAP мне кажется тупиком, на сегодняшний день.

Если бы я строил инфраструктуру сейчас, я бы попробовал samba 4.