Eine kurze Anleitung wie man einem slapd von OpenLDAP dazu bringt Benutzer via SASL mit DIGEST-MD5 anmelden zu lassen. Selten in einem Titel bereits so viele Akronyme gehabt. Deswegen der Reihe nach:
- SASL = Simple Authentication and Security Layer (https://de.wikipedia.org/wiki/Simple_Authentication_and_Security_Layer)
- DIGEST-MD5 = Einer der standardisierten Mechanismen der Authentifizierung via SASL
- slapd = Der LDAP Server von OpenLDAP
- OpenLDAP = Ein freier LDAP Server (https://www.openldap.org)
Aber das alles ist unter Umständen ja bereits bekannt – warum sonst solltest Du Dich auf diese Seite verirrt haben? Was mich immer dran geärgert hat ist, dass aus der OpenLDAP Dokumentation zwar hervor geht wie alles funktioniert, ein praktisches Einrichtungsbeispiel aber schlichtweg fehlt. Dies möchte ich an dieser Stelle nach holen.
Und als Beispiel soll an dieser Stelle DIGEST-MD5 auch völlig ausreichen – auf die anderen Möglichkeiten will ich hier in diesem Posting gar nicht weiter eingehen.
Für die ungeduldigen Leser: Ganz unten ist mein Dockerfile angefügt sowie die ldif Datei mit der man cn=config anpassen kann sobald der slapd läuft. Docker bzw. ldapadd usw. ist noch nicht ganz Deins? In der Dockerfile stehen oben in den Kommentaren passende Beispiele wie das laufen könnte.
Docker
Um solche Sachen zu testen nutze ich ganz gern einen Docker Container. Ich mag es einfach, dass ich Dinge testen kann ohne groß irgendwas an Software installieren zu müssen. Und wenn man fertig ist kann man den Container bzw. das Image einfach so löschen und alles ist wieder spurlos verschwunden als ob es nie dagewesen wäre.
Natürlich geht das ganze auch ohne Docker. Dazu einfach die Schritte aus der Dockerfile
sinngemäß auf einem beliebigen slapd übernehmen.
Die Links zur Doku will ich natürlich nicht vorenthalten:
Umsetzung
Um rasch einen OpenLDAP Docker Container zu bekommen verwende ich ganz gerne dieses Image: https://hub.docker.com/r/osixia/openldap/. Das ist Debian basiert, klein, schlank und richtet einen grundlegend vorkonfigurierten slapd
Server ein. Wenn es schnell gehen muss oder man sich einfach die Arbeit sparen will selbst ein Image anzulegen: Meiner Meinung nach ein gutes Ausgangsimage!
Und was mache ich im Dockerfile? Wie gehabt, diese Schritte kann man ohne Docker sinngemäß auf dem Linux bzw. der Linux VM durchführen.
- Ich installiere das Debian-Paket
sasl2-bin
. Durch dieses Paket werden diverse Hilfstools rund um SASL installiert. - Als Beispiel lege ich einen SASL Benutzer an sasladmin@slpad.ldap.
- Der Benutzer unter welchem Debian slapd laufen lässt wird in die sasl Gruppe mit aufgenommen. Eben damit er die sasldb auch tatsächlich lesen kann 😉
- Die SASL Konfiguration für OpenLDAP
/etc/ldap/sasl2/slapd.conf
wird angelegt und entsprechend mit den notwendigen Dateisystemsrechten versehen.
saslauthd
. Das ist auch der Grund warum ich diesen Passus in der SASL Konfiguration übersprungen habe.slapd.conf bzw. cn=config
Nun fehlen noch Änderungen an der slapd.conf selbst. Wer das alte Konfigschema verwendet muss die entsprechende slapd.conf Datei sinngemäß bearbeiten, für alle mit neuem cn=config Schema liegt die passende ldif Datei mit dabei. Das von mir verwendete Image verwendet bereits cn=config und da das Dockerfile den slapd-Server erst noch konfiguriert läuft dieser nunmal auch noch nicht. Somit ist die ldif über die üblchen Wege im LDAP-Server mit aufzunehmen nach dem der Container am laufen ist.
Und das steht im config.ldif drin:
- Zum einen setze ich eine Umschreibe-Regeln von dem SASL Benutzer auf einem LDAP internen Benutzer
- Diesen Schritt kann man weglassen, funktioniert auch ohne: Ich habe die Verwendung von sasldb explizit gesetzt.
# # slapd Dockerfile inkl. SASL DIGEST-MD5 # # Starten mit: # docker build -t gmn-ldap --no-cache . # docker run -p 127.0.0.1:389:389 --rm --name gmn-ldap gmn-ldap # SASL Konfig in cn=config übernehmen # ldapadd -x -Dcn=admin,cn=config -wchangeme -f config.ldif # ldapsearch -ZZ -Hldap://localhost -YDIGEST-MD5 -U sasladmin@slapd.ldap # Suche mit: # ldapsearch -ZZ -Hldap://localhost -x -Dcn=admin,dc=gmn,dc=ldap -wchangeme FROM osixia/openldap ENV \ LDAP_ORGANISATION=gmn \ LDAP_DOMAIN=gmn.ldap \ LDAP_ADMIN_PASSWORD=changeme \ LDAP_CONFIG_PASSWORD=changeme \ LDAP_TLS_VERIFY_CLIENT=never # Notwendige Tools installieren RUN apt-get update && apt-get install -y sasl2-bin && apt-get clean # sasldb anlegen sowie notwendige Datei-/Gruppenrechte setzen RUN echo changeme | /usr/sbin/saslpasswd2 -c -u slapd.ldap sasladmin RUN usermod -a -G sasl openldap RUN echo "mech_list: EXTERNAL DIGEST-MD5 CRAM-MD5 PLAIN LOGIN" > /etc/ldap/sasl2/slapd.conf RUN chown openldap.sasl /etc/ldap/sasl2/slapd.conf && chmod 0660 /etc/ldap/sasl2/slapd.conf
dn: cn=config changeType: modify add: olcAuthzRegexp olcAuthzRegexp: uid=sasladmin@slapd.ldap,cn=digest-md5,cn=auth cn=admin,dc=gmn,dc=ldap dn: cn=config changeType: modify add: olcSaslAuxprops olcSaslAuxprops: sasldb
Test
Und so sieht es aus wenn man das jetzt testet, an einem einfachen ldapwhoami
gezeigt:
$ ldapwhoami -ZZ -Hldap://localhost -x -Dcn=admin,dc=gmn,dc=ldap -W Enter LDAP Password: dn:cn=admin,dc=gmn,dc=ldap $ ldapwhoami -ZZ -Hldap://localhost -YDIGEST-MD5 -U sasladmin@slapd.ldap SASL/DIGEST-MD5 authentication started Please enter your password: SASL username: sasladmin@slapd.ldap SASL SSF: 128 SASL data security layer installed. dn:cn=admin,dc=gmn,dc=ldap
Im ersten Aufruf ganz normal via simple bind direkt an den LDAP-Server, im zweiten via SASL/DIGEST-MD5. Gut zu sehen ist der Benutzernamen sasladmin@slapd.ldap welcher dank der Umschreibung als cn=admin,dc=gmn,dc=ldap zurück geliefert wird.