Ich richte OpenLDAP slapd
unter Ubuntu 14.04 Trusty Tahr ein. Ich möchte bestimmte Fälle (Replikation usw.) , die Benutzer nicht über zu Login der Lage sein , SASL
mit DIGEST-MD5
Mechanismus.
Im Gegensatz zu Benutzern sollten sie keinen entsprechenden DN (zusammen mit dem Kennwort) in der Verzeichnisstruktur haben. Stattdessen sollen ihre Anmeldeinformationen daher extern gespeichert werden SASL
.
Ich verwende saslauthd
gerade (dies ist keine schwierige Voraussetzung, wenn es zum Beispiel mit direktem Zugriff auf die sasldb funktionieren soll) und es funktioniert gut mit Mechanismen PLAIN
und LOGIN
während es mit Mechanismen DIGEST-MD5
und nicht funktioniert CRAM-MD5
.
Was vermisse ich oder mache ich falsch? Wie kann ich damit arbeiten DIGEST-MD5
?
OpenLDAP für konfiguriert SASL
in /etc/ldap/sasl2/slapd.conf
etwa so aus :
mech_list: EXTERNAL DIGEST-MD5 CRAM-MD5 PLAIN LOGIN
pwcheck_method: saslauthd
saslauthd_path: /var/run/saslauthd/mux
Die interessanten (geänderten) Optionen in /etc/default/saslauthd
sind:
START=yes
MECHANISMS="sasldb"
Sie führen dazu, saslauthd
dass wie folgt begonnen wird:
/usr/sbin/saslauthd -a sasldb -c -m /var/run/saslauthd -n 5
Ich reproduziere den fehlgeschlagenen Fall folgendermaßen 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
Der Teil im slapd-Protokoll, in dem es anscheinend fehlschlägt (Protokollierung ist aktiviert any
), sieht folgendermaßen aus:
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
Es gibt weder in /var/log/auth.log
noch in der Debug-Ausgabe, saslauthd
wenn ich es manuell ausführe, was wahrscheinlich darauf hinweist, dass slapd
es nicht einmal so weit gekommen ist, die Authentifizierung zu übergeben saslauthd
(im Gegensatz zum Arbeitsfall, siehe unten).
Ich reproduziere den Arbeitsfall mit PLAIN
oder LOGIN
wie folgt:
# 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
…
Der entsprechende Teil im slapd
Protokoll, der einen Fehler für den obigen Fall anzeigt, sieht nun folgendermaßen aus:
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
Beide /var/log/auth.log
und die Debug-Ausgabe von saslauthd
jetzt enthalten Folgendes:
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
Anscheinend muss es einen Unterschied geben, wie es mit PLAIN
und LOGIN
vs. DIGEST-MD5
und funktioniert CRAM-MD5
.
Aktualisierung und Klarstellung:
Die DNs für die Genehmigung Zugang zum Baum verwendet werden , uid=replication,cn=digest-md5,cn=auth
und uid=replication,cn=plain,cn=auth
jeweils und gemäß Abschnitt 15.2.5 von http://www.openldap.org/doc/admin24/sasl.html diese DNs nicht tatsächlich benötigen existiert im Baum ( das muss zumindest für zutreffen PLAIN
und LOGIN
da es dort gut funktioniert).
Zu Testzwecken verwende ich derzeit, olcAccess: to * by dn.regex="replication" read by * break
um sicherzustellen, dass die Replikationsanmeldung mindestens Lesezugriff auf alles (ja, ich weiß, dass dies nicht sicher ist und ich werde ihm die richtigen Berechtigungen für die Produktion erteilen) im Master-LDAP-Baum erhält.
Die Anmeldeinformationen sind vorhanden /etc/sasldb2
und werden bei Verwendung von PLAIN
oder erfolgreich überprüft LOGIN
(siehe oben). Als Referenz sieht es so aus:
# 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
…
Im Fall von DIGEST-MD5
und CRAM-MD5
scheint es jedoch überhaupt keinen Kontakt saslauthd
zu geben (weil ich möglicherweise etwas vermisse oder etwas falsch mache), sodass die Datenbank wahrscheinlich auch nicht konsultiert wird.
uid=replication,cn=digest-md5,cn=auth
und uid=replication,cn=plain,cn=auth
wie in den obigen Protokollausgaben zu sehen ist), und gemäß dem Hinweis in Abschnitt 15.2.5 von openldap.org/doc/admin24/sasl.html wird der DN nicht zugewiesen müssen im Baum existieren. Und die Arbeitsweise PLAIN
und die LOGIN
Mechanismen legen nahe, dass dies wahr ist. Außerdem zeigen die Arbeitsweise PLAIN
und die LOGIN
Fälle, dass die Anmeldeinformationen korrekt aus der sasldb übernommen wurden. Ich werde das in meiner Frage klarstellen.