Christian Seiler: Synchronisation MySQL<->Windows-Passwort

Beitrag lesen

Hallo Benjamin,

ldap_connect(...) funktioniert, ldap_bind(...) schlägt fehl, ganz gleich, ob die Zugangsdaten gültig sind oder nicht, ldap_error(...) sagt, es liegt an "Invalid credentials". Komischerweise funktioniert anonymes Binden, also ldap_bind($ldap_conn). Hmm...

Ich kenne mich mit der Active Directory nicht aus, dafür aber mit LDAP an sich. LDAP kennt 2 verschiedene Mechanismen, um einen Bind durchzuführen:

* Simple bind, d.h. einfach mit Usernamen + Passwort im Klartext über die
   Leitung (bzw. wenn SSL/TLS verwendet wird halt schon verschlüsselt, aber
   nicht auf LDAP-Protokollebene)
 * Bind über SASL (was z.B. auch bei SMTP Auth verwendet wird) - SASL ist
   eigentlich keine Authentifizierungsart, sondern ein Standard, bei dem
   Client und Server einen sicheren Authentifizierungsmechanismus aushandeln
   können - bzw. als Fallback existiert immer noch Username + Passwort im
   Klartext - *allerdings* ist SASL + Klartextauth nicht das gleiche wie
   ein simple bind!

PHPs ldap_bind() führt einen simple bind durch. Keine Ahnung, ob's zutrifft, aber es kann sein, dass die Active Directory einen SASL bind haben will (ich habe allerdings nicht den blassesten Schimmer!) - allerdings ist die PHP-Funktion ldap_sasl_bind nicht wirklich dokumentiert und ich habe sie auch noch nie verwendet.

Allerdings: es könnte auch an etwas anderem liegen:

$ldap_user = $username . "@" . LDAP_DOMAIN;

Das scheint mir *sehr* seltsam für einen LDAP-User zu sein. Kann natürlich sein, dass Active Directory das so will, allerdings sehen LDAP-User normalerweise anders aus.

LDAP ist ja ein Verzeichnis, d.h. eine Baumstruktur, in der alle Objekte gespeichert werden. Stellen wir uns vor, Deine Windows-Domäne heißt test.lan, dann wäre der DN im LDAP für die Domäne dn: dc=test,dc=lan. Wenn Du jetzt eine "Organisational Unit" namens "Users" darin hättest und darin befände sich ein User "benjamin", dann würde man den z.B. über dn: cn=benjamin,ou=Users,dc=test,dc=lan ansprechen können - d.h. Du würdest $ldap_user = "cn=".$username.",ou=Users,dc=test,dc=lan"; angeben. Der genaue Aufbau davon hängt stark von der Struktur des Verzeichnisses ab - ich habe keine Ahnung, ob die Active Directory da Vorgaben macht oder nicht, das müsstest Du mal nachlesen.

Im Zweifel würde ich mal OpenLDAP installieren und dann mit »ldapsearch« per anonymous bind auf den AD-Server zugreifen und einfach mal alles, was öffentlich zugänglich ist, dumpen. Vielleicht bekommst Du dann eine Info, welche Struktur Deinem LDAP innewohnt.

Viele Grüße,
Christian