¿Cómo escribir una consulta LDAP para probar si el usuario es miembro de un grupo?

129

Quiero escribir una consulta LDAP que pruebe si un usuario (sAMAccountName) es miembro de un grupo en particular. ¿Es posible hacer eso para obtener 0 o 1 registros de resultados?

Supongo que puedo obtener todos los grupos para el usuario y probar cada uno para una coincidencia, pero me preguntaba si podría agruparlo en una expresión LDAP.

¿Algunas ideas?

Gracias

Pablo
fuente
Consulte también preguntas como Consulta recursiva de membresía de grupo LDAP
Franklin Piat

Respuestas:

177

Debería poder crear una consulta con este filtro aquí:

(&(objectClass=user)(sAMAccountName=yourUserName)
  (memberof=CN=YourGroup,OU=Users,DC=YourDomain,DC=com))

y cuando ejecuta eso contra su servidor LDAP, si obtiene un resultado, su usuario "yourUserName" es de hecho un miembro del grupo "CN = YourGroup, OU = Users, DC = YourDomain, DC = com

¡Intenta ver si esto funciona!

Si usa C # / VB.Net y System.DirectoryServices, este fragmento debería ser el truco:

DirectoryEntry rootEntry = new DirectoryEntry("LDAP://dc=yourcompany,dc=com");

DirectorySearcher srch = new DirectorySearcher(rootEntry);
srch.SearchScope = SearchScope.Subtree;

srch.Filter = "(&(objectClass=user)(sAMAccountName=yourusername)(memberOf=CN=yourgroup,OU=yourOU,DC=yourcompany,DC=com))";

SearchResultCollection res = srch.FindAll();

if(res == null || res.Count <= 0) {
    Console.WriteLine("This user is *NOT* member of that group");
} else {
    Console.WriteLine("This user is INDEED a member of that group");
}

Advertencia: esto solo probará la membresía inmediata del grupo, y no probará la membresía en lo que se llama el "grupo primario" (generalmente "cn = Usuarios") en su dominio. No maneja membresías anidadas, por ejemplo, el usuario A es miembro del grupo A, que es miembro del grupo B; el hecho de que el usuario A también sea realmente miembro del grupo B tampoco se refleja aquí.

Bagazo

marc_s
fuente
1
Intenté, pero aún no funciona para mí. ¿Debería ser 'OU = Users' o 'OU = Groups' en la cláusula memberOf?
Paul
3
Esta es mi consulta: (& (objectClass = person) (sAMAccountName = USERID) (memberof = 'CN = SPSAdmins, OU = Groups, OU = MYTOWN, OU = Germany, OU = MYCOMPANY, DC = MYTOWN, DC = MYCOMPANY, DC = com ')) El DN realmente es tan largo. Estoy de acuerdo en que debería funcionar. ¡Gracias por ayudar!
Paul
3
¡Por un momento eliminé las comillas simples después de memberof y ahora obtengo un resultado! Gracias
Paul
2
Buena respuesta. pero debe señalarse que solo funcionará en servidores LDAP que mantengan un atributo 'memberOf'. La técnica más general es buscar el objeto de grupo y examinar sus atributos uniqueMember, roleOccupant, etc. para el DN del usuario, según el esquema que utilice el objeto de grupo.
Marqués de Lorne
1
Los nombres y valores de @Gunslinger LDAP no distinguen entre mayúsculas y minúsculas, y tampoco los DN, pero AD tiene sus propias reglas ...
Marqués de Lorne
35

Si está utilizando OpenLDAP (es decir, slapd), que es común en los servidores Linux, debe habilitar la superposición de memberof para que pueda coincidir con un filtro utilizando el atributo (memberOf = XXX).

Además, una vez que habilita la superposición, no actualiza los atributos memberOf para los grupos existentes (necesitará eliminar los grupos existentes y agregarlos nuevamente). Si habilitó la superposición para comenzar, cuando la base de datos estaba vacía, entonces debería estar bien.

Telford Tendys
fuente
8
Supongo que un enlace a una página que explica cómo habilitar memberof overlay sería útil.
Gokhan Sari
55
Tutorial que funcionó para mí: schenkels.nl/2013/03/… @Telford Tendrys, amigo, me salvaste la vida con este aviso sobre grupos preexistentes. ¡Muchas gracias!
ŁukaszBachman
21

Agregaría una cosa más a la respuesta de Marc: el atributo memberOf no puede contener comodines, por lo que no puede decir algo como "memberof = CN = SPS *" y esperar que encuentre todos los grupos que comienzan con "SPS".

Bill Brinkley
fuente
Gracias por esa información. He estado tratando de hacer lo que dices que no se puede hacer. ¿Cómo puedo hacer eso con PHP? ¿Es posible tener el mismo resultado de otra manera? para encontrar que todos los grupos comiencen con SPS y luego lo que sea ... Siempre puedo tomar todo y hacer un bucle de mi matriz y luego buscar el CN ​​que quiero, pero prefiero buscarlo directamente si es posible.
ODelibalta
15

Debe establecer su base de consulta en el DN del usuario en cuestión, luego configure su filtro en el DN del grupo del que se pregunta si es miembro. Para ver si jdoe es miembro del grupo de la oficina, su consulta se verá así:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host '(memberof=cn=officegroup,dc=example,dc=local)'

Si desea ver TODOS los grupos de los que es miembro, solo solicite el atributo 'memberof' en su búsqueda, así:

ldapsearch -x -D "ldap_user" -w "user_passwd" -b "cn=jdoe,dc=example,dc=local" -h ldap_host **memberof**
gpayne_007
fuente