Kerberos + Ldap

Проблемы с установкой, настройкой и работой системных и сетевых программ.

Модераторы: GRooVE, alexco

Правила форума
Убедительная просьба юзать теги [code] при оформлении листингов.
Сообщения не оформленные должным образом имеют все шансы быть незамеченными.
LordNicky
рядовой
Сообщения: 36
Зарегистрирован: 2012-11-09 1:18:14

Kerberos + Ldap

Непрочитанное сообщение LordNicky » 2014-12-14 17:57:46

Доброго времени суток!

Добрые 2 недели пытаюсь связать Heimdal Kerberos и Openldap на FreeBSD 10.0. :st: Задача следующая - аутентификация должна проходить посредством кербероса, далее пользователь с тикетом обращается к ldap для авторизации. Т.е. все пароли храняться в керберосе, а непосредственно в ldap хранится вся база пользователей, групп и их полномочий. Хранить базу кербероса в ldap не требуется. На настоящий имеются следующие успехи:
1. Heimdal kerberos из портов настроен и выдает тикеты, как локально, так и по сети.
2. Openldap с поддержкой SASL, GSSAPI собран, настроен, запускается и по учетной записи rootpw выдает информацию о базе.
3. И в керберос и в ldap добавлен пользователь admin. Который получает общий тикет у кербероса, если я правильно понимаю, получает тикет на пользование ldap, но при этом локально при попытке соединения с ldap с аутентификацией по sasl выдает ошибку.

Итак, у меня имеется 2 вопроса, первый:
При запуске slapd выдает следующую ошибку:

Код: Выделить всё

slapd[85689]: SQL engine 'mysql' not supported
slapd[85689]: auxpropfunc error no mechanism available
В логе находим следующую строчку:ъ

Код: Выделить всё

slapd[85689]: _sasl_plugin_load failed on sasl_auxprop_plug_init for plugin: sql
И cyrus sasl, и openldap собраны без поддержки mysql. По большому счету он и не должен здесь нигде использоваться, итак вопрос - откуда вылезает данная ошибка и как ее прибить? Кстати - при пересборке cyrus sasl с поддержкой mysql текст слегка меняется, но не пропадает.

Второй вопрос:
Собственно данный вопрос как раз на тему связи kerberos и ldap. При выполнении локально команды

Код: Выделить всё

 ldapwhoami -Y GSSAPI
, получаем следующее:

Код: Выделить всё

ldap_sasl_interactive_bind_s: Other (e.g., implementation specific) error (80)
        additional info: SASL(-1): generic failure: GSSAPI Error:  No credentials were supplied, or the credentials were unavailable or inaccessible. (unknown mech-code 0 for mech unknown) 
Все конфиги и подробные логи прилагаю ниже:

Код: Выделить всё

openldap-sasl-server-2.4.40_2
[x] ACCESSLOG         With In-Directory Access Logging overlay
[ ] ACI                  Per-object ACI (experimental) 
[x] AUDITLOG          With Audit Logging overlay 
[ ] BDB               With BerkeleyDB backend (DEPRECATED)
[ ] COLLECT           With Collect overy Services overlay
[ ] CONSTRAINT        With Attribute Constraint overlay
[ ] DDS               With Dynamic Directory Services overlay  
[ ] DEREF             With Dereference overlay       
[x] DNSSRV            With Dnssrv backend 
[ ] DYNACL            Run-time loadable ACL (experimental)
[x] DYNAMIC_BACKENDS  Build dynamic backends
[ ] DYNGROUP          With Dynamic Group overlay 
[ ] DYNLIST           With Dynamic List overlay
[ ] FETCH             Enable fetch(3) support
[x] GSSAPI            With GSSAPI support (implies SASL support)
[ ] LMPASSWD          With LM hash password support (DEPRECATED) 
[x] MDB               With Memory-Mapped DB backend 
[ ] MEMBEROF          With Reverse Group Membership overlay
[ ] ODBC              With SQL backend
[ ] PASSWD            With Passwd backend
[ ] PERL              With Perl backend
[x] PPOLICY           With Password Policy overlay
[ ] PROXYCACHE        With Proxy Cache overlay
[ ] REFINT            With Referential Integrity overlay 
[ ] RELAY             With Relay backend
[ ] RETCODE           With Return Code testing overlay
[ ] RLOOKUPS          With reverse lookups of client hostnames
[ ] RWM               With Rewrite/Remap overlay 
[x] SASL              With (Cyrus) SASL2 support
[x] SEQMOD            With Sequential Modify overlay
[ ] SHA2              With SHA2 Password hashes overlay 
[ ] SHELL             With Shell backend (disables threading) 
[ ] SLAPI             With Netscape SLAPI plugin API (experimental)
[ ] SLP               With SLPv2 (RFC 2608) support
[x] SMBPWD            With Samba Password hashes overlay 
[ ] SOCK              With Sock backend
[ ] SSSVLV            With ServerSideSort/VLV overlay
[x] SYNCPROV          With Syncrepl Provider overlay 
[x] TCP_WRAPPERS      With tcp wrapper support
[ ] TRANSLUCENT       With Translucent Proxy overlay
[ ] UNIQUE            With attribute Uniqueness overlay
[ ] VALSORT           With Value Sorting overlay  

