Moin,
LDAP-Authentifizierung für gewisse URLs machen wir auch mit Apache gegen unser UCS. Das ist kein Hexenwerk.
Zu bedenken ist, dass man immer einen User im LDAP benötigt, mit dem sich der Apache am LDAP anmelden kann, um erst einmal den Account herauszusuchen, dessen Anmeldung überprüft werden soll. Das funktioniert in Summe grob so:
[ol][li]Apache sagt: »hier nur mit Authentifizierung!«[/li]
[li]Benutzer*in gibt Loginnamen und Passwort ein[/li]
[li]Apache verbindet sich zum LDAP-Server entweder anonym oder mit einem fest konfigurierten Account+Passwort.[/li]
[li]Apache durchsucht das LDAP nach einem Account mit dem Namen, der in Schritt 2 eingegeben wurde.[/li]
[li]Apache beendet die LDAP-Verbindung.[/li]
[li]Apache verbindet sich erneut zum LDAP und versucht dabei eine Anmeldung mit dem in Schritt 4 gefundenen Account und dem Passwort aus Schritt 2. Abhängig vom Ergebnis wird der Zugriff auf die URL erlaubt oder halt nicht.[/li][/ol]
Das Problem in Schritt 3 ist, dass ein UCS-LDAP standardmäßig keine anonymen Anmeldungen zulässt.
Also legen Sie einen Account im UCS nur dafür an. Bei uns heißt dieser User »ldapsearch«.
Anschließend konfigurieren Sie die Authentifizierung z.B. wie folgt (das ist für Apache 2.4.x und neuer; bei Apache 2.2.x sieht’s etwas anders aus):
AuthType Basic
AuthBasicProvider ldap
AuthName "LINET Services Interner Bereich"
AuthLDAPURL "ldap://ldap.bs.linet-services.de:7389/cn=users,dc=bs,dc=linet-services,dc=de?uid?sub?(&(univentionFreeAttribute5=1)(objectClass=posixAccount))" NONE
AuthLDAPBindDN "uid=ldapsearch,cn=users,dc=bs,dc=linet-services,dc=de"
AuthLDAPBindPassword "SuperGeheim!NichtVerraten!"
AuthLDAPBindAuthoritative Off
Require valid-user
Sie müssen natürlich mehrere Dinge anpassen: die URL, die BindDN (das ist der Account, der extra zum Durchsuchen angelegt wurde) und das BindPassword.
Bei der URL-Zeile können Sie einen LDAP-Filter mit angeben. Das ist bei uns der Teil »(&(univentionFreeAttribute5=1)(objectClass=posixAccount))«, der sagt: »liefere mir nur Objekte aus dem LDAP, bei denen das Attribut univentionFreeAttribute5 auf 1 gesetzt ist und die eine objectClass von posixAccount haben«. Wir nutzen das »univentionFreeAttribute5« für eine manuelles Festlegen, welcher User sich überhaupt extern authentifizieren darf.
Jetzt zum schwierigen Teil: Gruppenmitgliedschaft. Leider wird in einem OpenLDAP die Gruppenmitgliedschaft nicht am User-Objekt, sondern am Gruppen-Objekt gespeichert. Das bedeutet, dass man nicht einfach einen LDAP-Filter nutzen kann, um zu sagen: »nur Accounts aus Gruppe XYZ«.
Aber auch dafür gibt es bei UCS eine Lösung: wir verbinden uns einfach nicht mit dem OpenLDAP auf Port 7389, sondern mit dem Samba4-LDAP auf Port 389. Warum hilft das? Weil in einem ActiveDirectory-LDAP-Schema die Gruppenmitgliedschaft genau an den User-Objekten gespeichert wird und damit über einen LDAP-Filter greifbar wird.
Hier ein Beispiel, wie die entsprechende Apache-Konfiguration aussehen könnte (Achtung: das ist jetzt nicht getestet):
AuthType Basic
AuthBasicProvider ldap
AuthName "LINET Services Interner Bereich"
AuthLDAPURL "ldap://ldap.bs.linet-services.de:389/cn=users,dc=bs,dc=linet-services,dc=de?samAccountName?sub?(&(memberOf=CN=Lehrer,CN=Groups,DC=bs,DC=linet-services,DC=de)(objectClass=user))" NONE
AuthLDAPBindDN "ldapsearch@bs.linet-services.de"
AuthLDAPBindPassword "SuperGeheim!NichtVerraten!"
AuthLDAPBindAuthoritative Off
Require valid-user
Wichtige Änderungen gegenüber der OpenLDAP-Variante:
[ol][li]Die Portnummer ist 389 anstelle von 7389.[/li]
[li]Das ausuzwertende Attribut, in dem der Accountname steht, ist »samAccountName« anstelle von »uid«.[/li]
[li]Der Filter enthält zum Einen einen Eintrag für die Gruppe, zum Anderen ist die Objektlasse eine andere.[/li]
[li]Die BindDN hat eine andere Syntax: »username@domainname«. Sollte das nicht klappen, können Sie’s auch mit »domain\username« (bei uns »LINET\ldapsearch«) oder mit der DN des Objektes im Samba4-LDAP (bei uns: »cn=ldapsearch,cn=users,dc=bs,dc=linet-services,dc=de«) probieren.[/li][/ol]
Viel Erfolg.
Gruß,
mosu