Wie authentifiziere ich Benutzer in verschachtelten Gruppen in Apache LDAP?

21

Ich arbeite mit LDAP-Authentifizierung mit dem folgenden Setup

 AuthName            "whatever"
 AuthType            Basic
 AuthBasicProvider   ldap
 AuthLDAPUrl         "ldap://server/OU=SBSUsers,OU=Users,OU=MyBusiness,DC=company,DC=local?sAMAccountName?sub?(objectClass=*)"
 Require ldap-group  CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local

Das funktioniert, aber ich muss alle Benutzer angeben, bei denen ich mich authentifizieren möchte MySpecificGroup. Aber auf LDAP-Server habe ich konfiguriert, dass MySpecificGroupauch die Gruppe MyOtherGroupmit einer anderen Liste von Benutzern enthält.

Diese Benutzer MyOtherGroupsind jedoch nicht authentifiziert. Ich muss sie manuell hinzufügen MySpecificGroupund kann die verschachtelte Gruppierung im Grunde nicht verwenden. Ich verwende Windows SBS 2003.

Gibt es eine Möglichkeit, Apache LDAP dafür zu konfigurieren? Oder gibt es ein Problem mit einer möglichen unendlichen Rekursion und somit nicht erlaubt?

Kennzeichen
quelle

Antworten:

19

Sie müssen festlegen AuthLDAPSubGroupDepth, damit dies funktioniert. Die hier angegebene Ganzzahl gibt die maximale Schachtelungstiefe für Untergruppen an, die ausgewertet wird, bevor die Benutzersuche abgebrochen wird.

Fügen Sie dies zu Ihrer Konfiguration hinzu:

AuthLDAPSubGroupDepth 1

Mehr Infos: hier und hier .

Bart De Vos
quelle
Ich verwende Apache 2.2, die Anweisung mod_authnz_ldap hat keine AuthLDAPSubGroupDepth: httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html
Selivanov Pavel
Warum also nicht aktualisieren?
Bart De Vos
2
Ich verwende Debian Squeeze und bevorzuge Pakete aus einer stabilen Distribution: gut getestete, regelmäßige Sicherheitsupdates. Apache 2.3 ist noch in der Beta-Phase und wird in Kürze in Stable- oder Stable-Backports erscheinen. Ich habe dieses Problem mit vorerst gelöst AuthnProviderAlias. Wenn niemand eine Lösung für Apache 2.2 anbietet, liegt die Prämie bei Ihnen :)
Selivanov Pavel
Angesichts der neuen Informationen der Gruppen, die sich auf verschiedenen Servern befinden, glaube ich nicht, dass diese Methode weiterhin funktioniert.
Jeff Strunk
3
AuthLDAPSubGroupDepth ist in Apache HTTPd 2.4 nicht vorhanden. AuthLDAPMaxSubGroupDepth ist die richtige Anweisung.
Chris Harris
33

Außerdem AuthLDAPSubGroupDepthist dies nur in Apache 2.4 verfügbar. Wenn Sie Microsoft AD LDAP verwenden, können Sie die Autorisierung mithilfe verschachtelter Gruppen mithilfe der Übereinstimmungsregel LDAP_MATCHING_RULE_IN_CHAIN ​​durchführen. Dies ist viel schneller als das Durchsuchen von Untergruppen auf dem Client, da dies auf dem DC-Server mit weniger Abfragen über das Netzwerk erfolgt.

Require ldap-filter memberof:1.2.840.113556.1.4.1941:=CN=Access to Apache,OU=My Organization Unit,DC=company,DC=com

Die Zeichenfolge 1.2.840.113556.1.4.1941ist eine OID, die aufgerufen wird LDAP_MATCHING_RULE_IN_CHAIN. Diese OID wird von Microsoft zur Verwendung mit der LDAP-Implementierung (Teil von Active Directory) zugewiesen. Sie können es nicht mit anderen LDAP-Servern verwenden. Das vom Menschen redeable Format ist:iso(1).member_body(2).us(840).microsoft(113556).ad(1).as_schema(4).LDAP_MATCHING_RULE_IN_CHAIN(1941)

Aus der Microsoft-Dokumentation:

Diese Regel ist auf Filter beschränkt, die für den DN gelten. Dies ist ein spezieller "erweiterter" Übereinstimmungsoperator, der die Kette von Vorfahren in Objekten bis zum Stamm durchläuft, bis eine Übereinstimmung gefunden wird.

Siehe auch:

Mircea Vutcovici
quelle
Ich würde diese 10x erhöhen, wenn ich könnte. Für Leute mit RHEL 5 ist dies eine großartige Lösung. Das Kompilieren der Lieferantenquelle, um die neuesten Funktionen zu erhalten, ist nicht immer eine wünschenswerte Lösung!
Aaron Copley
Ich bin froh, dass es geholfen hat. Ich denke, dies war die erste dokumentierte Verwendung von LDAP_MATCHING_RULE_IN_CHAIN ​​in Apache.
Mircea Vutcovici
Gibt es eine Möglichkeit, die LDAP_MATCHING_RULE_IN_CHAINrekursive Gruppenmitgliedschaft abzurufen und als Header an einen Back-End-Server zu übergeben (mit dem Apache als Reverse-Proxy)?
Gershon Papi
mod_authnz_ldapbietet dies nicht. Sie können jedoch LDAP_MATCHING_RULE_IN_CHAINLDAP-Filter in Ihrer Anwendung verwenden. Siehe: stackoverflow.com/a/34075052/290087
Mircea Vutcovici
6

