Signatur
Beschreibung
ldap_sasl_bind() ermöglicht die Authentifizierung gegenüber einem LDAP-Server über das SASL-Framework (Simple Authentication and Security Layer). Im Gegensatz zur einfachen ldap_bind()-Funktion, die nur Benutzername und Passwort im Klartext oder als einfaches Bind-Verfahren überträgt, unterstützt SASL eine Vielzahl sicherer Authentifizierungsmechanismen wie GSSAPI (Kerberos), DIGEST-MD5, PLAIN oder EXTERNAL (z. B. für TLS-Client-Zertifikate).
Die Funktion ist besonders in Unternehmensumgebungen relevant, in denen Single-Sign-On via Kerberos oder eine zertifikatsbasierte Authentifizierung eingesetzt wird. Der Parameter mech legt den gewünschten SASL-Mechanismus fest. Wird er weggelassen oder auf null gesetzt, verhandelt die zugrunde liegende SASL-Bibliothek den Mechanismus automatisch mit dem Server.
Die Funktion setzt voraus, dass PHP mit SASL-Unterstützung kompiliert wurde (d. h. die Bibliothek libsasl2 muss vorhanden und eingebunden sein). Auf vielen Standardinstallationen ist diese Unterstützung nicht automatisch aktiviert und muss explizit beim Build eingeschaltet werden.
Für den GSSAPI-Mechanismus wird in der Regel kein explizites Passwort benötigt, da die Credentials aus dem Kerberos-Ticket-Cache des Betriebssystems bezogen werden. In diesem Fall können dn und password als null übergeben werden.
Parameter
| Name | Typ | Default | Beschreibung |
|---|---|---|---|
| $ldap Pflicht | LDAP\Connection | Eine gültige LDAP-Verbindungsressource, wie sie von ldap_connect() zurückgegeben wird. |
|
| $dn | ?string | null | Der Distinguished Name (DN) des Benutzers, mit dem die Bindung erfolgen soll. Bei manchen Mechanismen (z. B. GSSAPI) kann null übergeben werden. |
| $password | ?string | null | Das Passwort des Benutzers. Bei Token- oder Zertifikat-basierten Mechanismen wie GSSAPI oder EXTERNAL wird dieser Wert ignoriert und sollte null sein. |
| $mech | ?string | null | Der gewünschte SASL-Mechanismus als Zeichenkette, z. B. 'GSSAPI', 'DIGEST-MD5', 'PLAIN' oder 'EXTERNAL'. Bei null wird der Mechanismus automatisch ausgehandelt. |
| $realm | ?string | null | Der SASL-Realm (Bereich), der für die Authentifizierung verwendet werden soll. Relevant z. B. bei DIGEST-MD5 oder Kerberos-basierten Mechanismen. |
| $authc_id | ?string | null | Die Authentifizierungs-Identität (Authentication Identity), also die tatsächlich zu prüfende Identität. Entspricht häufig dem Benutzernamen. |
| $authz_id | ?string | null | Die Autorisierungs-Identität (Authorization Identity). Ermöglicht es, im Namen eines anderen Benutzers zu agieren (Proxy-Authentifizierung), sofern der Server dies erlaubt. |
| $props | ?string | null | Zusätzliche SASL-Eigenschaften als Zeichenkette (z. B. 'minssf=56'), die an die SASL-Bibliothek übergeben werden. Das Format ist implementierungsabhängig. |
Rückgabewert
true zurück, wenn die SASL-Bindung erfolgreich war, andernfalls false. Im Fehlerfall können ldap_error() und ldap_errno() für weitere Diagnoseinformationen genutzt werden.Beispiele
SASL-Bindung mit GSSAPI (Kerberos)
<?php
// Voraussetzung: gültiges Kerberos-Ticket im System-Cache (z. B. via `kinit`)
$ldap = ldap_connect('ldap://ldap.example.com');
if (!$ldap) {
die('LDAP-Verbindung fehlgeschlagen.');
}
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ldap, LDAP_OPT_REFERRALS, 0);
$result = ldap_sasl_bind(
$ldap,
null, // DN nicht benötigt bei GSSAPI
null, // Passwort nicht benötigt
'GSSAPI', // SASL-Mechanismus
null, // Realm
null, // authc_id
null, // authz_id
null // props
);
if ($result) {
echo 'SASL-Bindung via GSSAPI erfolgreich.' . PHP_EOL;
} else {
echo 'Fehler: ' . ldap_error($ldap) . PHP_EOL;
}
ldap_unbind($ldap);
SASL-Bindung mit DIGEST-MD5 und Realm
<?php
$ldap = ldap_connect('ldap://ldap.example.com');
if (!$ldap) {
die('LDAP-Verbindung fehlgeschlagen.');
}
ldap_set_option($ldap, LDAP_OPT_PROTOCOL_VERSION, 3);
$result = ldap_sasl_bind(
$ldap,
'cn=serviceaccount,dc=example,dc=com',
'geheimes_passwort',
'DIGEST-MD5',
'EXAMPLE.COM', // Kerberos/SASL-Realm
'serviceaccount', // authc_id
null, // authz_id (kein Proxy)
null
);
if ($result) {
echo 'SASL-Bindung via DIGEST-MD5 erfolgreich.' . PHP_EOL;
// Beispiel: LDAP-Suche durchführen
$search = ldap_search($ldap, 'dc=example,dc=com', '(objectClass=person)', ['cn', 'mail']);
$entries = ldap_get_entries($ldap, $search);
echo 'Gefundene Einträge: ' . $entries['count'] . PHP_EOL;
} else {
echo 'Fehler: ' . ldap_error($ldap) . PHP_EOL;
}
ldap_unbind($ldap);
// Wichtig · Fallstricke
Voraussetzungen: ldap_sasl_bind() erfordert, dass PHP mit SASL-Unterstützung gebaut wurde. Auf Debian/Ubuntu-Systemen z. B. muss das Paket libsasl2-dev beim Kompilieren vorhanden sein. Viele Standard-PHP-Pakete in Linux-Distributionen enthalten diese Unterstützung nicht. Prüfe mit phpinfo(), ob SASL unter dem LDAP-Abschnitt aufgeführt ist.
Sicherheitshinweis: Mechanismen wie PLAIN oder SIMPLE übertragen Zugangsdaten unverschlüsselt. Verwende diese Mechanismen ausschließlich über gesicherte Verbindungen (LDAPS oder StartTLS via ldap_start_tls()). Bevorzuge wann immer möglich GSSAPI oder EXTERNAL mit Client-Zertifikaten.
Proxy-Authentifizierung: Der Parameter authz_id erlaubt es einem privilegierten Dienst-Account, im Namen anderer Benutzer zu agieren. Dies muss serverseitig explizit konfiguriert und erlaubt sein (OpenLDAP: authz-policy). Fehlkonfiguration kann zu unbeabsichtigten Berechtigungseskalationen führen.
Ab PHP 8.1: Der erste Parameter ist vom Typ LDAP\Connection (Objekt) statt der früheren Ressource (resource).