Код: Выделить всё

cyrus-sasl-2.1.26_9
[ ] ALWAYSTRUE          the alwaystrue password verifier
[x] AUTHDAEMOND         use of authdaemon 
[x] DOCS                Build and/or install documentation
[ ] KEEP_DB_OPEN        Keep handle to Berkeley DB open  
[x] OBSOLETE_CRAM_ATTR  cmusaslsecretCRAM-MD5 property 
[ ] BDB                 Berkeley DB support 
[ ] MYSQL               MySQL database support
[ ] PGSQL               PostgreSQL database support 
                    MECH
[ ] CRAM                CRAM-MD5 authentication
[ ] DIGEST              DIGEST-MD5 authentication
[ ] LOGIN               LOGIN authentication
[ ] NTLM                NTLM authentication
[ ] OTP                 OTP authentication
[x] PLAIN               PLAIN authentication
[ ] SCRAM               SCRAM authentication
                     SQLite database support
( ) SQLITE2             SQLite 2 database
(*) SQLITE3             SQLite 3 database support 

Код: Выделить всё

 cyrus-sasl-gssapi-2.1.26_3
( ) BASE     Use Heimdal in base
(*) HEIMDAL  Use Heimdal from ports
( ) MIT      Use MIT Kerberos V5  

Код: Выделить всё

heimdal-1.5.3_3
[x] BDB       Enable BerkeleyDB KDC backend support
[x] CRACKLIB  Use CrackLib for password quality checking
[x] DIGEST    Enable DIGEST support
[x] IPV6      IPv6 protocol support
[x] KX509     Enable kx509 support 
[x] LDAP      Enable OpenLDAP KDC backend support 
[x] PKINIT    Enable PK-INIT support 
[ ] SQLITE    Enable SQLite KDC backend support
[ ] X11       Build X11 utilies         
Теперь конфиги:
/etc/krb5.conf

Код: Выделить всё

  1 [libdefaults]
  2         default_realm = LEN.LOCAL
  3 [realms]
  4         LEN.LOCAL = {
  5                 kdc = server.len.local
  6                 admin_server = server.len.local
  7                 kpasswd_server = server.len.local
  8         }
  9 [domain_realm]
 10         .len.local = LEN.LOCAL
 11 [logging]
 12         kdc = FILE:/var/log/krb5kdc.log
 13         admin_server = FILE:/var/log/kadmin.log
 14         default = FILE:/var/log/krb5lib.log
/usr/local/etc/openldap/slapd.conf

Код: Выделить всё

  1 #
  2 # See slapd.conf(5) for details on configuration options.
  3 # This file should NOT be world readable.
  4 #
  5 include         /usr/local/etc/openldap/schema/core.schema
  6 include         /usr/local/etc/openldap/schema/cosine.schema
  7 include         /usr/local/etc/openldap/schema/inetorgperson.schema
  8 # include               /usr/local/etc/openldap/schema/nis.schema
  9
 10 # Define global ACLs to disable default read access.
 11
 12 # Do not enable referrals until AFTER you have a working directory
 13 # service AND an understanding of referrals.
 14 # referral      ldap://root.openldap.org
 15
 16 pidfile         /var/run/openldap/slapd.pid
 17 argsfile        /var/run/openldap/slapd.args
 18
 19 logfile /var/log/slapd.log
 20 loglevel -1
 21
 22 # Load dynamic backend modules:
 23 modulepath      /usr/local/libexec/openldap
 24 moduleload      back_mdb
 25
 26 # Sample security restrictions
 27 #       Require integrity protection (prevent hijacking)
 28 #       Require 112-bit (3DES or better) encryption for updates
 29 #       Require 63-bit encryption for simple bind
 30 # security ssf=1 update_ssf=112 simple_bind=64
 31
 32 sasl-host       server.len.local
 33 sasl-realm      LEN.LOCAL
 34 # sasl-secprops minssf=0
 35
 36 authz-regexp
 37   uid=([^,]*),cn=len.local,cn=gssapi,cn=auth
 38   uid=$1,ou=people,dc=len,dc=local
 39
 40 # Sample access control policy:
 41 #       Root DSE: allow anyone to read it
 42 #       Subschema (sub)entry DSE: allow anyone to read it
 43 #       Other DSEs:
 44 #               Allow self write access
 45 #               Allow authenticated users read access
 46 #               Allow anonymous users to authenticate
 47 #       Directives needed to implement policy:
 48 # access to dn.base="" by * read
 49 # access to dn.base="cn=Subschema" by * read
 50 # access to *
 51 #       by self write
 52 #       by users read
 53 #       by anonymous auth
 54 #
 55 # if no access controls are present, the default policy
 56 # allows anyone and everyone to read anything but restricts
 57 # updates to rootdn.  (e.g., "access to * by * read")
 58 #
 59 # rootdn can always read and write EVERYTHING!
 60
 61 #######################################################################
 62 # backend database definitions
 63 #######################################################################
 64
 65 database        mdb
 66 maxsize         1073741824
 67 suffix          "dc=len,dc=local"
 68 rootdn          "cn=root,dc=len,dc=local"
 69 # Cleartext passwords, especially for the rootdn, should
 70 # be avoid.  See slappasswd(8) and slapd.conf(5) for details.
 71 # Use of strong authentication encouraged.
 72 rootpw          verysecret
 73 # The database directory MUST exist prior to running slapd AND
 74 # should only be accessible by the slapd and slap tools.
 75 # Mode 700 recommended.
 76 directory       /var/db/openldap-data/len-local
 77 # Indices to maintain
 78 index   uid     eq
 79 index   cn,gn,mail      eq,sub
 80 index   sn      eq,sub
 81 index   ou      eq
 82 index   ObjectClass     eq
 83 index   default eq,sub
 84 index   telephonenumber
/usr/local/etc/openldap/ldap.conf

Код: Выделить всё

1 #
  2 # LDAP Defaults
  3 #
  4
  5 # See ldap.conf(5) for details
  6 # This file should be world readable but not world writable.
  7
  8 BASE    dc=len,dc=local
  9 HOST    SERVER.len.local
 10 URI     ldap://server.len.local
 11
 12 #SIZELIMIT      12
 13 #TIMELIMIT      15
 14 #DEREF          never
/usr/local/lib/sasl2/slapd.conf

Код: Выделить всё

 1 mech_list: GSSAPI
Выводы команд:

Код: Выделить всё

root@SERVER:~ # klist
Credentials cache: FILE:/tmp/krb5cc_0
        Principal: admin@LEN.LOCAL

  Issued                Expires               Principal
Dec 14 15:59:11 2014  Dec 15 01:59:11 2014  krbtgt/LEN.LOCAL@LEN.LOCAL
Dec 14 15:59:41 2014  Dec 15 01:59:11 2014  ldap/server.len.local@LEN.LOCAL

