Filtros de búsqueda LDAP | Algo de Linux

sábado, 25 de septiembre de 2010

Filtros de búsqueda LDAP

sHabitualmente usamos ldapsearch con determinados filtros de búsqueda para seleccionar entradas en nuestro servidor de ldap. Por ejemplo: Si quiero buscar en mi árbol de ldap un usuario cuyo cn (common name) sea Esteban Navas, mi filtro de búsqueda sería:

cn=Esteban Navas

Y si quisiera buscar un usuario cuyo sn fuera Santos, el filtro de búsqueda sería:

cn=Santos

Bien. Pues como podemos ver en estos dos ejemplos, la sintaxis básica de un filtro de búsqueda es la siguiente:

atributo operador valor


Operadores en filtros de búsqueda.-
Los operadores que podemos usar en un filtro de búsqueda son:

Tipo de búsqueda Operador Descripción
Igualdad = Este operador nos devuelve aquellas entradas que coincidan exactamente en el valor especificado. Ejemplo: cn=Esteban Navas
Subcadena =*cadena* Devuelve entradas que contengan la subcadena especificada. Ejemplos: cn=Esteban*  cn= *Navas* cn=E*Navas. El asterisco representa cero o más caracteres.
Mayor o igual >= Devuelve entradas que contengan atributos mayores o iguales que el valor especificado. Ejemplo: gidNumber >= 3000
Menor o igual <= Devuelve entradas que contengan atributos menores o iguales que el valor especificado. Ejemplo:  uidNumber >=100
Presencia =* Devuelve entradas que contengan uno o más valores en el atributo especificado. Ejemplo: cn=*
Aproximado ~= Devuelve entradas que contengan el atributo especificado con un valor que es aproximadamente igual al valor de búsqueda. Ejemplo: cn~=cnavas


Operadores booleanos.-

Además de los operadores anteriores, podemos utilizar operadores booleanos, que nos van a permitir combinar varios filtros en uno:

(Operador-booleano(filtro)(filtro)(filtro)...)

Por supuesto, también podemos combinar varios operadores booleanos en una expresión. Por ejemplo:

(Operador-booleano(filtro)((Operador-booleano(filtro)(filtro)))

Las expresiones booleanas se evalúan en el siguiente orden:
  • Primero de dentro hacia afuera en las expresiones con paréntesis.
  • De izquierda a derecha en otro caso.
Los operadores que podemos usar en un filtro de búsqueda son:

Tipo de búsqueda Operador Descripción
AND & La expresión será cierta cuando todos los filtros sean ciertos. Ejemplo: (&(filtro)(filtro)...(filtro))
OR | La expresión será cierta cuando al menos uno de los filtros sea cierto. Ejemplo: (|(filtro)(filtro)...(filtro))
NOT!Permite conseguir la negación del filtro. Ejemplo: (!(filtro))

Y eso es todo. Veamos algunos ejemplos de búsqueda:

El más sencillo. Cuando quiero buscar un elemento que contiene el valor igual a la cadena de búsqueda:

cn=Esteban Navas

Si quisiera buscar entradas que contengan uno o más valores en el atributo memberOf:


memberOf=*

Para buscar por ejemplo todas las entradas que no contengan el valor "teacher" en el atributo cn , haría lo siguiente:


(!(cn=teachers))

Y si quiero buscar entradas que contengan una subcadena en el atributo description:

description=*admin*

Imaginemos que quiero obtener todas las entradas cuyo objectClass=posixGroup y los usuarios son miembros del grupo teachers en la unidad organizacional ou=Group,dc=instituto,dc=extremadura,dc=es:

(&(objectClass=posixGroup)(memberOf=cn=teachers,ou=Group,dc=instituto,dc=extremadura,dc=es)

Y si quierra buscar las entradas  cuyo objectClass=posixGroup y los usuarios no sean miembros del grupo teachers en la unidad organizacional ou=Group,dc=instituto,dc=extremadura,dc=es:

(&(objectClass=posixGroup)(!(memberOf=cn=teachers,ou=Group,dc=instituto,dc=extremadura,dc=es))

Y si por ejemplo, quisiera ver aquellas entradas que no tengan el atributo estructural inetOrgPerson:

(!(objectClass=inetOrgPerson))

6 comentarios:

TecnologiaChina dijo...

Buenas, estoy ahora involucrado en el tema de LDAP para un proyecto personal y hay un tipo de búsquedas que estoy interesado.

En concreto la del memberOf

Yo tengo mi arbol de la siguiente manera:


# sistemas, departamento, zimbracorreo.com
dn: cn=sistemas,ou=departamento,dc=zimbracorreo,dc=com
ufn: sistemas, departamento, zimbracorreo.com
objectClass: groupOfNames
cn:: RGVwYXJ0YW1lbnRvIGRlIFNpc3RlbWFzIFPDjUxJQ0U=
cn: sistemas
description: Departamento Sistemas
member: uid=pedro.boleo,ou=people,dc=zimbracorreo,dc=com
member: uid=carlos.lastre,ou=people,dc=zimbracorreo,dc=com


Y quiero que se me impriman todas las personas que tengo dentro de la rama de ou=people,dc=zimbracorreo,dc=com que no pertenecen a Sistemas.

Lo estoy intentando de la forma que dices pero no me sale. ¿Hay que crear algún tipo de enlace especial o algo?

Muchas gracias.

pd.: YO TAMBIÉN SOY EXTREMEÑO!!!

Esteban M. Navas dijo...

¿Cuál es el filtro de búsqueda que estás intentando aplicar?

TecnologiaChina dijo...

Es la siguiente:

ldapsearch -x -H ldap://10.0.2.51:389 -w silice -u -b '' -D 'uid=zimbra,cn=admins,cn=zimbra' (memberOf=cn=desarrollo,ou=departamento,dc=zimbracorreo,dc=com)

TecnologiaChina dijo...

Buenas, no te ha llegado el filtro que he puesto??

Muchas gracias, es de vital importancia!

TecnologiaChina dijo...

ldapsearch -x -H ldap://10.0.2.51:389 -w Contrasenia -b '' -D 'uid=zimbra,cn=admins,cn=zimbra' "(&(memberOf=cn=sistemas,ou=departamento,dc=zimbracorreo,dc=com))"

y con esto me gustaría mostrar todos los hijos que pertenecen al departamento de sistemas que están incluidos ahí, como por ejemplo:


dn: cn=sistemas,ou=departamento,dc=zimbracorreo,dc=com
objectClass: groupOfNames
cn:: RGVwYXJ0YW1lbnRvIGRlIFNpc3RlbWFzIFPDjUxJQ0U=
cn: sistemas
description: Departamento Sistemas
member: uid=carlos.chaouen,ou=people,dc=zimbracorreo,dc=com
member: uid=gonzalez.gonzalo,ou=people,dc=zimbracorreo,dc=com

El caso es que intento implementar una búsqueda como la pones en el ejemplo y no consigo que me saque todos los hijos con la información.

Muchas gracias

Esteban M. Navas dijo...

Últimamente estoy muy atareado y tengo bastante abandonado el blog. Por eso no te había respondido aún.

Lo que yo veo en tu esquema es que tu objectClass es: groupOfNames

En tu filtro deberías indicarlo:
(&(objectClass=groupOfNames)(memberOf=cn=sistemas,ou=departamento,dc=zimbracorreo,dc=com)