🛠️OpenLDAP

OpenLDAP besteht aus dem Server slapd, den Client-Werkzeugen (ldapsearch, ldapmodify …) und Offline-Werkzeugen (slapcat, slapadd …). Angaben nach Admin Guide 2.6 und den man-Seiten; das Verhalten ist mit OpenLDAP 2.7 nachgeprüft.

🏗️Der Weg einer Anfrage durch slapd

💻 Client (ldapsearch, SSSD, Web-App …)
Listener
ldap://:389 · ldaps://:636 · ldapi:///
Frontend
BER dekodieren, Bind/SASL, Schema, olcAccess, Limits
Datenbank-Auswahl
nach Suffix: cn=config · dc=example,dc=org · cn=Monitor
Overlays
syncprov · memberof · refint · ppolicy …
Backend mdb
LMDB-Datei, Indexe (olcDbIndex)
/var/lib/openldap/data.mdb
Schritt 1

Verbindung

Der Client öffnet TCP-Port 389. Mit -ZZ folgt sofort StartTLS; ldaps:// auf 636 spricht von Anfang an TLS, ldapi:// ist ein lokaler Unix-Socket.

Schritt 1 / 8 · Tasten ← →

📚 Quellen: OpenLDAP Software 2.6 Administrator's Guide · slapd.access(5) · slapd-mdb(5)

⚙️cn=config oder slapd.conf?

Seit OpenLDAP 2.3 kann die Konfiguration selbst ein LDAP-Baum sein (OLC, „On-Line Configuration“): Änderungen per ldapmodify wirken ohne Neustart. slapd.conf ist weiter möglich; slaptest wandelt sie um.
cn=config                    ← global (olcLogLevel …)
├── cn=module{0}             ← Module (back_mdb …)
├── cn=schema                ← eingebautes Schema
│   ├── cn={0}core
│   ├── cn={1}cosine
│   ├── cn={2}inetorgperson
│   └── cn={3}beispiel       ← eigenes Schema
├── olcDatabase={-1}frontend ← Vorgaben für alle
├── olcDatabase={0}config    ← die Konfiguration
└── olcDatabase={1}mdb       ← dc=example,dc=org
    ├── olcOverlay={0}syncprov
    └── olcOverlay={1}memberof

{n} = Reihenfolge, beim Anlegen automatisch vergeben
$ slaptest -f slapd.conf -F slapd.d
slapd.conf – Neustart nötig
include /etc/openldap/schema/core.schema
include /etc/openldap/schema/cosine.schema
include /etc/openldap/schema/inetorgperson.schema
cn=config – per LDAP, sofort wirksam
ldapadd -Y EXTERNAL -H ldapi:/// \
  -f /etc/openldap/schema/cosine.ldif
# → cn={1}cosine,cn=schema,cn=config
💡 Wer darf cn=config ändern?
Üblich ist der lokale root über den Unix-Socket: ldapmodify -Y EXTERNAL -H ldapi:///. slapd erkennt ihn als gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth und gewährt über eine olcAccess-Regel auf olcDatabase={0}config das Recht manage.

📚 Quellen: Admin Guide: Configuring slapd (cn=config) · slapd-config(5) · slapd.conf(5) · slaptest(8)

🛡️ACL-Auswerter (olcAccess)

Regeln werden von oben nach unten geprüft; es zählt die erste passende <what>-Angabe und darin die erste passende <who>-Klausel. Probiere die Anfrage aus und verfolge jede Entscheidung. Die Beispielregeln liefern hier dieselben Ergebnisse wie slapacl.
✅ ALLOWED
Regel {1} entscheidet: =rscxd
Rechte: =rscxd (read) · benötigt: =r
$ slapacl -F /etc/openldap/slapd.d -D "uid=anna.schmidt,ou=people,dc=example,dc=org" -b "uid=anna.schmidt,ou=people,dc=example,dc=org" "mail/read"

🔍 Auswertung Regel für Regel

{0}to attrs=userPasswordübersprungenAttribut „mail“ nicht in attrs=userPassword
{1}to attrs=mail<what> passtpasst (attrs=mail)
  • ·by dn.exact="cn=mailserver,ou=system,dc=example,dc=org" readBind-DN passt nicht (genau dieser DN „cn=mailserver,ou=system,dc=example,dc=org“)
  • 👉by users readAnfrage ist authentifiziert=rscxd · stop

🧮 Rechte-Matrix für Anna (Vertrieb) auf uid=anna.schmidt

