Si estamos integrando aplicaciones sobre un LDAP (en nuestro caso sobre un OpenLDAP), seguramente hayamos visto la utilidad de poder obtener los usuarios que pertenecen aun grupo en una sola consulta LDAP, porque la aplicación que queremos integrar soporta solo una única consulta.
Además si buscamos documentación sobre este tema habremos encontrado cosas del estilo, «para obtener los usuarios que pertenecen al grupo grp_prueba ejecutamos la consulta»:
memberOf=cn=grp_prueba,ou=Groups,dc=zentyal
Sobre el DN donde se alojan los usuarios. Pero observamos que esto no funciona.
Y no funciona por varios motivos:
1- Es necesario cargar el módulo «memberof» y configurarlo en LDAP
2- Se ha de trabajar con grupos de tipo groupOfNames (esto se define con el objectClass). Para los que no lo sepan en un LDAP pueden tener grupos de muchos tipos (hasta los podemos definir nosotros). Hay que tener en cuenta que no nos sirven los de tipo posixGroup de forma especial, porque básicamente no almacenan una referencia absoluta al usuario.
El tipo de usuario ya nos da igual.
Vamos a cargar el módulo «memberof» con:
Fichero memberof_mod.ldif
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulePath: /usr/lib/ldap
olcModuleLoad: memberof
Ejecutando:
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f memberof_mod.ldif
Ahora lo configuramos:
Fichero memberof_conf.ldiff
dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
objectClass: olcMemberOf
objectClass: olcOverlayConfig
objectClass: olcConfig
objectClass: top
olcOverlay: memberof
olcMemberOfDangling: ignore
olcMemberOfRefInt: TRUE
olcMemberOfGroupOC: groupOfNames
olcMemberOfMemberAD: member
olcMemberOfMemberOfAD: memberOf
Ejecutando:
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f memberof_conf.ldif
Ahora definimos un grupo y unos usuarios con:
Fichero grp_usuarios.ldif
dn: ou=Groups,dc=zentyal
objectClass: organizationalUnit
ou: Groups
dn: cn=grp_prueba,ou=Groups,dc=zentyal
objectClass: groupOfNames
objectClass: top
cn: grp_prueba
member: uid=Integration,ou=Users,dc=zentyal
member: uid=jdoe,ou=Users,dc=zentyal
dn: ou=Users,dc=zentyal
objectClass: organizationalUnit
ou: Users
dn: uid=Integration,ou=Users,dc=zentyal
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: passwordHolder
cn: Intranet Integration
gidNumber: 1901
homeDirectory: /home/Integration
sn: Integration
uid: Integration
uidNumber: 2035
givenName: Intranet
loginShell: /bin/sh
userPassword:: e1NIQX1xT0hkM0dXeVViTVBGcG1nNlp3dXJSdm9xTW89
dn: uid=jdoe,ou=Users,dc=zentyal
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: passwordHolder
objectClass: pwmUser
cn: John
gidNumber: 1901
homeDirectory: /home/jdoe
sn: Doe
uid: jdoe
uidNumber: 2001
description:: UFdNIA==
givenName: John Doe
loginShell: /bin/sh
userPassword:: YWJvcnQ0aW9ucw==
Ejecutando:
ldapadd -Q -Y EXTERNAL -H ldapi:/// -f grp_usuarios.ldif
Como se puede ver el grupo tiene una referencia a los usuarios pero no a la inversa.
Es ahora cuando podemos ejecutar una consulta (donde cn=user_ro,dc=zentyal es el usuario con el que nos autenticamos y nos pedirá la contraseña):
ubuntu@ip-10-80-242-10:~$ ldapsearch -H ldap://localhost:389 -D "cn=user_ro,dc=zentyal" -W -b "ou=Users,dc=zentyal" "(memberOf=cn=grp_prueba,ou=Groups,dc=zentyal)" "objectClass"
Enter LDAP Password:
# extended LDIF
#
# LDAPv3
# base <ou=Users,dc=zentyal> with scope subtree
# filter: (memberOf=cn=grp_prueba,ou=Groups,dc=zentyal)
# requesting: objectClass
#
# Integration, Users, zentyal
dn: uid=Integration,ou=Users,dc=zentyal
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: passwordHolder
# jdoe, Users, zentyal
dn: uid=jdoe,ou=Users,dc=zentyal
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: passwordHolder
objectClass: pwmUser
# search result
search: 2
result: 0 Success
# numResponses: 3
# numEntries: 2
En el resultado solo se muestra los objectclass de los usuarios porque así se ha pedido en ldapsearch (último paraḿetro «objectClass»).
Os dejo algunos links interesantes:
http://www.openldap.org/doc/admin24/index.html (Documentación oficial OpenLDAP)
http://www.openldap.org/doc/admin24/overlays.html#Reverse%20Group%20Membership%20Maintenance (Documentación específica memberof)
Espero os sea de utilidad.