Код: Выделить всё

root@SERVER:~ # ls -l /etc/krb5.keytab
-rw-r-----  1 root  ldap  560 Dec  7 21:24 /etc/krb5.keytab

Код: Выделить всё

root@SERVER:~ # ldapsearch -x -b '' -s base supportedSASLMechanisms
# extended LDIF
#
# LDAPv3
# base <> with scope baseObject
# filter: (objectclass=*)
# requesting: supportedSASLMechanisms
#

#
dn:
supportedSASLMechanisms: GSSAPI

# search result
search: 2
result: 0 Success

# numResponses: 2
# numEntries: 1
На всякий случай извиняюсь за кучу кода вываленную в форум - хотелось бы поскорее получить ответ, поэтому выложил всё, что по моим представлениям может относиться к делу.

Хостинговая компания Host-Food.ru
Хостинг HostFood.ru
 

Услуги хостинговой компании Host-Food.ru

Хостинг HostFood.ru

Тарифы на хостинг в России, от 12 рублей: https://www.host-food.ru/tariffs/hosting/
Тарифы на виртуальные сервера (VPS/VDS/KVM) в РФ, от 189 руб.: https://www.host-food.ru/tariffs/virtualny-server-vps/
Выделенные сервера, Россия, Москва, от 2000 рублей (HP Proliant G5, Intel Xeon E5430 (2.66GHz, Quad-Core, 12Mb), 8Gb RAM, 2x300Gb SAS HDD, P400i, 512Mb, BBU):
https://www.host-food.ru/tariffs/vydelennyi-server-ds/
Недорогие домены в популярных зонах: https://www.host-food.ru/domains/

LordNicky
рядовой
Сообщения: 36
Зарегистрирован: 2012-11-09 1:18:14

Re: Kerberos + Ldap

Непрочитанное сообщение LordNicky » 2014-12-14 18:12:43

На всякий случай извиняюсь за кучу кода вываленную в форум
З.Ы. debug логи не стал вываливать по той же причине. Пишите, что нужно - выложу.

LordNicky
рядовой
Сообщения: 36
Зарегистрирован: 2012-11-09 1:18:14

Re: Kerberos + Ldap

Непрочитанное сообщение LordNicky » 2014-12-18 21:24:29

Т.к. никто особо не торопится отвечать попробовал потестировать в разных вариантах сам керберос. Соответственно вопрос - какой набор тестов необходимо провести, чтобы быть уверенным, что керберос настроен правильно? Меня в данный момент смущает следующая ситуация:

Код: Выделить всё

> klist
klist: No ticket file: /tmp/krb5cc_1000
> kinit admin/admin
admin/admin@LEN.LOCAL's Password:
> klist
Credentials cache: FILE:/tmp/krb5cc_1000
        Principal: admin/admin@LEN.LOCAL

  Issued                Expires               Principal
Dec 18 21:13:14 2014  Dec 19 07:13:14 2014  krbtgt/LEN.LOCAL@LEN.LOCAL
> kadmin -p admin/admin
kadmin> list *
admin/admin@LEN.LOCAL's Password:
admin
odmin
default
admin/admin
kadmin/admin
kadmin/hprop
kadmin/changepw
changepw/kerberos
krbtgt/LEN.LOCAL
WELLKNOWN/ANONYMOUS
host/server3.len.local
ldap/server3.len.local
при этом

Код: Выделить всё

 # less /var/heimdal/kadmind.acl
admin/admin@LEN.LOCAL        all
*@LEN.LOCAL                  cpw
Т.е., насколько я себе представляю - если у меня есть билет админа, то я этим же билетом должен проходить аутентификацию как минимум в самом керберосе, однако он у меня дополнительно спрашивает пароль. Значит ли это, что керберос по какойто причине не дружит со своими же билетами? Возможно это как то приблизит понимание ошибки?

LordNicky
рядовой
Сообщения: 36
Зарегистрирован: 2012-11-09 1:18:14

Re: Kerberos + Ldap

