Ich richte OpenLDAP slapdunter Ubuntu 14.04 Trusty Tahr ein. Ich möchte bestimmte Fälle (Replikation usw.) , die Benutzer nicht über zu Login der Lage sein , SASLmit DIGEST-MD5Mechanismus.
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 saslauthdgerade (dies ist keine schwierige Voraussetzung, wenn es zum Beispiel mit direktem Zugriff auf die sasldb funktionieren soll) und es funktioniert gut mit Mechanismen PLAINund LOGINwährend es mit Mechanismen DIGEST-MD5und nicht funktioniert CRAM-MD5.
Was vermisse ich oder mache ich falsch? Wie kann ich damit arbeiten DIGEST-MD5?
OpenLDAP für konfiguriert SASLin /etc/ldap/sasl2/slapd.confetwa 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/saslauthdsind:
START=yes
MECHANISMS="sasldb"
Sie führen dazu, saslauthddass 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.lognoch in der Debug-Ausgabe, saslauthdwenn ich es manuell ausführe, was wahrscheinlich darauf hinweist, dass slapdes nicht einmal so weit gekommen ist, die Authentifizierung zu übergeben saslauthd(im Gegensatz zum Arbeitsfall, siehe unten).
Ich reproduziere den Arbeitsfall mit PLAINoder LOGINwie 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 slapdProtokoll, 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.logund die Debug-Ausgabe von saslauthdjetzt 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 PLAINund LOGINvs. DIGEST-MD5und funktioniert CRAM-MD5.
Aktualisierung und Klarstellung:
Die DNs für die Genehmigung Zugang zum Baum verwendet werden , uid=replication,cn=digest-md5,cn=authund uid=replication,cn=plain,cn=authjeweils 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 PLAINund LOGINda es dort gut funktioniert).
Zu Testzwecken verwende ich derzeit, olcAccess: to * by dn.regex="replication" read by * breakum 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/sasldb2und werden bei Verwendung von PLAINoder 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-MD5und CRAM-MD5scheint es jedoch überhaupt keinen Kontakt saslauthdzu 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=authund uid=replication,cn=plain,cn=authwie 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 PLAINund die LOGINMechanismen legen nahe, dass dies wahr ist. Außerdem zeigen die Arbeitsweise PLAINund die LOGINFälle, dass die Anmeldeinformationen korrekt aus der sasldb übernommen wurden. Ich werde das in meiner Frage klarstellen.