Attributauthcomparesearchreadwrite
entry
userPassword
mail
cn
description
⚠️ Reihenfolge: speziell vor allgemein
Eine Regel to * ganz oben fängt alles ab – die userPassword-Regel darunter wird nie erreicht. Deshalb stehen Passwort-Regeln zuerst.
💡 auth statt read
by anonymous auth erlaubt den Passwortvergleich beim Bind, ohne den Hash lesbar zu machen. Ohne diese Klausel kann sich niemand anmelden.
⚠️ continue ist tückisch
Nach continue ohne weitere passende Klausel greift das implizite by * none – slapacl bestätigt: die gesammelten Rechte verfallen. Die Prosa in slapd.access(5) klingt anders; im Zweifel mit slapacl prüfen.

📚 Quellen: slapd.access(5) · Admin Guide: Access Control · slapacl(8)

🧩Overlays

Overlays sind Zwischenschichten, die sich vor ein Backend hängen und Operationen verändern oder ergänzen.
🔁syncprov

Macht die Datenbank zum Replikations-Provider (LDAP Content Synchronization, RFC 4533).

dn: olcOverlay=syncprov,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcSyncProvConfig
olcOverlay: syncprov
olcSpCheckpoint: 100 10
olcSpSessionlog: 100

Checkpoint schreibt contextCSN nach 100 Operationen oder 10 Minuten; standardmäßig aus.

🔗memberof

Pflegt beim Ändern von Gruppen (groupOfNames/member) das Rückwärtsattribut memberOf in den Mitgliedseinträgen.

dn: olcOverlay=memberof,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcMemberOf
olcOverlay: memberof
olcMemberOfRefInt: TRUE

Laut slapo-memberof(5) kann auch das Overlay dynlist diese Funktion übernehmen.

🧷refint

Referentielle Integrität: wird ein Eintrag gelöscht oder umbenannt, werden DN-Verweise (z. B. member, manager) nachgezogen.

dn: olcOverlay=refint,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcRefintConfig
olcOverlay: refint
olcRefintAttribute: member manager
🔐ppolicy

Passwort-Richtlinien: Mindestlänge, Ablauf, Sperre nach Fehlversuchen, Historie.

dn: olcOverlay=ppolicy,olcDatabase={1}mdb,cn=config
objectClass: olcOverlayConfig
objectClass: olcPPolicyConfig
olcOverlay: ppolicy
olcPPolicyDefault: cn=standard,ou=policies,dc=example,dc=org

Die Richtlinie selbst ist ein Eintrag (objectClass pwdPolicy) im Verzeichnis.

📒accesslog

Protokolliert Operationen in eine eigene Datenbank – Grundlage für Delta-syncrepl und Auditierung.

olcAccessLogDB: cn=accesslog
olcAccessLogOps: writes
☝️unique

Erzwingt eindeutige Attributwerte (z. B. uid oder mail) innerhalb eines Teilbaums.

olcUniqueURI: ldap:///ou=people,dc=example,dc=org?uid,mail?sub
🧮dynlist

Dynamische Gruppen und Listen über LDAP-URLs; kann auch memberOf berechnen.

olcDynListAttrSet: groupOfURLs memberURL member

📚 Quellen: Admin Guide: Overlays · slapo-syncprov(5) · slapo-memberof(5) · slapo-refint(5) · slapo-ppolicy(5)

🔁Replikation mit syncrepl

Der Consumer holt sich Änderungen vom Provider (Pull). Jeder Eintrag trägt eine entryCSN, die Datenbank einen contextCSN – der Consumer merkt sich im Cookie, bis wohin er synchron ist.
🕒 12:00:02 UTC

Ausgangslage

Der Provider hat das Overlay syncprov geladen. Der Consumer ist leer und hat noch kein Cookie.

🗄️ Provider (syncprov)
uid=anna.schmidt
mail: anna.schmidt@example.org
entryCSN: 20260929120000.000000Z#000000#000#000000
uid=ben.mueller
mail: ben.mueller@example.org
entryCSN: 20260929120001.000000Z#000000#000#000000
contextCSN: 20260929120001.000000Z#000000#000#000000
🪞 Consumer
(leer)
contextCSN: –
Cookie: (keins)
Schritt 1 / 4 · Tasten ← →
Consumer einrichten
# Consumer (cn=config): repliziert dc=example,dc=org vom Provider
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncrepl
olcSyncrepl: rid=001
  provider=ldap://ldap1.example.org
  starttls=critical
  bindmethod=simple
  binddn="cn=replicator,ou=system,dc=example,dc=org"
  credentials=beispiel-passwort
  searchbase="dc=example,dc=org"
  type=refreshAndPersist
  retry="60 10 300 +"
