Как заставить аутентификацию SASL работать с DIGEST-MD5 для OpenLDAP?
Я настраиваю OpenLDAP slapd на Ubuntu 14.04 Trusty Tahr. Я хочу, чтобы определенные экземпляры (репликация и т. Д.), Которые не являются пользователями, могли входить через SASL с помощью DIGEST-MD5 механизм.
В отличие от пользователей, они не должны иметь соответствующего DN (вместе с паролем) в дереве каталогов. Вместо этого их учетные данные должны храниться извне, следовательно SASL,
я использую saslauthd прямо сейчас (это не сложное требование, если его можно настроить, например, для работы с прямым доступом к sasldb), и оно отлично работает с использованием механизмов PLAIN а также LOGIN пока он не использует механизмы DIGEST-MD5 а также CRAM-MD5,
Что я пропускаю или делаю неправильно? Как я могу заставить его работать с DIGEST-MD5 ?
OpenLDAP настроен для SASL в /etc/ldap/sasl2/slapd.conf как это:
mech_list: EXTERNAL DIGEST-MD5 CRAM-MD5 PLAIN LOGIN
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
Интересные (измененные) варианты в /etc/default/saslauthd являются:
START=yes
MECHANISMS="sasldb"
Они приводят к saslauthd начинается так:
/usr/sbin/saslauthd -a sasldb -c -m /var/run/saslauthd -n 5
Я воспроизвожу неудачный случай с DIGEST-MD5 как это:
# ldapsearch -U replication -ZZ -Y DIGEST-MD5 -H ldap://ldap-master.example.com/ -b "dc=example,dc=com" "(objectClass=*)"
SASL/DIGEST-MD5 authentication started
Please enter your password:
ldap_sasl_interactive_bind_s: Invalid credentials (49)
additional info: SASL(-13): user not found: no secret in database
Часть в журнале slapd, где она, похоже, не работает (ведение журнала включено any) выглядит так:
slapd[23330]: [rw] authid: "uid=replication,cn=digest-md5,cn=auth" -> "uid=replication,cn=digest-md5,cn=auth"
slapd[23330]: slap_parseURI: parsing uid=replication,cn=digest-md5,cn=auth
slapd[23330]: >>> dnNormalize: <uid=replication,cn=digest-md5,cn=auth>
slapd[23330]: <<< dnNormalize: <uid=replication,cn=digest-md5,cn=auth>
slapd[23330]: <==slap_sasl2dn: Converted SASL name to uid=replication,cn=digest-md5,cn=auth
slapd[23330]: slap_sasl_getdn: dn:id converted to uid=replication,cn=digest-md5,cn=auth
slapd[23330]: SASL Canonicalize [conn=1002]: slapAuthcDN="uid=replication,cn=digest-md5,cn=auth"
slapd[23330]: SASL [conn=1002] Failure: no secret in database
slapd[23330]: SASL [conn=1002] Debug: DIGEST-MD5 common mech dispose
slapd[23330]: send_ldap_result: conn=1002 op=2 p=3
slapd[23330]: send_ldap_result: err=49 matched="" text="SASL(-13): user not found: no secret in database"
slapd[23330]: send_ldap_response: msgid=3 tag=97 err=49
Там нет ничего в /var/log/auth.log ни в отладочном выводе saslauthd когда я запускаю его вручную, что, вероятно, указывает на то, что slapd даже не дошел до передачи аутентификации saslauthd (в отличие от рабочего случая, см. ниже).
Я воспроизвожу рабочий случай с PLAIN или же LOGIN как это:
# ldapsearch -U replication -ZZ -Y PLAIN -H ldap://ldap-master.example.com/ -b "dc=example,dc=com" "(objectClass=*)"
SASL/PLAIN authentication started
Please enter your password:
SASL username: replication
SASL SSF: 0
# extended LDIF
…
Соответствующая часть в slapd Журнал, в котором указан сбой для вышеприведенного случая, теперь выглядит следующим образом:
slapd[23330]: [rw] authid: "uid=replication,cn=plain,cn=auth" -> "uid=replication,cn=plain,cn=auth"
slapd[23330]: slap_parseURI: parsing uid=replication,cn=plain,cn=auth
slapd[23330]: >>> dnNormalize: <uid=replication,cn=plain,cn=auth>
slapd[23330]: <<< dnNormalize: <uid=replication,cn=plain,cn=auth>
slapd[23330]: <==slap_sasl2dn: Converted SASL name to uid=replication,cn=plain,cn=auth
slapd[23330]: slap_sasl_getdn: dn:id converted to uid=replication,cn=plain,cn=auth
slapd[23330]: SASL Canonicalize [conn=1006]: slapAuthcDN="uid=replication,cn=plain,cn=auth"
slapd[23330]: daemon: activity on 1 descriptor
slapd[23330]: daemon: activity on:
slapd[23330]:
slapd[23330]: daemon: epoll: listen=8 active_threads=0 tvp=zero
slapd[23330]: daemon: epoll: listen=9 active_threads=0 tvp=zero
slapd[23330]: daemon: epoll: listen=10 active_threads=0 tvp=zero
slapd[23330]: SASL proxy authorize [conn=1006]: authcid="replication" authzid="replication"
slapd[23330]: conn=1006 op=1 BIND authcid="replication" authzid="replication"
slapd[23330]: SASL Authorize [conn=1006]: proxy authorization allowed authzDN=""
slapd[23330]: send_ldap_sasl: err=0 len=-1
slapd[23330]: conn=1006 op=1 BIND dn="uid=replication,cn=plain,cn=auth" mech=PLAIN sasl_ssf=0 ssf=128
slapd[23330]: do_bind: SASL/PLAIN bind: dn="uid=replication,cn=plain,cn=auth" sasl_ssf=0
slapd[23330]: send_ldap_response: msgid=2 tag=97 err=0
И то и другое /var/log/auth.log и отладочный вывод из saslauthd теперь содержат это:
saslauthd[23354]: rel_accept_lock : released accept lock
saslauthd[23358]: get_accept_lock : acquired accept lock
saslauthd[23354]: cache_get_rlock : attempting a read lock on slot: 458
saslauthd[23354]: cache_lookup : [login=replication] [service=] [realm=ldap]: not found, update pending
saslauthd[23354]: cache_un_lock : attempting to release lock on slot: 458
saslauthd[23354]: cache_get_wlock : attempting a write lock on slot: 458
saslauthd[23354]: cache_commit : lookup committed
saslauthd[23354]: cache_un_lock : attempting to release lock on slot: 458
saslauthd[23354]: do_auth : auth success: [user=replication] [service=ldap] [realm=] [mech=sasldb]
saslauthd[23354]: do_request : response: OK
Видимо, должна быть какая-то разница в том, как это работает с PLAIN а также LOGIN против DIGEST-MD5 а также CRAM-MD5,
Обновление и уточнение:
DN, используемые для авторизации доступа к дереву, uid=replication,cn=digest-md5,cn=auth а также uid=replication,cn=plain,cn=auth соответственно, и в соответствии с разделом 15.2.5 http://www.openldap.org/doc/admin24/sasl.html эти DN не должны фактически существовать в дереве (что должно быть истинно, по крайней мере, для PLAIN а также LOGIN как там все работает нормально).
В целях тестирования я в настоящее время использую olcAccess: to * by dn.regex="replication" read by * break чтобы убедиться, что вход в систему репликации получает, по крайней мере, доступ на чтение ко всему (да, я знаю, что это небезопасно, и я дам ему соответствующие разрешения для производства) в главном дереве LDAP.
Полномочия находятся в /etc/sasldb2 и они успешно проверены при использовании PLAIN или же LOGIN (см. выше). Для справки, это выглядит так:
# sasldblistusers2
replication@ldap-master: userPassword
…
# db_dump -p /etc/sasldb2
VERSION=3
format=print
type=hash
h_nelem=4
db_pagesize=4096
HEADER=END
replication\00ldap-master\00userPassword
PasswordCensored
…
Тем не менее, в случае DIGEST-MD5 а также CRAM-MD5 это не похоже на контакт saslauthd вообще (из-за того, что я что-то упустил или сделал что-то не так, возможно), поэтому с базой данных, скорее всего, тоже не справились.
3 ответа
Мой рецепт для OpenLDAP, чтобы проверить напрямую /etc/sasldb2,
Первый шаг: обеспечить /etc/sasldb2 принадлежит пользователю slapd.
Следующий шаг: есть slapd не искать учетные данные в дереве каталогов, что делается следующим образом:
dn: cn=config
changetype: modify
replace: olcSaslAuxprops
olcSaslAuxprops: sasldb
Позже вам также понадобится olcAuthzRegexp правило, но для того, чтобы проверить, работает ли аутентификация, это необязательно.
Эти настройки работают на Debian GNU/Linux Jessie OpenLDAP-2.4.40, созданной из исходного кода.
Методы CRAM-MD5 и DIGEST-MD5 невозможны с помощью "pwcheck_method: saslauthd". Им нужны простые, незашифрованные пароли в самой директории LDAP.
Я провел несколько обширных тестов с различными конфигурациями с разными учетными данными в sasldb,
В заключение выясняется, что проблема, которая меня больше всего преследовала, заключалась в том, что согласно какому методу аутентификации (saslauthd против auxprop) (который, в свою очередь, зависит от запрошенного механизма аутентификации - DIGEST-MD5/CRAM-MD5 против PLAIN/LOGIN), искал другое domain, Я не ожидал этого, и поскольку у меня была только одна пара домен-пользователь в sasldb, он не нашел другого.
Я перечислю некоторые из моих выводов и наблюдений в надежде, что это поможет другим понять проблему и обойти ее:
- В случае, если вы просите
PLAINили жеLOGINмеханизм,slapdбудет использовать метод аутентификации, настроенный вpwcheck_methodв/etc/ldap/sasl2/slapd.conf, - В случае, если вы просите
DIGEST-MD5или жеCRAM-MD5механизм,slapdвсегда будет использоватьauxpropметод, независимо от того, что настроено дляpwcheck_method, - По сути, это означает, что вы можете иметь
slapdиспользуйте тот же метод для всех 4 механизмов, если вы настраиваетеpwcheck_method: auxprop, Или вы можете решить использовать 2 различных метода, если вы настраиваете что-то другое дляpwcheck_method, - В любом случае,
auxprop_pluginв/etc/ldap/sasl2/slapd.confигнорируется Вместоslapdиспользует то, что настроено дляolcSaslAuxpropsв своей собственной базе данных конфигурации. Обратите внимание, что это верно как для неявногоauxpropметод при запросеDIGEST-MD5или жеCRAM-MD5механизмы, а также для явно настроенногоpwcheck_method: auxpropпри запросе одного из двух других механизмов. - В моем случае,
saslauthdищет учетные данные с неукрашенным именем хоста (т.е. простоldap-master) какdomainсоставная часть. Если бы я сделал обоснованное предположение, я бы сказал, что он использует что-то вродеgethostname()чтобы придумать это, так что это может быть как-то настраивается. - В моем случае при прохождении
auxpropтак или другой,slapdиспользует полное доменное имя (т.е.ldap-master.example.com) какdomainсоставная часть. Вероятно, это происходит из исходного URL-адреса запроса (мои альтернативы для генерации запроса ограничены, когда я хочу использовать STARTTLS и хочу иметь возможность правильно проверить сертификат сервера, который запрашивает соответствующее доменное имя), но это может быть настроен настройкойolcSaslHostвslapdбаза данных конфигурации. Обратите внимание, что я не пытался настроить его.
Итак, для создания рабочей конфигурации у вас есть несколько вариантов:
- Если ты в порядке только
PLAINа такжеLOGINмеханизмы по STARTTLS, настроитьpwcheck_methodв/etc/ldap/sasl2/slapd.confкак требуется. Если это будетauxpropтакже настроитьolcSaslAuxpropsвslapdбаза данных конфигурации (установите ее наsasldbНапример, если вы хотите использовать/etc/sasldb2как хранилище учетных данных). - Если ты в порядке только
DIGEST-MD5(Я обычно вижуCRAM-MD5рекомендуется из-за плохой безопасности, поэтому старайтесь избегать этого), установитеolcSaslAuxpropsвslapdбаза данных конфигурации, какauxpropметод будет использоваться независимо от того, что вы настраиваетеpwcheck_method, - Если вы хотите иметь возможность использовать механизмы из набора
DIGEST-MD5,CRAM-MD5(однако старайтесь избегатьCRAM-MD5) а также наборPLAIN,LOGIN(убедитесь, что они используются только по зашифрованному соединению, например STARTTLS-one) и предпочитаете использовать один и тот же метод аутентификации для всех из них, а также проверять один и тот же набор учетных данных.auxprop, конфигурироватьpwcheck_method: auxpropв/etc/ldap/sasl2/slapd.confи установитьolcSaslAuxpropsвslapdконфигурация базы данных по мере необходимости. Если вы хотите иметь возможность использовать механизмы из обоих наборов при использовании для них разных методов аутентификации (для меня это звучит как кошмар администрирования, но все готово), настройте
pwcheck_methodв/etc/ldap/sasl2/slapd.confсоответственно дляPLAINа такжеLOGINи помните, что вы вынуждены использоватьauxpropзаDIGEST-MD5(а такжеCRAM-MD5если вы настаиваете) и установитьolcSaslAuxpropsвslapdконфигурация базы данных по мере необходимости.Если вам случится настроить
saslauthdдля непокрытых механизмов и убедитесь, что saslauthd обращается к другой базе данных, чем чтоslapdдоступ черезauxpropили использовать что-то еще, чемsasldbзаolcSaslAuxprops, у вас есть они хорошо разделены и не о чем беспокоиться.Если вам случится настроить
saslauthdдля нерушенных механизмов иsasldbзаauxpropдля механизмов хеширования и предоставления им доступа к одной и той же базе данных учетных данных у вас есть 3 варианта в порядке предпочтения:- Так или иначе, убедитесь, что оба
saslauthdтак же какslapdдоступ к sasldb напрямую черезauxpropзапросить учетные данные с тем жеdomain(попробуйте установитьolcSaslHostили принуждениеsaslauthdиспользовать полное доменное имя), поэтому вам придется заботиться только об одной записи учетных данных для каждой сущности для аутентификации. - Умышленно принимайте решение использовать разные учетные данные для хэшированных и хэшированных механизмов. Использовать
userid-hostnameпара для неразделенных механизмов надsaslauthdи использоватьuserid-hostname.domain.nameпара для хешированных механизмов черезauxprop, - Сохраняйте две учетные записи для каждой сущности для аутентификации - одну с "именем хоста", а другую с "hostname.domain.name" - и синхронизируйте пароли обоих (тьфу).
- Так или иначе, убедитесь, что оба