Realizar búsquedas en ldap mediante ldapsearch | Algo de Linux

viernes, 27 de septiembre de 2013

Realizar búsquedas en ldap mediante ldapsearch

LDAP (Lightweigh Directory Access Protocol) es esencialmente un servicio de directorio que nos va a permitir almacenar la información necesaria de nuestra organización (usuarios, grupos, hosts, dns, dhcp, ...) en una base de datos optimizada para consultas.

En nuestro trabajo diario usamos con mucha frecuencia ldap, aunque lo cierto es que no siempre necesitamos recurrir a herramientas de línea de comandos como ldapsearch, ldapadd, ldapmodify o ldapdelete, que forman parte del paquete ldap-utils y gestionamos nuestra B.D. ldap con herramientas como phpldapadmin o nuestro superútil controlies.
No obstante, cuando tenemos que procesar un conjunto de registros de una manera más o menos automatizada, puede venirnos muy bien echar mano de éstas.

El árbol de directorio de ldap se encuentra organizado mediante los siguientes componentes:
  • dc: domain component
  • ou: organizational unit
De este modo, podemos tener una base de directorio como:
  • dc=instituto,dc=extremadura,dc=es
 Y dentro del mismo, tener unidades organizativas donde almacenar nuestros usuarios, como:
  •  ou=People,dc=instituto,dc=extremadura,dc=es
O unidades organizativas donde almacenar los grupos:
  •  ou=Group,dc=instituto,dc=extremadura,dc=es
Como ldapsearch tiene muchísimas opciones, y me parece un poco rollo listarlas, vamos a ver cómo usar ldapsearch mediante unos cuantos ejemplos y si alguien necesita más información, puede recurrir al man:

# man ldapsearch

Primer ejemplo.- Obtener los datos de usuarios que tengan un objectClass=inetOrgPerson.
# ldapsearch -xLLL -h ldap -b "dc=instituto,dc=extremadura,dc=es" "(objectClass=inetOrgPerson)"
  • Con la opción -x  estamos indicando a ldapsearch que queremos usar autentificación simple.
  • Con la opción -LLL indicamos a ldapsearch que deseamos obtener una salida LDAPv1.
  • Con la opción -h host indicamos el servidor ldap en el que vamos a realizar la búsqueda. 
  • Con la opción -b base indicamos cuál es el punto del árbol ldap desde donde se debe realizar la búsqueda.
  • Por último, especificamos un filtro de búsqueda. En el ejemplo: "(objectClass=inetOrgPerson)"

Segundo ejemplo.- Obtener los datos de usuarios que tengan un objectClass=inetOrgPerson, haciendo la consulta con un usuario autentificado:
# ldapsearch -xLLL -h ldap -D "cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es" -W -b "ou=People,dc=instituto,dc=extremadura,dc=es" "(objectClass=inetOrgPerson)"

Si os fijáis, la única diferencia con el caso anterior son las siguientes opciones:
  • Con -D "cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es" indicamos el usuario con el que vamos a realizar la consulta.
  • Con -W le indicamos al comando ldapsearch que nos pida la contraseña.
  • Si quisiéramos especificar directamente la contraseña, utilizaríamos la opción -w password.
Tercer ejemplo.- Obtener los datos de usuarios que tengan un objectClass=inetOrgPerson, haciendo la consulta con un usuario autentificado y especificando la password del usuario en la línea de comandos:

# ldapsearch -xLLL -h ldap -D "cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es" -w mipassword -b "ou=People,dc=instituto,dc=extremadura,dc=es" "(objectClass=inetOrgPerson)"

Cuarto ejemplo.- Obtener los datos de usuarios que tengan un objectClass=inetOrgPerson, haciendo la consulta con un usuario autentificado, utilizando una autentificación SSL/TLS:
# ldapsearch -xLLL -H "ldaps://ldap:636" -D "cn=admin,ou=People,dc=instituto,dc=extremadura,dc=es" -W -b "ou=People,dc=instituto,dc=extremadura,dc=es" "(objectClass=inetOrgPerson)"
Quinto ejemplo.- Imaginemos que tenemos almacenados los datos del host asignado a cada usuario mediante el objectClass=hostObject y queremos obtener los datos de aquellos usuarios que tengan asignado el host "a01-o02". Podríamos hacer una consulta anónima con un filtro compuesto:

# ldapsearch -xLLL -h ldap "(&(objectClass=hostObject)(host=a01-o02))"

De este modo, obtendríamos todos los atributos del usuario o usuarios que tengan asignado el host a01-o02.

Sexto ejemplo.- Si ahora quisiéramos obtener tan sólo el atributo host del usuario, no tendríamos más que indicarlo a continuación:

# ldapsearch -xLLL -h ldap "(&(objectClass=hostObject)(host=a01-o02))" host

Séptimo ejemplo.- Si ahora quisiéramos obtener, además del host, el atributo homeDirectory del usuario, no tendríamos más que indicarlo a continuación:

# ldapsearch -xLLL -h ldap "(&(objectClass=hostObject)(host=a01-o02))" host homeDirectory


Octavo ejemplo.- Si ahora quisiéramos obtener el host asignado a un usuario, concreto, no tendríamos más que modificar el filtro de búsqueda:

# ldapsearch -xLLL -h ldap "(&(objectClass=hostObject)(uid=ponente)(host=*))" host

Noveno ejemplo.- Si quisiéramos obtener tan sólo el nombre del host asignado al alumno sin la información del dn, no tendríamos más que filtrar la salida con comandos. Por ejemplo:

# ldapsearch -xLLL -h ldap "(&(objectClass=hostObject)(uid=ponente)(host=*))" host | grep "host:" | cut -f2 -d" "

Décimo ejemplo.- Por último, si quisiéramos consultar el e-mail de todos los usuarios de nuestro servidor ldap, podríamos hacer la siguiente búsqueda:

# ldapsearch -x -h ldap -p 389 -b "ou=People,dc=instituto,dc=extremadura,dc=es" "(&(objectClass=inetOrgPerson)(mail=*))" mail
 
Publicado por primera vez en http://enavas.blogspot.com.es

No hay comentarios: