¿Cómo autenticar usuarios en grupos anidados en Apache LDAP?

21

He trabajado la autenticación LDAP con la siguiente configuración

 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

Esto funciona, sin embargo, tengo que poner a todos los usuarios que quiero autenticar MySpecificGroup. Pero en el servidor LDAP que configuré MySpecificGrouptambién contiene el grupo MyOtherGroupcon otra lista de usuarios.

Pero esos usuarios MyOtherGroupno están autenticados, tengo que agregarlos manualmente MySpecificGroupy básicamente no puedo usar la agrupación anidada. Estoy usando Windows SBS 2003.

¿Hay alguna manera de configurar Apache LDAP para hacer esto? ¿O hay un problema con una posible recursión infinita y, por lo tanto, no está permitido?

marca
fuente

Respuestas:

19

Tienes que configurar AuthLDAPSubGroupDepthpara que esto funcione. El número entero que proporcione aquí especifica la profundidad máxima de anidación de subgrupos que se evaluará antes de que se suspenda la búsqueda del usuario.

Agregue esto a su configuración:

AuthLDAPSubGroupDepth 1

Más información: aquí y aquí .

Bart De Vos
fuente
Estoy ejecutando apache 2.2, es mod_authnz_ldap no tiene la directiva AuthLDAPSubGroupDepth
Selivanov Pavel
Entonces, ¿por qué no actualizar?
Bart De Vos
2
Estoy ejecutando Debian Squeeze y prefiero usar paquetes de distribución estable: actualizaciones de seguridad regulares y bien probadas. Apache 2.3 todavía es beta, aparecerá en backports estable o estable no pronto. He resuelto este problema usando AuthnProviderAliaspor ahora. Si nadie ofrecerá una solución para Apache 2.2, la recompensa es suya :)
Selivanov Pavel
Dada la nueva información de los grupos que están en diferentes servidores, no creo que este método siga funcionando.
Jeff Strunk
3
AuthLDAPSubGroupDepth no existe en Apache HTTPd 2.4. AuthLDAPMaxSubGroupDepth es la directiva correcta para usar.
Chris Harris
33

Además AuthLDAPSubGroupDepth, eso está disponible solo en Apache 2.4, es posible, cuando se usa Microsoft AD LDAP, hacer una autorización usando grupos anidados usando la regla de coincidencia LDAP_MATCHING_RULE_IN_CHAIN. Esto es mucho más rápido que buscar subgrupos en el cliente, porque se realiza en el servidor DC con menos consultas a través de la red.

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

La cadena 1.2.840.113556.1.4.1941es un OID llamado LDAP_MATCHING_RULE_IN_CHAIN. Microsoft asigna este OID para usarlo con su implementación LDAP (parte de Active Directory). No puede usarlo con otros servidores LDAP. El formato humano redeable es:iso(1).member_body(2).us(840).microsoft(113556).ad(1).as_schema(4).LDAP_MATCHING_RULE_IN_CHAIN(1941)

De la documentación de Microsoft:

Esta regla se limita a los filtros que se aplican al DN. Este es un operador de coincidencia "extendido" especial que recorre la cadena de ascendencia en los objetos hasta la raíz hasta que encuentra una coincidencia.

Ver también:

Mircea Vutcovici
fuente
Votaría este 10x si pudiera. Para las personas que ejecutan RHEL 5, esta es una gran solución. ¡Compilar la fuente del proveedor para obtener las últimas funciones no siempre es una solución deseable!
Aaron Copley
Me alegra que haya ayudado. Creo que este fue el primer uso documentado de LDAP_MATCHING_RULE_IN_CHAIN ​​en apache.
Mircea Vutcovici
¿Hay alguna forma de usar LDAP_MATCHING_RULE_IN_CHAINpara recuperar la pertenencia recursiva al grupo y pasarla como encabezado a un servidor de fondo (usando Apache como proxy inverso)?
Gershon Papi el
mod_authnz_ldapno proporciona esto Sin embargo, puede usar el LDAP_MATCHING_RULE_IN_CHAINfiltro LDAP en su aplicación. Ver: stackoverflow.com/a/34075052/290087
Mircea Vutcovici el
6

Parece que su única opción en Apache 2.2 es enumerar todos los grupos incluidos por su grupo autorizado principal.

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

Esto debería ser razonable si sus grupos anidados no son demasiado complicados.


Cruzando dominios AD (usando dos servidores LDAP)

Puede configurar OpenLDAP con la superposición slapd_meta que se ejecuta en su servidor web para representar su autenticación.

/etc/ldap/slapd.conf debería verse más o menos así:

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"

Entonces, su estrofa mod_authnz_ldap se vería así:

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

Esto requerirá un poco de masaje para que funcione, pero creo que esta es la idea general.

Jeff Strunk
fuente
1
Desafortunadamente, esto no funciona cuando los grupos están en diferentes dominios de AD (Domain1_DomainLocal_Group incluye Domain2_Global_Group). Fue lo primero que intenté :)
Selivanov Pavel
¿Eso significa que uno de los grupos está en un servidor diferente? Si eso es cierto, sospecho que AuthLDAPSubGroupDepth tampoco funcionará para usted.
Jeff Strunk
Sí, dos servidores, dos dominios. Pensé en integrar Linux Box en AD y usar la autenticación PAM, pero mod-auth-pam no es compatible ya que apache 2.0, mod-authnz-external + pwauth no admite grupos. Todo esto es triste :(
Selivanov Pavel
1
Oh, no me he dado cuenta de que has actualizado la respuesta. El uso de OpenLDAP slapd_meta puede ser una solución, pero elimina el punto principal de esta configuración: obtenga los derechos de usuario administrados en un solo punto (Active Directory) agregando / eliminando usuarios de grupos e incluyendo grupos entre sí. Aquí está mi solución analógica con AuthnProviderAlias ​​sin un servicio adicional de OpenLDAP: <AuthnProviderAlias ​​ldap first-ldap> AuthLDAPURL ... </AuthnProviderAlias> <AuthnProviderAlias ​​ldap second-ldap> AuthLDAPURL ... </AuthnProviderAliasvider ... -ldap
Selivanov Pavel
1
He decidido dar una recompensa a Bart De Vos: esta no es mi pregunta; para la pregunta original (sin mi propia especificación) su solución es simple y funcionará
Selivanov Pavel
4

Si bien la solución proporcionada por @Mircea_Vutcovici funcionó para mí, mi única crítica es que las personas pueden ser aprensivas cuando ven a operadores bit a bit en uso.

Por ejemplo, entregaré una instalación Apache Bloodhound, que usa Apache HTTPd como front-end con autenticación de grupo AD, a un grupo de desarrolladores. Tendrán problemas para enfrentarse a los operadores bit a bit. Los administradores no serán tan aprensivos, por supuesto ... espero.

Dicho esto, tengo una solución que no usa el operador bit a bit y que no usa múltiples definiciones de grupo ldap.

La siguiente configuración funciona para mí:

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

La parte crítica fue la siguiente configuración:

AuthLDAPSubGroupClass group

AuthLDAPMaxSubGroupDepth no funciona por sí solo, ni cuando se combina con AuthLDAPSubgroupAttribute. Fue solo cuando usé AuthLDAPSubGroupClass que la autenticación contra subgrupos comenzó a funcionar ... al menos para mí y mi situación.

Chris Harris
fuente