Frage Wie authentifiziert man Benutzer in verschachtelten Gruppen in Apache LDAP?


Ich arbeite 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 authentifizieren, in denen ich mich authentifizieren möchte MySpecificGroup. Aber auf dem LDAP-Server habe ich das konfiguriert MySpecificGroup enthält auch die Gruppe MyOtherGroup mit einer anderen Liste von Benutzern.

Aber diese Benutzer in MyOtherGroup sind nicht authentifiziert, ich muss sie alle manuell hinzufügen MySpecificGroup und grundsätzlich kann die verschachtelte Gruppierung nicht verwendet werden. Ich verwende Windows SBS 2003.

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


19
2018-05-13 10:22


Ursprung




Antworten:


Sie müssen einstellen AuthLDAPSubGroupDepth um das zu schaffen. Die Ganzzahl, die Sie hier angeben, gibt die maximale Schachtelungstiefe für Untergruppen an, die ausgewertet wird, bevor die Benutzersuche beendet wird.

Fügen Sie dies zu Ihrer Konfiguration hinzu:

AuthLDAPSubGroupDepth 1

Mehr Info: Hier und Hier.


18
2017-11-16 00:04



Ich betreibe Apache 2.2, es ist mod_authnz_ldap hat keine AuthLDAPSubGroupDepth Direktive: httpd.apache.org/docs/2.2/mod/mod_authnz_ldap.html - Selivanov Pavel
Also, warum nicht aktualisieren? - Bart De Vos
Ich benutze Debian Squeeze und bevorzuge Pakete aus der Stable Distribution: gut getestete, regelmäßige Sicherheitsupdates. Apache 2.3 ist noch Beta, es wird nicht bald in stabilen oder stabilen Backports erscheinen. Ich habe dieses Problem gelöst, indem ich verwendet habe AuthnProviderAlias zur Zeit. Wenn niemand Lösung für Apache 2.2 anbietet, ist Kopfgeld Ihr :) - Selivanov Pavel
Angesichts der neuen Informationen der Gruppen, die sich auf verschiedenen Servern befinden, glaube ich nicht, dass diese Methode noch funktionieren wird. - Jeff Strunk
AuthLDAPSubGroupDepth existiert nicht in Apache HTTPd 2.4. AuthLDAPMaxSubGroupDepth ist die richtige zu verwendende Anweisung. - Chris Harris


Außerdem AuthLDAPSubGroupDepth, das nur in Apache 2.4 verfügbar ist, ist es bei Verwendung von Microsoft AD LDAP möglich, die Autorisierung mithilfe verschachtelter Gruppen mithilfe der LDAP_MATCHING_RULE_IN_CHAIN-Abgleichregel durchzuführen. Dies ist viel schneller als die Suche nach 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 Saite 1.2.840.113556.1.4.1941 ist ein OID namens LDAP_MATCHING_RULE_IN_CHAIN. Diese OID wird von Microsoft zur Verwendung mit ihrer LDAP-Implementierung (Teil von Active Directory) zugewiesen. Sie können es nicht mit anderen LDAP-Servern verwenden. Das umformbare 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 Vorfahrenkette in Objekten bis zur Wurzel durchläuft, bis eine Übereinstimmung gefunden wird.

Siehe auch:


30
2017-09-05 20:51



Ich würde diese 10x erhöhen, wenn ich könnte. Für Leute, die RHEL 5 verwenden, ist dies eine großartige Lösung. Das Kompilieren der Herstellerquelle, 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 einen Weg zu benutzen? LDAP_MATCHING_RULE_IN_CHAIN rekursive Gruppenmitgliedschaft abzurufen und sie als Header an einen Backend-Server zu übergeben (unter Verwendung des Apache als Reverse-Proxy)? - Gershon Papi
mod_authnz_ldap bietet dies nicht. Sie können jedoch verwenden LDAP_MATCHING_RULE_IN_CHAIN LDAP-Filter in Ihrer Anwendung Sehen: stackoverflow.com/a/34075052/290087 - Mircea Vutcovici


Es sieht so aus, als ob Ihre einzige Option in Apache 2.2 darin besteht, alle Gruppen aufzulisten, die von Ihrer autorisierten Hauptgruppe enthalten sind.

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.


AD-Domains kreuzen (mit zwei LDAP-Servern)

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

/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 wird einige Massierungen erfordern, um es zur Arbeit zu bringen, aber ich denke, das ist die allgemeine Idee.


6
2017-11-16 17:48



Leider funktioniert das nicht, wenn sich Gruppen in verschiedenen AD-Domänen befinden (Domain1_DomainLocal_Group enthält Domain2_Global_Group). Es war das erste, was ich ausprobiert habe :) - Selivanov Pavel
Bedeutet das, dass eine der Gruppen auf einem anderen Server ist? Wenn das stimmt, vermute ich, dass AuthLDAPSubGroupDepth auch nicht für Sie arbeiten wird. - Jeff Strunk
Ja, zwei Server, zwei Domains. Ich habe darüber nachgedacht, Linux-Box in AD zu integrieren und 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 traurig :( - Selivanov Pavel
Oh, ich habe nicht bemerkt, dass du eine aktualisierte Antwort hast. Mit OpenLDAP kann slapd_meta eine Lösung sein, aber es bringt den Hauptpunkt dieser Konfiguration zum Erliegen: Benutzerrechte an einem einzigen Punkt verwalten (Active Directory), indem Benutzer aus Gruppen hinzugefügt und gelöscht werden und Gruppen in einander eingeschlossen werden. Hier ist meine analoge Lösung mit AuthnProviderAlias ​​ohne zusätzlichen OpenLDAP-Dienst: <AuthnProviderAlias ​​ldap first-ldap> AuthLDAPURL ... </ AuthnProviderAlias> <AuthnProviderAlias ​​ldap second-ldap> AuthLDAPURL ... </ AuthnProviderAlias> ... AuthBasicProvider zuerst-ldap Sekunde -ldap - Selivanov Pavel
Ich habe beschlossen, Bart De Vos Kopfgeld zu geben: das ist nicht meine Frage; Für die ursprüngliche Frage (ohne meine eigenen spezifischen) ist seine Lösung einfach und wird funktionieren - Selivanov Pavel


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

Zum Beispiel übergebe ich eine Apache Bloodhound-Installation, die Apache HTTPd als Frontend mit AD-Gruppen-Auth verwendet, an eine Gruppe von anderen Entwicklern. Sie werden Probleme mit bitweisen Operatoren haben. Admins werden natürlich nicht so zimperlich sein ... hoffe ich.

Davon abgesehen habe ich eine Lösung, die den bitweisen Operator nicht verwendet und die nicht mehrere ldap-group-Definitionen 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 nicht selbst, noch wenn es mit AuthLDAPSubgroupAttribute gekoppelt ist. Erst als ich AuthLDAPSubGroupClass benutzte, begann die Auth gegen Untergruppen zu arbeiten ... zumindest für mich und meine Situation.


3
2018-03-17 22:20