Вообще автор ждет 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 комментариев:
Было бы замечательно прочитать статью о том, как это работает в принципе, зачем это нужно и какие выгоды несет. С небольшими и простыми схемами.
Спасибо за статью.
Со схемами? У меня тут уже была запись -> LDAP vs Kerberos
Плюсы перечислю:
1. SSO - один ввод пароля, прозрачная аутентификация;
2. Хранение всего в LDAP - удобное управление - удаляем хост, удаляются его DNS записи, удаляем пользователя, удаляются его ключи kerberos и тп.;
3. Взаимодействие с AD - ну вы же в курсе, что там тоже kerberos? Так вот это работает!
Есть еще Samba, но она у нас пока только NT4 домен поддерживает, а Samba4 использовать строго не рекомендуют, так что ждем, посмотрим, но мне кажется это будет самое лучшее решение, года через 2 : )
Кстати относительно 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
Где моя ошибка?
Андрей Л.
Дома на тоже самое наткнулся, решил, но навскидку не припомню. Попробуйте переписать /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"
(
Андрей Л.
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!
Выложи пожалуйста свою схему.
Андрей Л.
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?
Видимо надо, раз просит : )
Интерфейсов много, мне нравится luma. Ни одного с поддержкой атрибутов kerberos не встречал.
Что означает эта строка в конфиге? Нет ли тут ошибки? ЛДАП не хочет запускаться из-за нее.
authz-regexp uid=([^,]*),cn=realm.tld,cn=gssapi,cn=auth
ldap:///dc=realm,dc=tld??sub?(uid=$1)
Андрей Л.
Странно, у меня работает. А что пишет?
Хотелось бы понять что это за параметры в ldif
objectClass: krb5KDCEntry
objectClass: krb5Principal
krb5KeyVersionNumber: 1
и каким образом потом добавляются пользователи? в kerberos сразу же? они появятся в ldap?
objectClass: krb5KDCEntry
objectClass: krb5Principal
Эти параметры указывают, что эта запись должна обладать какими то атрибутами, и еще может содержать какие то. Понятно, что атрибуты необходимые для KDC, такие как krb5PrincipialName, krb5Key.
krb5KeyVersionNumber: 1
Это номер версии ключей, просто для инициализации учетной записи.
Пользователь добавляется вначале в LDAP, а потом через kadmin вы ему меняете пароль. Суть в том, что я генерировать ключи не умею, а то вставил бы это в один из скриптов. Поэтому я просто пользуюсь программой, которая делает это легко и непринужденно - kadmin.
Подводный камень - если вы будут создавать пользователя сразу через kadmin, то он создаст совершенно не то, чего бы вам хотелось. Можете впрочем проэкспериментировать.
>Подводный камень - если вы будут >создавать пользователя сразу через >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
kadmin -l
я бы просто хотел понять почему такая ошибка происходит, если рассматривать данную статью http://www.securitylab.ru/analytics/264318.php ,то так описывается онлайн администрирование, как я все же понимаю это из-за DNS. Is not it?
Если вы используете просто 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
Так в том и есть проблема что настроен вроде как =)
[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
Все понял, я сглупил.
Благодарю за все очень интересный блог и топик.
Ошибка была в том что не запустил openbsd-inetd =(
Еще раз СПАСИБО =)
Вопрос: насколько я понял, керберос в данном случае использует в качестве базы данных ЛДАП? МИТ Керберос не умеет видимо такого...
Умеет, только я не в курсе как именно. Там есть некий бекэнд для работы с каталогом LDAP. Кто то утверждал, что в отличие от умеет работать с каталогом на другой машине.
Очень нужно под убунтой сообразить рассылку напоминаний об истечении срока действия церберовых паролей, а не то придет по мою душу толпа народу. Помогите, пожалуйста.
Наткнулась на k5expire, необходимость в помощи отпала, прошу прощения за тупость :)
Не вижу тупости в вашем вопросе. Часто бывает что пока ждешь ответа, решение находишь сам : )
Топику три года, но это единственное теоретическое пояснение вопроса в моем топе гула. Выражаю признательность за подробное объяснение! Да в описанной конфигурации придется добавлять ключи вручную. Но на сегодняшний день уже есть smbk5pwd oerlay для openlpad. Пользовались ли вы им и был ли успех?
Нет, не доводилось. В общем я уже как-то не особо в теме, да и LDAP мне кажется тупиком, на сегодняшний день.
Если бы я строил инфраструктуру сейчас, я бы попробовал samba 4.
Отправить комментарий