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
unduid=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 ArbeitsweisePLAIN
und dieLOGIN
Mechanismen legen nahe, dass dies wahr ist. Außerdem zeigen die ArbeitsweisePLAIN
und dieLOGIN
Fälle, dass die Anmeldeinformationen korrekt aus der sasldb übernommen wurden. Ich werde das in meiner Frage klarstellen.Antworten:
Mein Rezept ist, dass OpenLDAP direkt überprüft
/etc/sasldb2
.Erster Schritt:
/etc/sasldb2
Stellen Sie sicher, dass der Benutzer dem Benutzer slapd gehört.Nächster Schritt: Sie müssen
slapd
nicht nach Anmeldeinformationen in der Verzeichnisstruktur suchen. Dies geschieht wie folgt:Später benötigen Sie auch eine
olcAuthzRegexp
Regel, aber um zu testen, ob die Authentifizierung funktioniert, ist dies nicht erforderlich.Diese Einstellungen funktionieren unter Debian GNU / Linux Jessie OpenLDAP-2.4.40, das aus dem Quellcode erstellt wurde.
quelle
sasldb
In versuchtolcSaslAuxprops
und es hat für mich keinen Unterschied gemacht. Ich habe einige umfangreiche Tests durchgeführt und es stellte sich heraus, dass die EinstellungolcSaslAuxprops
ein Puzzleteil einer funktionierenden Konfiguration ist. Daher akzeptiere ich Ihre Lösung.Die Methoden CRAM-MD5 und DIGEST-MD5 sind mit "pwcheck_method: saslauthd" nicht möglich. Sie benötigen einfache, unverschlüsselte Kennwörter in einem LDAP-Verzeichnis.
quelle
pwcheck_method: auxprop
und slapd somit mit Zugriff auf die sasldb direkt? Das sollte doch möglich sein, oder? Die Passwörter in der sasldb sind Klartext. Wie konfiguriere ich das, wenn möglich?pwcheck_method
auf den einen oder anderen Wert für Mechanismen überhaupt keinen Unterschied machtDIGEST-MD5
undCRAM-MD5
(dies gilt jedoch fürPLAIN
undLOGIN
). Daher trifft Ihre Antwort nicht auf das Problem zu.Ich habe einige umfangreiche Tests mit verschiedenen Konfigurationen mit unterschiedlichen Anmeldeinformationen durchgeführt
sasldb
.Zusammenfassend stellt sich heraus, dass das Problem, das mich hier am meisten verfolgt hat, darin bestand, dass nach der verwendeten Authentifizierungsmethode (
saslauthd
vs.auxprop
) (die wiederum vom angeforderten Authentifizierungsmechanismus abhängt -DIGEST-MD5
/CRAM-MD5
vs.PLAIN
/LOGIN
) nach einer anderen gesucht wurdedomain
. Ich hatte das nicht erwartet und da ich nur ein Benutzer-Domain-Paar im hattesasldb
, fand es das andere nicht.Ich werde einige meiner Schlussfolgerungen und Beobachtungen auflisten, in der Hoffnung, dass dies anderen hilft, das Problem zu verstehen und es zu umgehen:
PLAIN
oder einenLOGIN
Mechanismus anfordern ,slapd
verwenden Sie die unterpwcheck_method
in konfigurierte Authentifizierungsmethode/etc/ldap/sasl2/slapd.conf
.DIGEST-MD5
oder einenCRAM-MD5
Mechanismus anfordern ,slapd
wird dieauxprop
Methode immer verwendet , unabhängig davon, wofür sie konfiguriert istpwcheck_method
.slapd
, dass Sie bei der Konfiguration für alle vier Mechanismen dieselbe Methode verwenden könnenpwcheck_method: auxprop
. Oder Sie können zwei verschiedene Methoden verwenden, wenn Sie etwas anderes für konfigurierenpwcheck_method
.auxprop_plugin
in/etc/ldap/sasl2/slapd.conf
ignoriert.slapd
Verwendet stattdessen das, wofürolcSaslAuxprops
in der eigenen Konfigurationsdatenbank konfiguriert ist. Beachten Sie, dass dies sowohl für die impliziteauxprop
Methode beim AnfordernDIGEST-MD5
oder fürCRAM-MD5
Mechanismen als auch für die explizit konfigurierte Methodepwcheck_method: auxprop
beim Anfordern eines der beiden anderen Mechanismen gilt.saslauthd
werden die Anmeldeinformationen mit dem schmucklosen Hostnamen (dh nurldap-master
) alsdomain
Komponente nachgeschlagen. Wenn ich eine fundierte Vermutung anstellen würde, würde ich sagen, dass es so etwas wiegethostname()
eine Idee gibt, also könnte dies irgendwie konfigurierbar sein.auxprop
einen oder anderen Methodeslapd
der vollständig qualifizierte Domänenname (dhldap-master.example.com
) alsdomain
Komponente verwendet. Dies wird wahrscheinlich von der ursprünglichen Anforderungs-URL abgerufen (meine Alternativen zum Generieren der Anforderung sind begrenzt, wenn ich STARTTLS verwenden und das Serverzertifikat, das nach einem passenden Domänennamen fragt, korrekt überprüfen möchte), aber es kann wahrscheinlich sein konfiguriert durch EinstellenolcSaslHost
inslapd
der Konfigurationsdatenbank. Beachten Sie, dass ich nicht versucht habe, es zu konfigurieren.Um eine funktionierende Konfiguration zu erstellen, haben Sie mehrere Möglichkeiten:
PLAIN
undLOGIN
Mechanismen über STARTTLS einverstanden sind, konfigurieren Sie siepwcheck_method
nach/etc/ldap/sasl2/slapd.conf
Bedarf. Wenn dies der Fall sein sollauxprop
, konfigurieren Sie es aucholcSaslAuxprops
inslapd
der Konfigurationsdatenbank (setzen Sie essasldb
beispielsweise auf, wenn Sie es/etc/sasldb2
als Anmeldeinformationsspeicher verwenden möchten ).DIGEST-MD5
(ich sehe es normalerweiseCRAM-MD5
aufgrund schlechterer Sicherheit empfohlen, vermeiden Sie es also), legen Sie esolcSaslAuxprops
inslapd
der Konfigurationsdatenbank fest, da dieauxprop
Methode verwendet wird, unabhängig davon, wofür Sie sie konfigurierenpwcheck_method
.DIGEST-MD5
,CRAM-MD5
(aber versuchen zu vermeidenCRAM-MD5
) sowie der SatzPLAIN
,LOGIN
(stellen Sie sicher , diejenigen , die nur über eine verschlüsselte Verbindung verwendet werden, wie ein STARTTLS-on) und es vorziehen , die verwenden Sie sind auf dieselbe Authentifizierungsmethode für alle beschränkt und prüfen anhand derselben Anmeldeinformationen, auf die Sie beschränkt sindauxprop
. Konfigurieren Siepwcheck_method: auxprop
in/etc/ldap/sasl2/slapd.conf
und SatzolcSaslAuxprops
inslapd
‚s - Konfigurationsdatenbank nach Bedarf.Wenn Sie möchten , Mechanismen können Sätze von beiden verwenden , während verschiedene Authentifizierungsmethoden für sie verwenden (klingt wie eine Verwaltung Alptraum für mich, aber es Sie gehen), configure
pwcheck_method
in/etc/ldap/sasl2/slapd.conf
entsprechend fürPLAIN
undLOGIN
und denken Sie daran , dass Sie Gebrauch gezwungen sind ,auxprop
fürDIGEST-MD5
( undCRAM-MD5
wenn Sie darauf bestehen) und stellenolcSaslAuxprops
inslapd
‚s - Konfigurationsdatenbank nach Bedarf.Wenn Sie zufällig
saslauthd
für nicht beschädigte Mechanismen konfigurieren und sicherstellen, dass saslauthd auf eine andere Datenbankslapd
zugreift als die, über die zugegriffen wird,auxprop
oder etwas anderes alssasldb
für verwendetolcSaslAuxprops
, haben Sie diese gut getrennt und brauchen sich keine Sorgen zu machen.Wenn Sie zufällig
saslauthd
für nicht gehashte Mechanismen undsasldb
fürauxprop
die gehashten Mechanismen konfigurieren und diese auf dieselbe Datenbank mit Anmeldeinformationen zugreifen lassen, haben Sie drei Optionen in der Reihenfolge ihrer Präferenz:saslauthd
als auchslapd
der direkte Zugriff auf die sasldb durchauxprop
Abfragen der Anmeldeinformationen mit denselbendomain
(versuchenolcSaslHost
Siesaslauthd
, einen vollqualifizierten Domänennamen festzulegen oder zu erzwingen ) erforderlich sind , sodass Sie sich nur um einen Eintrag für Anmeldeinformationen pro Entität kümmern müssen, um sich zu authentifizieren.userid
-hostname
Paar für die ungehashte Mechanismen übersaslauthd
und verwenden Sie einuserid
-hostname.domain.name
Paar für die Hash - Mechanismen überauxprop
.quelle