Es sieht so aus, als ob Ihre einzige Option in Apache 2.2 darin besteht, jede Gruppe aufzulisten, die von Ihrer autorisierten Hauptgruppe aufgenommen wurde.

Require ldap-group  CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Require ldap-group  CN=MyOtherGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local

Dies sollte sinnvoll sein, wenn Ihre verschachtelten Gruppen nicht zu kompliziert sind.


Crossing AD Domains (mit zwei LDAP-Servern)

Sie können OpenLDAP mit dem Overlay slapd_meta einrichten, das auf Ihrem Webserver ausgeführt wird, um Ihre Authentifizierung als Proxy zu verwenden.

/etc/ldap/slapd.conf sollte ungefähr so ​​aussehen:

database meta
suffix   "DC=company,DC=local"
uri      "ldap://a.foo.com/OU=MyBusiness,DC=company,DC=local"
uri      "ldap://b.foo.com/OU=otherdomainsuffix,DC=company,DC=local"

Dann würde Ihre Zeilengruppe mod_authnz_ldap ungefähr so ​​aussehen:

AuthName            "whatever"
AuthType            Basic
AuthBasicProvider   ldap
AuthLDAPUrl         "ldapi:///DC=company,DC=local?sAMAccountName?sub?(objectClass=*)"
Require ldap-group  CN=MySpecificGroup,OU=Security Groups,OU=MyBusiness,DC=company,DC=local
Require ldap-group  CN=MyOtherGroup,OU=Security Groups,OU=otherdomainsuffix,DC=company,DC=local

Dies erfordert einige Massagen, um es zum Laufen zu bringen, aber ich denke, das ist die allgemeine Idee.

Jeff Strunk
quelle
1
Leider funktioniert dies nicht, wenn sich Gruppen in verschiedenen AD-Domänen befinden (Domain1_DomainLocal_Group enthält Domain2_Global_Group). Es war das erste, was ich versuchte :)
Selivanov Pavel
Bedeutet das, dass sich eine der Gruppen auf einem anderen Server befindet? Wenn dies zutrifft, wird AuthLDAPSubGroupDepth vermutlich auch bei Ihnen nicht funktionieren.
Jeff Strunk
Ja, zwei Server, zwei Domänen. Ich habe überlegt, die Linux-Box in AD zu integrieren und die PAM-Authentifizierung zu verwenden, aber mod-auth-pam wird nicht unterstützt, da apache 2.0, mod-authnz-external + pwauth keine Gruppen unterstützt. Das alles ist leider :(
Selivanov Pavel
1
Oh, ich habe nicht bemerkt, dass Sie die Antwort aktualisiert haben. Die Verwendung von OpenLDAP slapd_meta mag eine Lösung sein, bringt jedoch den Hauptpunkt dieser Konfiguration zum Erliegen: Verwalten Sie Benutzerrechte in einem einzigen Punkt (Active Directory), indem Sie Benutzer zu Gruppen hinzufügen / daraus entfernen und Gruppen ineinander aufnehmen. Hier ist meine analoge Lösung mit AuthnProviderAlias ​​ohne zusätzlichen OpenLDAP-Dienst: -ldap
Selivanov Pavel
1
Ich habe beschlossen, Bart De Vos ein Kopfgeld zu geben: das ist nicht meine Frage; für die ursprüngliche Frage (ohne meine eigene spezifische) ist seine Lösung einfach und wird funktionieren
Selivanov Pavel
4

Während die von @Mircea_Vutcovici bereitgestellte Lösung für mich funktioniert hat, ist mein einziger Kritikpunkt, dass die Leute möglicherweise zimperlich werden, wenn sie bitweise Operatoren im Einsatz sehen.

Zum Beispiel übergebe ich eine Apache Bloodhound-Installation, die Apache HTTPd als Front-End mit AD-Gruppenauthentifizierung verwendet, an eine Gruppe von Mitentwicklern. Sie werden Probleme mit bitweisen Operatoren haben. Admins werden natürlich nicht so zimperlich sein ... Ich hoffe.

Davon abgesehen habe ich eine Lösung, die nicht den bitweisen Operator verwendet und die nicht mehrere LDAP-Gruppendefinitionen verwendet.

Die folgende Konfiguration funktioniert für mich:

<Location /protected>
    # Using this to bind
    AuthLDAPURL "ldap://<MY_SERVER>:3268/<MY_SEARCH_BASE>?sAMAccountName?sub?(objectClass=user)"
    AuthLDAPBindDN "<MY_BIND_DN>"
    AuthLDAPBindPassword "<MY_PASSWORD>"
    LDAPReferrals Off

    AuthType Basic
    AuthName "USE YOUR AD ACCOUNT"
    AuthBasicProvider ldap
    Require ldap-group <MY_PARENT_GROUP>
    AuthLDAPMaxSubGroupDepth 1
    AuthLDAPSubgroupAttribute member
    AuthLDAPSubGroupClass group
    AuthLDAPGroupAttribute member
    AuthLDAPGroupAttributeIsDN on
</Location>

Der kritische Teil war die folgende Konfiguration:

AuthLDAPSubGroupClass group

AuthLDAPMaxSubGroupDepth funktioniert weder für sich noch in Verbindung mit AuthLDAPSubgroupAttribute. Erst als ich AuthLDAPSubGroupClass verwendete, funktionierte die Authentifizierung für Untergruppen ... zumindest für mich und meine Situation.

Chris Harris
quelle