Start · Sprachen · PHP · Referenz · ldap_sasl_bind

ldap_sasl_bind

Funktion

Authentifiziert eine LDAP-Verbindung mittels SASL (Simple Authentication and Security Layer) und unterstützt dabei verschiedene Mechanismen wie GSSAPI, DIGEST-MD5 oder EXTERNAL.

seit PHP 5.0.0 Kategorie: misc

Signatur

ldap_sasl_bind(LDAP\Connection $ldap, ?string $dn = null, ?string $password = null, ?string $mech = null, ?string $realm = null, ?string $authc_id = null, ?string $authz_id = null, ?string $props = null): bool

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

Typ
bool
Beschreibung
Gibt 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 via GSSAPI erfolgreich.

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);
SASL-Bindung via DIGEST-MD5 erfolgreich. Gefundene Einträge: 42

// 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).