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:

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.

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.

  1. Ich installiere das Debian-Paket sasl2-bin. Durch dieses Paket werden diverse Hilfstools rund um SASL installiert.
  2. Als Beispiel lege ich einen SASL Benutzer an sasladmin@slpad.ldap.
  3. 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 😉
  4. Die SASL Konfiguration für OpenLDAP /etc/ldap/sasl2/slapd.conf wird angelegt und entsprechend mit den notwendigen Dateisystemsrechten versehen.

Entgegen dem Eindruck der aus der OpenLDAP Dokumentation entstehen könnte braucht man für DIGEST-MD5 keinen laufenden 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:

  1. Zum einen setze ich eine Umschreibe-Regeln von dem SASL Benutzer auf einem LDAP internen Benutzer
  2. 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.