понедельник, 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 комментариев:

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

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

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

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

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

    ОтветитьУдалить
  3. Кстати относительно 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

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

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

    ~$ 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

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

    Андрей Л.

    ОтветитьУдалить
  5. Дома на тоже самое наткнулся, решил, но навскидку не припомню. Попробуйте переписать /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


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

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

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

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

    ОтветитьУдалить
  8. В дистрибутиве 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!

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

    Андрей Л.

    ОтветитьУдалить
  9. Продолжаю биться )
    # 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?

    ОтветитьУдалить
  10. Видимо надо, раз просит : )

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

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

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

    Андрей Л.

    ОтветитьУдалить
  12. Странно, у меня работает. А что пишет?

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

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

    ОтветитьУдалить
  14. objectClass: krb5KDCEntry
    objectClass: krb5Principal

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

    krb5KeyVersionNumber: 1

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

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

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

    ОтветитьУдалить
  15. >Подводный камень - если вы будут >создавать пользователя сразу через >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

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

    ОтветитьУдалить
  17. Если вы используете просто 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

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

    [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

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

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

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

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

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

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

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

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

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

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

    ОтветитьУдалить