LDAP

De Jose Castillo Aliaga
Ir a la navegación Ir a la búsqueda

LDAP es el acrónimo de "Lightweight Directory Access Protocol". Se trata de un protocolo a nivel de aplicación para acceder a un servicio de directorio ordenado y distribuido para encontrar información en un entorno de red.

LDAP no es la base de datos a la que se consulta, aunque de manera coloquial se suele referir tanto al protocolo como a la base de datos a la que se realizan las consultas.

El uso de LDAP puede ser muy diverso, pero el más común para los administradores de sistemas es para almacenar o consultar información sobre el login como los usuarios, contraseñas, grupos o política de contraseñas.

Protocolo LDAP

Cuando un cliente LDAP quiere hacer una consulta a un servidor LDAP se produce una comunicación a través de la red. El puerto por defecto es el TCP 389. Al igual que otros clientes, este envía una petición y el servidor envía respuestas.

Las peticiones son las siguientes:

  • Start TLS - Para utilizar la extensión TLS de LDAPv3 para una conexión segura.
  • Bind - Sirve para autenticarse en el servidor especificando una versión del protocolo LDAP
  • Search - Para buscar entradas dentro del directorio.
  • Compare - Prueba si una entrada tiene un valor concreto.
  • Add - Añadir nuevas entradas.
  • Delete - Borrar entradas.
  • Modify - Modificar una entrada.
  • Modify Distinguished name (DN) - Modificar el DN de una entrada. Es diferente al modificar porque esto puede suponer cambiar la estructura del directorio.
  • Abandon - Avortar una petición previa.
  • Extended Operation - Operación genérica usada para definir otras.
  • Unbind - Cerrar una conexión.

Clientes LDAP

Los clientes de LDAP pueden ser muy diversos. La mayoría lo usan para autentificarse. Entre ellos:

  • Sistemas operativos como Windows (Active Directory) o Linux, Para autentificar usuarios.
  • Samba puede usar LDAP como backend para su base de datos de usuarios.
  • Moodle, Joomla y otros CMS pueden aprovechar los mecanismos de autenticación de LDAP para sus propios usuarios.
  • Squid
  • ...

Directorio LDAP

LDAP accede a su base de datos entendiéndola como una base de datos jerárquica en forma de árbol. Esto implica que hay un nodo raíz y a partir de ahí se organiza una estructura con subárboles.

Cada nodo del árbol es un objeto LDAP y puede contener otros nodos hijos.

Ldap1.png

Si observamos este esquema, podemos ver varios elementos en el directorio:

  • El DIT o Directory Information Tree, que es el aŕbol en sí.
  • Cada nodo tiene un Relative Distinguished Name RDN, que es su nombre relativo, sin tener en cuenta en la posición del árbol en que está respecto a sus nodos padres. Por ejemplo, el primero tiene de RDN dc=com. Este puede indicar lo que se desee, por ejemplo ou=People significa "unidad organizativa" y se refiere a personas.
  • Cada nodo tiene un Distinguished name DN que es la unión de su RDN con el de sus nodos padres. Así, Juan Gama tiene como DN cn=Juan Gama, ou=People, I=Alicante, dc=compañíaB, dc=com

El nodo raíz puede tener una nomenclatura basada en DNS, como es el caso o en el criterio que se desee.

Cada objeto LDAP, además de tener un DN, puede tener clases y atributos que lo describen. Las clases definen que atributos deben o pueden estar presentes. Estas clases se definen en el schema. Los atributos tienen un nombre y uno o más valores.

Un schema es un conjunto de definiciones que describen los datos que puede almacenar cada objeto. Los objetos pueden heredar características de objetos padres o proporcionar características a sus hijos. Hay varios esquemas según las necesidades, pero se puede personalizar o crear uno propio.


LDIF

Para poder entender el contenido de una base de datos LDAP o para poder crear y modificar sus entradas existe un lenguaje llamado LDIF (LDAP Data Interchange Format). Este representa en texto plano las entradas que LDAP guarda en su formato interno binario.

Registros de entrada

Los registro de entrada permiten ver el contenido de un objeto LDAP. Su forma básica es:

dn: <distinguished name>
<attrdesc>: <attrvalue>
<attrdesc>: <attrvalue>
<attrdesc>:: <base64-encoded-value>
<attrdesc>:< <URL>

Se pueden distinguir varios elementos:

  • El DN del objeto en primer lugar.
  • Un atributo normal en que se separa el nombre del valor por dos puntos y espacio.
  • Pueden haber varios atributos con el mismo nombre. Eso significa que ese atributo tiene múltiples valores.
  • Un atributo binario o que empieza por espacio o : o tiene caracteres no imprimibles. Es necesario codificarlo en base64. Se pueden poner, por ejemplo, imágenes codificadas en base64.
  • Si se desea indicar un atributo enlazado se puede sar :< y la URL a continuación.

Cada registro se separa del anterior por una línea en blanco.

Un ejemplo con todas las combinaciones:

          dn: cn=Barbara J Jensen,dc=example,dc=com
          cn: Barbara J Jensen
          cn: Babs Jensen
          objectclass: person
          description:< file:///tmp/babs
          sn: Jensen
          dn: cn=Bjorn J Jensen,dc=example,dc=com
          cn: Bjorn J Jensen
          cn: Bjorn Jensen
          objectclass: person
          sn: Jensen
          dn: cn=Jennifer J Jensen,dc=example,dc=com
          cn: Jennifer J Jensen
          cn: Jennifer Jensen
          objectclass: person
          sn: Jensen
          jpegPhoto:: /9j/4AAQSkZJRgABAAAAAQABAAD/2wBDABALA4MChAODQ4SERATGCgaGBYWGDEjJR0oOjM9PDkzODdASFxERXRTc4UG1RV19iZ2hnPk1xeXBkeFxlZ2P/2wBDARESEhgVG

Registros de cambio

Se utilizan para representar cambios en el directorio. Comienzan con el DN del objeto a modificar y a continuación va la información del cambio que se desea realizar.

dn: <distinguishedname>
changetype: <[modify|add|delete|modrdn]>

Añadir:

add: <attributetype>
<attrdesc>: <value1>
<attrdesc>: <value2>
...
-

Como se puede ver, se pueden cambiar múltiples atributos al mismo tiempo. El - del final permite combinar operaciones de añadir, modificar o borrar con un mismo DN.

Reemplazar:

replace: <attributetype>
<attrdesc>: <value1>
<attrdesc>: <value2>
...
-

Borrar:

delete: <attributetype>
<attrdesc>: <value1>
<attrdesc>: <value2>
...
-

Ejemplo:

          dn: cn=Babs Jensen,dc=example,dc=com
          changetype: add
          objectclass: person
          objectclass: extensibleObject
          cn: babs
          cn: babs jensen
          sn: jensen
          dn: cn=Babs Jensen,dc=example,dc=com
          changetype: modify
          add: givenName
          givenName: Barbara
          givenName: babs
          -
          replace: description
          description: the fabulous babs
          -
          delete: sn
          sn: jensen
          -