🛠️OpenLDAP
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
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.
📚 Quellen: OpenLDAP Software 2.6 Administrator's Guide · slapd.access(5) · slapd-mdb(5)
⚙️cn=config oder slapd.conf?
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.dinclude /etc/openldap/schema/core.schema include /etc/openldap/schema/cosine.schema include /etc/openldap/schema/inetorgperson.schema
ldapadd -Y EXTERNAL -H ldapi:/// \
-f /etc/openldap/schema/cosine.ldif
# → cn={1}cosine,cn=schema,cn=configldapmodify -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)
$ 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
- ·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
| Attribut | auth | compare | search | read | write |
|---|---|---|---|---|---|
| entry | |||||
| userPassword | |||||
| cn | |||||
| description |
to * ganz oben fängt alles ab – die userPassword-Regel darunter wird nie erreicht. Deshalb stehen Passwort-Regeln zuerst.by anonymous auth erlaubt den Passwortvergleich beim Bind, ohne den Hash lesbar zu machen. Ohne diese Klausel kann sich niemand anmelden.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
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: 100Checkpoint schreibt contextCSN nach 100 Operationen oder 10 Minuten; standardmäßig aus.
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: TRUELaut slapo-memberof(5) kann auch das Overlay dynlist diese Funktion übernehmen.
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 managerPasswort-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=orgDie Richtlinie selbst ist ein Eintrag (objectClass pwdPolicy) im Verzeichnis.
Protokolliert Operationen in eine eigene Datenbank – Grundlage für Delta-syncrepl und Auditierung.
olcAccessLogDB: cn=accesslog olcAccessLogOps: writes
Erzwingt eindeutige Attributwerte (z. B. uid oder mail) innerhalb eines Teilbaums.
olcUniqueURI: ldap:///ou=people,dc=example,dc=org?uid,mail?sub
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
Ausgangslage
Der Provider hat das Overlay syncprov geladen. Der Consumer ist leer und hat noch kein Cookie.
# 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# 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: TRUErid 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
| Werkzeug | Art | Zweck | Beispiel |
|---|---|---|---|
| ldapsearch | online | Suchen (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 |
| ldapadd | online | Einträge anlegen (= ldapmodify -a) | ldapadd -x -H ldap://ldap.example.org -ZZ -D "cn=admin,dc=example,dc=org" -W -f neu.ldif |
| ldapmodify | online | Ändern per LDIF (changetype: modify/delete/modrdn); -c macht nach Fehlern weiter | ldapmodify -x -H ldap://ldap.example.org -ZZ -D "cn=admin,dc=example,dc=org" -W -c -f aenderungen.ldif |
| ldapmodify (cn=config) | online | Konfiguration als root über den lokalen Socket ändern (SASL EXTERNAL) | ldapmodify -Y EXTERNAL -H ldapi:/// -f index.ldif |
| ldapdelete | online | Löschen; -r löscht rekursiv | ldapdelete -x -H ldap://ldap.example.org -ZZ -D "cn=admin,dc=example,dc=org" -W "uid=eva.fischer,ou=people,dc=example,dc=org" |
| ldapwhoami | online | Wer 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 |
| ldappasswd | online | Passwort ä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 |
| slapcat | offline | Datenbank als LDIF exportieren (Backup); -n 0 = cn=config | slapcat -n 1 -l backup.ldif && slapcat -n 0 -l config.ldif |
| slapadd | offline | LDIF importieren (slapd gestoppt, schnell, z. B. Wiederherstellung) | slapadd -n 1 -F /etc/openldap/slapd.d -l backup.ldif |
| slapindex | offline | Indexe neu aufbauen (nach Index-Änderung in slapd.conf) | slapindex -n 1 -F /etc/openldap/slapd.d |
| slaptest | offline | Konfiguration prüfen bzw. slapd.conf nach cn=config umwandeln | slaptest -f /etc/openldap/slapd.conf -F /etc/openldap/slapd.d |
| slapacl | offline | Zugriffsregeln prüfen, ohne Client | 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" "userPassword/write" |
| slappasswd | offline | Passwort-Hash erzeugen (Standard {SSHA}) | slappasswd -s beispiel-passwort |
| slapschema | offline | Alle Einträge gegen das aktuelle Schema prüfen | slapschema -F /etc/openldap/slapd.d |
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)