📡Operationen & Protokoll

LDAP ist ein Frage-Antwort-Protokoll über TCP. Jede Nachricht ist eine LDAPMessage mit einer messageID, BER-kodiert nach ASN.1. Die Bytes unten sind genau die, die auch ldapsearch senden würde – für Bind, Search und Unbind Byte für Byte mit einem Mitschnitt von OpenLDAP abgeglichen.

🎬Sequenzdiagramm

Wähle eine Operation und gehe Schritt für Schritt durch. Rechts siehst du die Nachricht als Baum und als Hex-Dump.
Entspricht auf der Kommandozeile
$ ldapsearch -x -H ldap://ldap.example.org -ZZ -D "uid=anna.schmidt,ou=people,dc=example,dc=org" -W -b "ou=people,dc=example,dc=org" -s sub "(ou=Vertrieb)" cn mail
💻 Client
🗄️ slapd
Schritt 1 / 8 · Tasten ← →

BindRequest

Client → Server

Simple Bind als uid=anna.schmidt,ou=people,dc=example,dc=org. Das Passwort steht im Klartext in der Nachricht – deshalb nur über TLS!

LDAPMessage als BER (Knoten anfahren markiert die Bytes)
000030 49 02 01 01 60 44 02 01 03 04 2c 75 69 64 3d 0I...`D....,uid=
001061 6e 6e 61 2e 73 63 68 6d 69 64 74 2c 6f 75 3d anna.schmidt,ou=
002070 65 6f 70 6c 65 2c 64 63 3d 65 78 61 6d 70 6c people,dc=exampl
003065 2c 64 63 3d 6f 72 67 80 11 62 65 69 73 70 69 e,dc=org..beispi
004065 6c 2d 70 61 73 73 77 6f 72 74 el-passwort
Tag + LängeInhalt75 Byte insgesamt

📚 Quellen: RFC 4511 – LDAP: The Protocol · RFC 4513 – LDAP: Authentication Methods and Security Mechanisms · RFC 4532 – LDAP "Who am I?" Operation · ITU-T X.690 – ASN.1 Encoding Rules (BER/CER/DER)

🧩Aufbau einer Nachricht

LDAPMessage ::= SEQUENCE {
     messageID       MessageID,          -- INTEGER (0 .. 2^31-1)
     protocolOp      CHOICE {
          bindRequest           BindRequest,       -- [APPLICATION 0]
          bindResponse          BindResponse,      -- [APPLICATION 1]
          unbindRequest         UnbindRequest,     -- [APPLICATION 2]
          searchRequest         SearchRequest,     -- [APPLICATION 3]
          searchResEntry        SearchResultEntry, -- [APPLICATION 4]
          searchResDone         SearchResultDone,  -- [APPLICATION 5]
          modifyRequest ... addRequest ... delRequest ...
          compareRequest ... extendedReq ... },
     controls       [0] Controls OPTIONAL }
Tag – Länge – Wert: 30 0c heißt „SEQUENCE, 12 Byte folgen“. 60 ist [APPLICATION 0] konstruiert = BindRequest. Längen über 127 Byte werden mehrbytig (81 c8 = 200).
Asynchron: Ein Client darf mehrere Anfragen gleichzeitig offen haben; Antworten werden über die messageID zugeordnet. Eine Suche liefert beliebig viele SearchResultEntry-Nachrichten und am Ende genau ein SearchResultDone.
Scope: baseObject (0) = nur die Basis, singleLevel (1) = direkte Kinder, wholeSubtree (2) = Basis und alles darunter. ldapsearch -s children nutzt zusätzlich subordinateSubtree (3) aus einem Entwurf – alles unterhalb, ohne Basis.

📚 Quellen: RFC 4511 – LDAP: The Protocol · ITU-T X.690 – ASN.1 Encoding Rules (BER/CER/DER)

🔑Bind-Varianten

Anonym
ldapsearch -x …

DN und Passwort leer. Erlaubt, solange olcDisallows nicht bind_anon enthält.

Unauthentifiziert
-D "uid=…" (ohne Passwort)

DN ohne Passwort. RFC 4513 warnt davor; slapd lehnt ab: 53 „unauthenticated bind (DN with no password) disallowed“.

Simple (Name/Passwort)
-x -D "uid=…" -W

Passwort im Klartext in der Nachricht – nur mit TLS (-ZZ oder ldaps://).

SASL
-Y EXTERNAL -H ldapi:///

Mechanismen wie EXTERNAL (Unix-Benutzer über den Socket oder TLS-Clientzertifikat), GSSAPI (Kerberos), SCRAM.

⚠️ 49 heißt nicht immer „falsches Passwort“
Ein unbekannter Bind-DN liefert ebenfalls 49 invalidCredentials – sonst könnte man ausprobieren, welche Konten existieren. Hat der Eintrag gar kein userPassword, antwortet slapd mit 48 inappropriateAuthentication.

📚 Quellen: RFC 4513 – LDAP: Authentication Methods and Security Mechanisms · slapd-config(5)

🔗LDAP-URLs

Eine LDAP-URL beschreibt eine komplette Suche in einer Zeile – benutzt z. B. in Referrals, in syncrepl-Konfigurationen (provider=) und in ldap.conf.
Schema
ldap
Klartext, TLS per StartTLS möglich
Host
ldap.example.org
Port
389
Standard
Basis-DN
ou=people,dc=example,dc=org
prozent-kodiert in der URL
Attribute
cn, mail
Scope
sub
angegeben
Filter
(ou=Vertrieb)
angegeben
Erweiterungen
–
Gleichwertiger Aufruf
$ ldapsearch -x -H ldap://ldap.example.org -b ou=people,dc=example,dc=org -s sub "(ou=Vertrieb)" cn mail

📚 Quellen: RFC 4516 – LDAP: Uniform Resource Locator