Jak uwierzytelniać użytkowników w grupach zagnieżdżonych w Apache LDAP?

21

Mam uwierzytelnianie LDAP z następującą konfiguracją

 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

To działa, jednak muszę wprowadzić wszystkich użytkowników, których chcę uwierzytelnić MySpecificGroup. Ale na serwerze LDAP skonfigurowałem MySpecificGrouprównież grupę MyOtherGroupzawierającą inną listę użytkowników.

Ale ci użytkownicy MyOtherGroupnie są uwierzytelnieni, muszę ręcznie dodać ich wszystkich MySpecificGroupi zasadniczo nie mogę używać zagnieżdżonego grupowania. Korzystam z systemu Windows SBS 2003.

Czy istnieje sposób na skonfigurowanie Apache LDAP w tym celu? Czy jest problem z możliwą nieskończoną rekurencją, a zatem nie jest dozwolony?

znak
źródło

Odpowiedzi:

19

Musisz ustawić, AuthLDAPSubGroupDepthaby to zadziałało. Podana tu liczba całkowita określa maksymalną głębokość zagnieżdżenia podgrup, która zostanie oceniona przed zakończeniem wyszukiwania użytkownika.

Dodaj to do swojej konfiguracji:

AuthLDAPSubGroupDepth 1

Więcej informacji: tu i tutaj .

Bart De Vos
źródło
Korzystam z Apache 2.2, to mod_authnz_ldap nie ma dyrektywy AuthLDAPSubGroupDepth
Selivanov Pavel
Dlaczego więc nie zaktualizować?
Bart De Vos
2
Używam Debian Squeeze i wolę używać pakietów ze stabilnej dystrybucji: dobrze przetestowane, regularne aktualizacje bezpieczeństwa. Apache 2.3 wciąż jest w fazie beta, wkrótce pojawi się w stabilnych lub stabilnych backportach. Rozwiązałem ten problem, używając AuthnProviderAliasna razie. Jeśli nikt nie zaoferuje rozwiązania dla Apache 2.2, nagroda jest twoja :)
Selivanov Pavel
Biorąc pod uwagę nowe informacje o grupach znajdujących się na różnych serwerach, nie sądzę, aby ta metoda nadal działała.
Jeff Strunk
3
AuthLDAPSubGroupDepth nie istnieje w Apache HTTPd 2.4. AuthLDAPMaxSubGroupDepth to właściwa dyrektywa do użycia.
Chris Harris
33

Poza tym AuthLDAPSubGroupDepth, jest to dostępne tylko w Apache 2.4, podczas korzystania z Microsoft AD LDAP możliwe jest autoryzowanie przy użyciu grup zagnieżdżonych przy użyciu reguły dopasowywania LDAP_MATCHING_RULE_IN_CHAIN. Jest to znacznie szybsze niż wyszukiwanie podgrup na kliencie, ponieważ odbywa się to na serwerze DC z mniejszą liczbą zapytań przez sieć.

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

Ciąg 1.2.840.113556.1.4.1941jest nazywany OIDLDAP_MATCHING_RULE_IN_CHAIN . Ten identyfikator OID jest przypisywany przez Microsoft do użycia z jego implementacją LDAP (część Active Directory). Nie można go używać z innymi serwerami LDAP. Format do wymiany przez człowieka to:iso(1).member_body(2).us(840).microsoft(113556).ad(1).as_schema(4).LDAP_MATCHING_RULE_IN_CHAIN(1941)

Z dokumentacji Microsoft:

Ta reguła jest ograniczona do filtrów mających zastosowanie do nazwy wyróżniającej. Jest to specjalny „rozszerzony” operator dopasowania, który prowadzi łańcuch przodków w obiektach aż do katalogu głównego, aż znajdzie dopasowanie.

Zobacz też:

Mircea Vutcovici
źródło
Głosowałbym za tym 10 razy, gdybym mógł. Dla osób korzystających z RHEL 5 jest to świetne rozwiązanie. Kompilowanie źródła dostawcy w celu uzyskania najnowszych funkcji nie zawsze jest pożądanym rozwiązaniem!
Aaron Copley
Cieszę się, że to pomogło. Myślę, że to było pierwsze udokumentowane użycie LDAP_MATCHING_RULE_IN_CHAIN ​​w apache.
Mircea Vutcovici
Czy istnieje sposób na LDAP_MATCHING_RULE_IN_CHAINodzyskanie członkostwa w grupie rekurencyjnej i przekazanie go jako nagłówka do serwera zaplecza (przy użyciu Apache jako odwrotnego proxy)?
Gershon Papi
mod_authnz_ldapnie zapewnia tego. Możesz jednak użyć LDAP_MATCHING_RULE_IN_CHAINfiltra LDAP w swojej aplikacji. Zobacz: stackoverflow.com/a/34075052/290087
Mircea Vutcovici
6

Wygląda na to, że jedyną opcją w Apache 2.2 jest wyświetlenie listy każdej grupy uwzględnionej przez główną autoryzowaną grupę.

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

Powinno to być rozsądne, jeśli grupy zagnieżdżone nie są zbyt skomplikowane.


Przekraczanie domen AD (przy użyciu dwóch serwerów LDAP)

Możesz skonfigurować OpenLDAP z nakładką slapd_meta działającą na twoim serwerze WWW, aby proxy uwierzytelnić.

/etc/ldap/slapd.conf powinien wyglądać mniej więcej tak:

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"

Wówczas Twoja sekcja mod_authnz_ldap wyglądałaby mniej więcej tak:

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

Będzie to wymagało trochę masowania, aby go uruchomić, ale myślę, że to jest ogólny pomysł.

Jeff Strunk
źródło
1
Niestety nie działa to, gdy grupy znajdują się w różnych domenach AD (Domain1_DomainLocal_Group obejmuje Domain2_Global_Group). To była pierwsza rzecz, której spróbowałem :)
Selivanov Pavel
Czy to oznacza, że ​​jedna z grup jest na innym serwerze? Jeśli to prawda, podejrzewam, że AuthLDAPSubGroupDepth też nie będzie dla ciebie działać.
Jeff Strunk
Tak, dwa serwery, dwie domeny. Zastanawiałem się nad integracją Linux-a z AD i używaniem uwierzytelniania PAM, ale mod-auth-pam nie jest obsługiwany, ponieważ apache 2.0, mod-authnz-external + pwauth nie obsługuje grup. To wszystko jest niestety :(
Selivanov Pavel
1
Och, nie zauważyłem, że zaktualizowałeś odpowiedź. Korzystanie z OpenLDAP może być rozwiązaniem slapd_meta, ale zabija główny punkt tej konfiguracji: zarządzaj prawami użytkownika w jednym punkcie (Active Directory), dodając / usuwając użytkowników z grup i włączając grupy w siebie. Oto moje analogowe rozwiązanie z AuthnProviderAlias ​​bez dodatkowej usługi OpenLDAP: <AuthnProviderAlias ​​ldap first-ldap> AuthLDAPURL ... </AuthnProviderAlias> <AuthnProviderAlias ​​ldap second-ldap> AuthLDAPURL ... </AuthnProvider ldapAllasasasasas> -ldap
Selivanov Pavel
1
Postanowiłem przyznać nagrodę Bartowi De Vosowi: to nie moje pytanie; w przypadku oryginalnego pytania (bez mojego konkretnego) jego rozwiązanie jest proste i zadziała
Selivanov Pavel
4

Podczas gdy rozwiązanie dostarczone przez @Mircea_Vutcovici działało dla mnie, moją jedyną krytyką jest to, że ludzie mogą się skrzywdzić, gdy zobaczą operatory bitowe.

Na przykład przekażę instalację Apache Bloodhound, która używa Apache HTTPd jako interfejsu użytkownika z uwierzytelnianiem grupy AD, grupie innych programistów. Będą mieli problemy z obsługą operatorów bitowych. Administratorzy oczywiście nie będą aż tak pyszni ... Mam nadzieję.

Biorąc to pod uwagę, mam rozwiązanie, które nie korzysta z operatora bitowego i nie korzysta z wielu definicji grup ldap.

Następująca konfiguracja działa dla mnie:

<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>

Kluczową częścią była następująca konfiguracja:

AuthLDAPSubGroupClass group

AuthLDAPMaxSubGroupDepth nie działa samo z siebie, ani w połączeniu z AuthLDAPSubgroupAttribute. Dopiero gdy użyłem AuthLDAPSubGroupClass, uwierzytelnianie przeciwko podgrupom zaczęło działać ... przynajmniej dla mnie i mojej sytuacji.

Chris Harris
źródło