-
add: olcUpdateRef
olcUpdateRef: ldap://ldap1.example.org
Multi-Provider (früher „Mirror Mode“/„Multi-Master“)
# Auf beiden Servern gleich (cn=config)
dn: cn=config
changetype: modify
replace: olcServerID
olcServerID: 1 ldap://ldap1.example.org
olcServerID: 2 ldap://ldap2.example.org

dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncrepl
olcSyncrepl: rid=001 provider=ldap://ldap1.example.org ...
olcSyncrepl: rid=002 provider=ldap://ldap2.example.org ...
-
replace: olcMultiProvider
olcMultiProvider: TRUE

rid ist höchstens dreistellig (0–999), olcServerID liegt zwischen 0 und 4095 und muss für Multi-Provider ungleich 0 sein. Ohne retry versucht es syncrepl stündlich für immer; interval gilt für refreshOnly (Standard: 1 Tag).

📚 Quellen: Admin Guide: Replication · RFC 4533 – LDAP Content Synchronization Operation · slapd-config(5) · slapo-syncprov(5)

🧰Werkzeuge

Online-Werkzeuge sprechen LDAP mit einem laufenden Server. Offline-Werkzeuge lesen die Datenbank direkt – slapadd, slapindex und schreibende Aktionen nur bei gestopptem slapd.
WerkzeugArtZweckBeispiel
ldapsearchonlineSuchen (Protokoll, auch gegen entfernte Server)ldapsearch -x -H ldap://ldap.example.org -ZZ -D "uid=anna.schmidt,ou=people,dc=example,dc=org" -W -b "dc=example,dc=org" -s sub -LLL "(&(objectClass=inetOrgPerson)(ou=Vertrieb))" cn mail
ldapaddonlineEinträge anlegen (= ldapmodify -a)ldapadd -x -H ldap://ldap.example.org -ZZ -D "cn=admin,dc=example,dc=org" -W -f neu.ldif
ldapmodifyonlineÄndern per LDIF (changetype: modify/delete/modrdn); -c macht nach Fehlern weiterldapmodify -x -H ldap://ldap.example.org -ZZ -D "cn=admin,dc=example,dc=org" -W -c -f aenderungen.ldif
ldapmodify (cn=config)onlineKonfiguration als root über den lokalen Socket ändern (SASL EXTERNAL)ldapmodify -Y EXTERNAL -H ldapi:/// -f index.ldif
ldapdeleteonlineLöschen; -r löscht rekursivldapdelete -x -H ldap://ldap.example.org -ZZ -D "cn=admin,dc=example,dc=org" -W "uid=eva.fischer,ou=people,dc=example,dc=org"
ldapwhoamionlineWer bin ich nach dem Bind? (RFC 4532)ldapwhoami -x -H ldap://ldap.example.org -ZZ -D "uid=anna.schmidt,ou=people,dc=example,dc=org" -W
ldappasswdonlinePasswort ändern (Password Modify Extended Operation)ldappasswd -x -H ldap://ldap.example.org -ZZ -D "uid=anna.schmidt,ou=people,dc=example,dc=org" -W -S
slapcatofflineDatenbank als LDIF exportieren (Backup); -n 0 = cn=configslapcat -n 1 -l backup.ldif && slapcat -n 0 -l config.ldif
slapaddofflineLDIF importieren (slapd gestoppt, schnell, z. B. Wiederherstellung)slapadd -n 1 -F /etc/openldap/slapd.d -l backup.ldif
slapindexofflineIndexe neu aufbauen (nach Index-Änderung in slapd.conf)slapindex -n 1 -F /etc/openldap/slapd.d
slaptestofflineKonfiguration prüfen bzw. slapd.conf nach cn=config umwandelnslaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d
slapaclofflineZugriffsregeln prüfen, ohne Clientslapacl -F /etc/openldap/slapd.d -D "uid=anna.schmidt,ou=people,dc=example,dc=org" -b "uid=anna.schmidt,ou=people,dc=example,dc=org" "userPassword/write"
slappasswdofflinePasswort-Hash erzeugen (Standard {SSHA})slappasswd -s beispiel-passwort
slapschemaofflineAlle Einträge gegen das aktuelle Schema prüfenslapschema -F /etc/openldap/slapd.d
✅ Backup, das wirklich zurückspielbar ist
slapcat -n 0 -l config.ldif sichert cn=config, slapcat -n 1 -l daten.ldif die Daten. Zurück geht es in derselben Reihenfolge mit slapadd -n 0 -F … und slapadd -n 1 … – bei gestopptem slapd und als Benutzer, unter dem slapd läuft.

📚 Quellen: ldapsearch(1) · ldapmodify(1) · slapcat(8) · slapadd(8) · slaptest(8) · slapacl(8) · slappasswd(8)