Drupal Single Sign-on mit Windows-Domäne

Mo, 28.12.2009 - 13:12 -- Daniel Espendiller

Entwurf! Im Unternehmensnetzwerk hat man normalerweise eine zentrale Anwenderauthentifizierung. Das sollte in den meisten Fällen LDAP bzw. eine Windows-Domäne mit Active Directory sein, worüber sich alle Anwender mit Passwort anmelden. Nun ist es sinnvoll diese Anmeldedaten auch anderen Programme zur Verfügung zu stellen, somit spart man den Usern eine doppelte Anmeldung. Für den Apache und IIS-Server gibt es hierzu ein Module bzw. einen Modus womit einem Browser am Client gesagt wird, dass er die aktuellen Anwenderdaten mitschicken. Hierbei wird durch NTLM der Benutzernamen in einer HTTP-Headervariable REMOTE_USER vom Browser an den Webserver übertragen.

Apache

Für den Apache kann hierzu unter anderem die Erweiterung mod_auth_sspi.so genutzt werden. Nach Aktivierung des Erweiterung muss ein Pfad (dort wo die eigentliche Webanwendung liegt) hinterlegt werden, unterhalb die Authentifizierung nutzt werden soll. Ich habe dazu folgende Zeilen in die http.conf vom Apache eingetragen. Dadurch wird bei allen Aufrufen aus diesem Pfad, vom Browser der angemeldete Anwender mitgeschickt.
Was leider nicht geht, ist ein "Rückfallprodukt" ohne jegliche Authentifizierung, sollte der Browser-Client kein NTLM unterstützen (Stichwort: Linux, Firefox ohne explizite URL-Freigabe), bekommt der Anwender die Frage nach Benutzer und Kennwort. Hier können allerdings wieder seine gültigen Anwenderdaten eingetragen.

http.conf

<Directory "C:/httpd/drupal6">
    AllowOverride All
 
    AuthName "Intranet"
    AuthType SSPI
    SSPIAuth On
    SSPIAuthoritative off
 
    SSPIOmitDomain On
    SSPIUsernameCase lower
 
    SSPIOfferBasic on
 
    Require valid-user
 </Directory>

Probleme mit mod_auth_sspi

Ab bestimmten Versionen werden Formulardaten aus dem Internet Explorer „verschluckt“. Nach Abschicken eines Formulares zeigt sich keine Reaktion. Version 1.0.3 soll dieses Problem wohl nicht haben. Dazu eventuell den Link beachten mit einer 1.0.5 Version und Patch:Fixing mod_auth_sspi and IE losing POST data

NTLM unter Firefox

Da die NTLM Authenfizierung ursprünglich von Microsoft kommt, muss es bei anderen Browser wie dem Internet Explorer, erst freigegeben werden. Im Firefox geht das über die Variablen network.ntlm.send-lm-response und network.automatic-ntlm-auth.trusted-uris. Die Werte der Variablen entsprechend der eigenen Infrastruktur anpassen (siehe Screenshot).

Drupal

webserver_auth

Hat man die benötigten Module bzw. Einstellungen für den Webserver eingestellt, so wird über die Variable REMOTE_USER des aktuell angemeldete Benutzer vom Browser mitgeschickt, welche dann ausgewertet kann. Für Drupal muss man hierzu das Module Webserver authentication Module (webserver_auth) aktivieren. Sobald die Variable mitgeschickt wird, wird der Anwender automatisch eingeloggt und bei Bedarf sogar direkt ein neuer Benutzer innerhalb von Drupal angelegt.
Innerhalb der Module-Einstellung (siehe Screenshot) kann, wenn gewünscht, noch der Domänen-Anteil des Anwender entfernt werden. So das nur der eigentliche Benutzername in Drupal genutzt werden kann.
Nach Aktivierung des Modules sollte man darauf achten, dass ein Zugriff direkt auf dem Adminaccount nicht mehr geht, es sei denn er Adminname entspricht einem Username. Man sollte sich also vorher selber in die Gruppe Administratoren innerhalb von Drupal packen.

Alternative: Login über LDAP

Eine alternative Möglichkeit besteht darin, die User direkt am LDAP-Server (Windows-Domäne) zu authenfizieren, dies ist allerdings kein Single-Sign-On. Den Anwendern steht innerhalb von Drupal das normale Loginfenster zur Verfügung, wurde sich nicht eingeloggt, so bleibt man ein anonymer Nutzer.
Beim Login werden gleichzeitig die LDAP-Gruppen synchronisiert, wo durch alle Gruppen und deren Zugehörigkeiten im Drupal-System genutzt werden können (ldapgroups). Hier muss das Module LDAP integration aktiviert werden, nach hinterlegen der Daten für einen LDAP-Server bzw. Windows-Domäne-Controller und eines typischen LDAP-Syntax zur Benutzerfilterung, kann eine Anmeldung innerhalb von Drupal direkt am Active Directory gemacht werden.
Eventuell muss in der php.ini noch die LDAP-Erweiterung für PHP aktiviert werden. (Extension=php_ldap.dll - für Windows)
Angabe mehrerer Organisatorischer Einheiten innherhalb einer Serverkonfiguration des LDAP Modul für Drupal:

OU=EDV,DC=domain,DC=local
OU=Vertrieb,DC=domain,DC=local

Gruppen- und Benutzerinformationen synchronisieren

Nutzt man das Webserver authentication Module (webserver_auth), so findet keine Syncronisation zwischen dem AD (Active Directory) und dem angemeldet User statt. Man hat also nur den blanken User im Drupal ohne Gruppenzugehörigkeiten. Soll eine Synchronisation zwischen User und AD stattfinden. Muss man wieder auf das LDAP integration Module zurückgreifen.
Man kann beide Auth-Module gleichzeitig laufen lassen, allerdings schleichen sich ab und zu seltsame Fehlermeldungen ein. Es wurde deswegen ein extra Module LDAP Sync erstellt, welches bisher nur über die Kommentare innerhalb des LDAP integration zu finden ist. Über den Drupal-Cron Job werden mithilfe dieses Modules die Syncronisationen zwischen Drupal und Active Directory durchgeführt.