Непрочитанное сообщение LordNicky » 2014-12-21 3:14:00

Проблемы решены :Yahoo!: , завтра подробно напишу, что и как, но пока что скажу - как я и подозревал, - непорядок был в конфигах, причем совершенно примитивного характера. :st:

LordNicky
рядовой
Сообщения: 36
Зарегистрирован: 2012-11-09 1:18:14

Re: Kerberos + Ldap

Непрочитанное сообщение LordNicky » 2014-12-21 23:17:18

Итак:

Насчет ошибки

Код: Выделить всё

slapd[85689]: SQL engine 'mysql' not supported
slapd[85689]: auxpropfunc error no mechanism available
Косяк заключается в том, что sasl при вызове инициализирует все библиотеки, которые находит и т.к. про sql ему ничего не написано в конфигах - матерится... Моя ошибка заключалась в том, что при сборке пакета(и пересборке тоже) я был уверен, что в этом месте:

Код: Выделить всё

                     SQLite database support
( ) SQLITE2             SQLite 2 database
( ) SQLITE3             SQLite 3 database support 
необходимо выбрать одну из двух баз. Оказалось, что можно просто снять выбор с обоих. Ну, да это по относительно неважной проблеме, т.к. ничего сильно не изменилось...

Теперь насчет основной, которая вываливается при вызове ldapwhoami -Y GSSAPI

Код: Выделить всё

ldap_sasl_interactive_bind_s: Other (e.g., implementation specific) error (80)
        additional info: SASL(-1): generic failure: GSSAPI Error:  No credentials were supplied, or the credentials were unavailable or inaccessible. (unknown mech-code 0 for mech unknown) 
Заработало всё после следующих действий(последнее точно было решающим, но какие еще повлияли - сказать сложно)
1. пересобрал openldap-server с отключенной опцией

Код: Выделить всё

[ ] SASL              With (Cyrus) SASL2 support
2. Слегка изменил конфиг кербероса:

Код: Выделить всё

  1 [libdefaults]
  2         default_realm = LEN.LOCAL
            allow_weak_crypto = TRUE 
  3 [realms]
  4         LEN.LOCAL = {
  5                 kdc = server.len.local
  6                 admin_server = server.len.local
  7                 kpasswd_server = server.len.local
  8         }
  9 [domain_realm]
 10         .len.local = LEN.LOCAL
 11 [logging]
 12         kdc = FILE:/var/log/krb5kdc.log
 13         admin_server = FILE:/var/log/kadmin.log
 14         default = FILE:/var/log/krb5lib.log
Данная опция использовалась для проверки работы кербероса для запуска telnet.
3. Вытащил ключ ldap/server3.len.local из кербероса в отдельный файл, который разместил в /usr/local/etc/openldap/ldap.keytab. Права доступа - 400, user|group - ldap|ldap.
4. Указал на этот файлик самому ldap-у (в /usr/local/etc/rc.d/slapd в шапке указано, какую строчку и с каким синтаксисом нужно засунуть в /etc/rc.conf) и, самое интересное:

Код: Выделить всё

 # cat /usr/local/lib/sasl2/slapd.conf
mech_list: GSSAPI
keytab: /usr/local/etc/openldap/ldap.keytab
Собственно после изменения последнего файла всё и заработало. Любопытно отметить, что в Kerberos: The Definitive Guide таки есть раздел на эту тему, в котором упоминаются и файлики и синтаксис. Странно, что я это не смог найти в манах и что ошибка нисколько не указала на то, куда собственно нужно копать... Вообще говоря, хорошая книжка - позволяет на начальном этапе разобраться и протестировать основные возможности кербероса. Так что, подводя итоги, затрудняюсь утверждать, что в данной ситуации дурак именно я, хотя это и наиболее вероятный вариант.
С наступающим и большого аптайма, товарисчи!

З.Ы. модераторам - тему можно закрывать, я думаю.

З.З.Ы. В моем сообщении от 2014-12-18 21:24:29 керберос вел себя абсолютно правильно, ошибок в приведенных выводах команд нет.