LDAP
Última actualización
Última actualización
LDAP significa Protocolo Ligero de Acceso a Directorios (Lightweight Directory Access Protocol). Como su nombre indica, es una versión más ligera de DAP, que es el Protocolo de Acceso a Directorios definido por el estándar X.500. Para más información sobre X.500, puedes consultar el .
La razón de una versión ligera es que DAP era bastante exigente en cuanto a carga del procesador, solicitando más de lo que los procesadores podían proporcionar en ese momento. LDAP está descrito en el .
es un sistema cliente/servidor. El servidor puede utilizar una variedad de bases de datos para almacenar un directorio, cada una optimizada para operaciones de lectura rápidas y abundantes. Cuando una aplicación cliente LDAP se conecta a un servidor LDAP, puede consultar un directorio o intentar modificarlo. En caso de una consulta, el servidor responde localmente o puede referir al solicitante a un servidor LDAP que tenga la respuesta. Vamos a ver esto desde el principio:
Un directorio es una base de datos especializada diseñada específicamente para búsquedas y exploración, además de soportar funciones básicas de consulta y actualización.
Los directorios suelen contener información descriptiva basada en atributos, y permiten filtros de búsqueda sofisticados. Por lo general, no soportan transacciones complejas como los sistemas de bases de datos relacionales, sino cambios simples de todo o nada.
Pueden replicarse ampliamente para mejorar disponibilidad y fiabilidad, incluso si hay inconsistencias temporales entre réplicas.
Uno o varios servidores LDAP almacenan el DIT (Directory Information Tree). Los clientes se conectan y realizan consultas, recibiendo respuestas o referencias a otros servidores LDAP.
Todos los servidores proporcionan una vista consistente del directorio. Un mismo DN representa la misma entrada sin importar el servidor al que se conecte el cliente. Esto es esencial en servicios de directorio globales. Algunas de las ventajas de usar directorios son las siguientes:
Están optimizados para realizar operaciones de lectura.
La información que almacena es relativamente estática.
Posee una estructura totalmente jerárquica.
Un atributo, como el teléfono, puede tener múltiples valores.
Están optimizados para almacenar pequeños fragmentos de información que pueden estructurarse como entradas con diferentes atributos.
Posee una interfaz de acceso a la información jerarquizada.
Algunos servicios de directorio son locales (como el servicio finger
en una sola máquina), mientras que otros son globales, distribuidos en muchas máquinas cooperando entre sí.
LDAP (Lightweight Directory Access Protocol) es un protocolo ligero para acceder a servicios de directorio basados en X.500 (Como Microsoft Active Directory, Red Hat Directory Server / Fedora 389 Directory Server, Oracle Directory Server Enterprise Edition u OpenLDAP). Funciona sobre TCP/IP u otros servicios orientados a conexión.
Aunque LDAP se utiliza para almacenar la información de usuarios y los recursos de un dominio, el objetivo principal es permitir la autenticación en red, su uso se extiende a multitud de aplicaciones:
Sistemas de autenticación en páginas web que soportan LDAP.
Sistemas de control de entrada a edificios y oficinas.
Sistemas de sistemas de alojamiento con depósito de datos de usuario compartido.
Libretas de direcciones compartidas
Perfiles de usuarios centralizados para permitir la itinerancia.
Servidor de certificados públicos y claves de seguridad. => Lo interesante es poder acceder a datos que cambian poco desde distintas plataformas y múltiples ordenadores, o aplicaciones, ubicados en una red.
Es un protocolo estándar IETF (ver RFC 4510). Algunas características de ldap son las siguientes:
La información se organiza en entradas (entries) que son las estructuras de datos en las que el directorio almacena y organiza la información.
Las entradas contienen atributos con nombre (cn
, mail
, etc.) y uno o más valores.
Cada entrada tiene tipo especial de atributo que es el nombre distinguido o DN (Distinguished Name) único globalmente.
Por ejemplo:
cn: Babs Jensen
mail: babs@example.com
jpegPhoto: [imagen en binario]
Esta información se estructura en forma de árbol jerárquico (DIT - Directory Information Tree).
Puede basarse en estructura geográfica (países, estados, organizaciones) o en nombres de dominio (dc=example,dc=com
) según se ve en las imágenes:
Figura 1.1. Jerarquía según organización
Figura 1.2. Jerarquía según dominio
Esta información se referencia según su DN, formado por su RDN (Relative Distinguished Name) más los nombres de sus ancestros.
Por ejemplo, en la figura 1.2, para "Barbara Jensen" su RDN es uid=babs
mientras que su DN son uid=babs, ou=People, dc=example, dc=com
La clase de objeto (objectclass
) es una descripción general de un tipo de objeto y, por tanto, especifica implícitamente el resto de atributos de este objeto, de acuerdo con la definición establecida en el esquema.
Cada objeto además del DN que lo identifica necesita su clase de objeto especificada en el
atributo objectClass
.
La clase del objeto ha de constar en el esquema o esquemas activos del servidor LDAP.
Un mismo objeto puede pertenecer a uno o más clases simultáneamente, lo que significa que pueden haber varios objectClass para un mismo objeto en el directorio.
Además de las clases básicas de objetos definidos en los esquemas, el administrador del servicio LDAP puede definir dentro de los esquemas sus propios objetos o especificar en el servidor LDAP los esquemas que necesite.
Las clases pueden ser structural
, auxiliary
o abstract
y hay algunas definidas comunes:
top
abstract
Clase base de todas las entradas. Siempre debe estar.
organizationalUnit
structural
Para crear una OU (unidad organizativa), como un departamento.
inetOrgPerson
structural
Usuario de red con atributos extendidos (email, nombre, etc.). Muy común.
person
structural
Usuario con nombre y apellido.
organizationalPerson
auxiliary
Extensión de person
.
posixAccount
auxiliary
Usuario de sistema GNU/Linux (con UID, GID, home, etc.).
posixGroup
structural
Grupo del sistema.
shadowAccount
auxiliary
Añade atributos relacionados con expiración y políticas de contraseña.
groupOfNames
structural
Grupo con lista de miembros (por DN).
groupOfUniqueNames
structural
Similar a groupOfNames
pero con uniqueMember
como atributo.
Para entenderlo mejor, es como decirle al servidor: "Este objeto va a tener estas características, porque pertenece a esta clase". Por ejemplo, supónganos que queremos guardar información de una persona:
Debes usar LDAP cuando necesites una fuente de datos centralizada, accesible por métodos estándar. Ejemplos comunes:
Autenticación de usuarios o máquinas
Gestión de grupos
Libretas de direcciones
Inventario de activos
Configuración de aplicaciones
Gestión de recursos de usuario
Almacén de configuración de PBX
También puedes crear tus propios esquemas (schemas
) si los estándares existentes no se adaptan a tus necesidades.
¿Y cuándo NO usar LDAP? Pues evita usar LDAP si:
Solo necesitas una aplicación accediendo a los datos.
Estás forzando el modelo de directorio para algo que no encaja.
Requieres relaciones complejas que encajan mejor en una base de datos relacional.
El servidor puede usar una variedad de bases de datos para almacenar un directorio, cada una optimizada para realizar operaciones de lectura rápidas y en gran volumen. Cuando una aplicación cliente LDAP se conecta a un servidor LDAP, puede consultar un directorio o intentar modificarlo.
Si se trata de una consulta, el servidor responderá localmente o referirá al cliente a otro servidor LDAP que tenga la información.
Si el cliente intenta modificar información en el directorio LDAP, el servidor verificará si el usuario tiene permisos para hacer el cambio y luego añadirá o actualizará la información.
Información directamente asociada con una entrada. Por ejemplo, una organización puede representarse como una entrada LDAP. Los atributos asociados podrían ser:
su número de fax,
su dirección,
etc.
Las personas también pueden representarse como entradas. Algunos atributos comunes para personas son:
número de teléfono,
dirección de correo electrónico.
Algunos atributos son obligatorios, y otros son opcionales. Una definición de clase de objeto (objectclass
) define qué atributos se requieren y cuáles son opcionales para cada entrada.
Estas definiciones están en archivos de esquema ubicados en: /etc/openldap/schema/
LDAP Data Interchange Format (LDIF) es una representación en texto ASCII de entradas LDAP ya que los archivos usados para importar datos deben estar en formato LDIF. De esta forma, una entrada en el directorio consta de:
El DN, primera línea de la entrada que se compone de la cadena dn seguida por el DN completo de la entrada.
Los atributos de la entrada. Cada atributo se compone de un nombre de atributo, seguido del
carácter “:” y el valor del atributo. Aunque no hay un orden obligatorio en los atributos, que el primer atributo sea el objectClass
mejora la legibilidad de la entrada.
Ejemplo de entrada LDIF:
Cada entrada puede contener tantos pares <attrtype>: <attrvalue>
como se necesiten.
Una línea en blanco indica el final de una entrada.
Una línea puede dividirse (plegarse) indentando la continuación. Por ejemplo, las siguientes líneas son equivalentes:
Las operaciones básicas que se pueden realizar son:
Consulta: Permiten hacer búsquedas en el directorio y recuperar datos.
ldapsearch
, ldapcompare
, ldapwhoami
Actualización: Permiten añadir, borrar, renombrar y modificar entradas del directorio.
ldapadd
, ldapdelete
, ldapmodrdn
, ldappasswd
, ldapmodify
Autenticación y control: Permiten la identificación de los clientes y del directorio y el control de ciertos aspectos de una sesión.
Esta es la operación más común en LDAP, se usa con ldapsearch
y sirve para encontrar entradas en el directorio que cumplan con ciertos criterios que son los siguientes:
1. Base
Es el punto de partida en el árbol LDAP desde donde empieza la búsqueda. Especifica el nodo (entrada) desde el cual se recorrerá el directorio.
Busca dentro de la unidad organizativa
people
.
2. Scope (Ámbito o profundidad)
Controla cuántos niveles se examinan a partir de la entrada base.
base
Solo examina la entrada base
Ver detalles de dc=example,dc=com
one
Examina solo las entradas hijas inmediatas
Usuarios dentro de ou=people
, pero no sub-unidades
subtree
Examina la entrada base y todo lo que esté debajo
Toda la jerarquía de personas y subunidades dentro de people
Por ejemplo:
3. Filtro de búsqueda
Especifica qué entradas quieres encontrar, según atributos, ejemplos:
(uid=juan)
→ Busca al usuario juan
(sn=González)
→ Personas con apellido González
(objectClass=person)
→ Usuarios que sigan el objectClass
4. Atributos esperados (qué datos quieres que te devuelva)
Puedes especificar si quieres todos los atributos o solo algunos.
→ Devuelve solo los atributos uid
, cn
y mail
.
Si no pones nada, devuelve todos los atributos.
5. Alias y referencias
Algunas entradas pueden ser alias de otras (como un acceso directo). Puedes decidir:
No seguir alias
Seguir alias
Seguir alias sólo dentro del mismo servidor
Esto se controla con la opción -a
en ldapsearch
:
never
Nunca seguir alias
always
Siempre seguir alias
search
Solo seguir alias si llevan a otras búsquedas
Por ejemplo:
6. Límites de búsqueda
Puedes controlar:
Tiempo máximo de búsqueda (-l
)
Número máximo de entradas (-z
)
-l 10
→ Límite de 10 segundos
-z 5
→ Límite de 5 entradas
Una busqueda combinada de esto seria:
Busca en todo el árbol de personas (subtree
) aquellas cuyo nombre común (cn
) comience con "Juan", y muestra el cn
y el mail
.
Otra operación menos común pero útil es el ldapcompare
que se usa para comprobar si una entrada tiene un atributo específico con un valor concreto, la diferencia clave con search
es que esta busca entradas mientras que compare
comprueba un valor específico en una entrada concreta
Por ejemplo:
Este comando verifica si el atributo mail
del usuario juan
tiene el valor juan@example.com
y si el atributo no existe o tiene un valor diferente, devuelve un resultado negativo.
Estas son las operaciones que puedes hacer para añadir, borrar, renombrar o modificar entradas en tu directorio LDAP. Todas las operaciones son atómicas, es decir: si algo falla, no se hace nada. Esto garantiza la coherencia del directorio.
Permite crear nuevas entradas en el directorio siempre y cuando:
El nodo padre debe existir en el directorio.
No puede existir ya una entrada con el mismo DN (Distinguished Name).
Debe cumplir las reglas del esquema LDAP.
El usuario debe tener permisos para crear entradas.
Por ejemplo, si queremos añadir un nuevo usuario:
Se aplicaría con:
Permite eliminar entradas existentes en el directorio siempre y cuando:
La entrada debe existir.
No debe tener hijos (es decir, no puede haber subentradas dentro de ella).
El usuario debe tener permisos para borrar.
Por ejemplo:
Esto elimina al usuario jose
del directorio.
Permite cambiar el DN de una entrada (el nombre completo, y opcionalmente su ubicación) siempre y cuando:
La entrada debe existir.
No puede haber otra entrada con el nuevo DN.
Se deben tener permisos adecuados.
Por ejemplo, nos puede interesar mover a jose
de ou=people
a ou=admins
:
Permite editar atributos de una entrada (añadir, cambiar o eliminar) siempre y cuando:
La entrada debe existir.
La modificación debe respetar el esquema.
El usuario debe tener permisos de modificación.
Por ejemplo, modificar el correo de jose
:
Se aplica con:
2.3.1 Autenticarse en el servidor LDAP
La operación bind
permite que el cliente se identifique frente al servidor LDAP. Esta operación es la que establece quién eres y qué permisos tendrás.
Puede hacerse de forma anónima (sin usuario) o autenticada (con usuario y contraseña).
Se ejecuta de forma automática cuando usas comandos como ldapsearch
, ldapadd
, etc., con las opciones -D
y -W
.
Es el caso de:
Autenticación simple (bind):
Aquí, -D
especifica el DN del usuario y -W
pide la contraseña. Esta combinación realiza un bind
autenticado.
Autenticación anónima:
Aquí no se pasa -D
, ni -W
, por lo que LDAP interpreta que es una conexión anónima.
2.3.2 Cerrar la conexión
Una vez que has terminado con tus operaciones LDAP, el cliente puede enviar una operación de unbind para cerrar la sesión con el servidor LDAP de forma limpia. Esto no borra ningún dato, solo finaliza la conexión abierta.
No tienes que escribirlo manualmente: los comandos de LDAP suelen hacer unbind
automáticamente al terminar.
Ejemplo (implícito):
Cuando el comando termina, se ejecuta internamente unbind
para cerrar la sesión.
Cuando un cliente realiza una búsqueda o una modificación, puede darse el caso de que cancele esa operación antes de que finalice (por ejemplo, por lentitud o error). La operación abandon sirve para notificarle al servidor que deje de procesar la operación solicitada.
Esto es útil si la operación está tardando demasiado y no quieres esperar por ejemplo, imagina que haces una búsqueda enorme:
Y ves que tarda demasiado. Si tu herramienta cliente lo permite (por ejemplo, una aplicación), podrías abandonar la operación, y esta se cancela en el servidor.
No todos los comandos de consola permiten directamente
abandon
, pero sí es posible en código o en aplicaciones con interfaz LDAP.
Hasta ahora hemos visto algunas opciones de los comandos, vamos a resumir:
-x
Usa autenticación simple (en vez de SASL, que es más compleja).
ldapsearch -x
-D
DN del usuario con el que autenticarte. Necesario para operaciones que requieran permisos, como añadir o borrar entradas.
-D "cn=admin,dc=example,dc=com"
-W
Solicita la contraseña del usuario especificado con -D
.
ldapsearch -x -D "cn=admin,dc=example,dc=com" -W
-b
Define la base del árbol LDAP desde donde comenzará la búsqueda.
-b "dc=example,dc=com"
-H
Especifica la URL del servidor LDAP (por ejemplo, ldap://localhost).
-H ldap://localhost
-f
Indica un archivo LDIF desde el que se cargarán entradas.
ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f usuarios.ldif
-s
Alcance de la búsqueda (base
, one
, sub
).
-s sub
-a
(En ldapmodify
) Añadir nuevas entradas. Activado automáticamente si usas ldapadd
.
ldapmodify -x -a -f entrada.ldif
-r
Realiza una búsqueda de forma recursiva (en combinación con otras opciones).
ldapsearch -x -b "dc=example,dc=com" -s sub
-l
Límite de tiempo en segundos para la operación.
-l 10
Lo primero y más importante es contar con que requisitos pide:
Instalar los componentes esenciales.
Aplicar las últimas actualizaciones de software del SO.
Elegir ext4 como sistema de archivos para el directorio, u otro adecuado.
Detener todos los servicios y demonios que no se utilicen. ya que disminuirá la exposición a riesgos de seguridad.
Monitorizar el servidor para verificar su rendimiento.
Optimizar cualquier parámetro del SO como son la memoria, CPU y el sistema de almacenamiento que funcionen correctamente.
Dicho esto, para la instalación de Openldap y todos los servicios de directorio en nuestro servidor contaremos con los siguientes componentes esenciales:
Componente slapd: Formato para el servidor LAPD y algunas herramientas de gestión, el daemon de ldap.
Componente ldap-utils: Paquete que agrupa programas clientes como ldapsearch, ldapadd, ldapdelete o ldapcat.
Componentes libblber y libldap: son bibliotecas que implementan el protocolo LDAP.
Vamos a ir con el procedimiento:
Paso 2. A continuación, editaremos el fichero /etc/hosts y añadiremos la línea:
Para poder usar ldapserver.ifp.local
como nombre de dominio completo (FQDN) y ldapserver
como alias corto lo cual facilita la conexión al servidor LDAP sin depender de IPs estáticas ni de un DNS.
IMPORTANTE: Este cambio solo afecta a la máquina donde lo editas, no a toda la red. Si tienes más clientes LDAP, también tendrán que tener esta entrada en su /etc/hosts
, o deberías configurar un DNS para que lo resuelva globalmente.
Paso 3. Como no, actualizaremos el SO con la versión más actualizada del software.
Paso 4. Instalaremos los componentes principales con:
Cuando se configure slapd se nos solicitará una contraseña nueva, que habremos de repetir.
Podemos ver ficheros instalados por un paquete con la orden dpkg -L
, en nuestro caso nos interesará el paquete slapd
y más concretamente su configuración en el directorio de configuración de /etc
y el directorio de esquemas de LDAP que podemos localizar con la orden:
El paquete slapd
contiene una configuración básica por defecto que simplemente permite poner en marcha el servicio pero que no satisface las necesidades concretas de una organización. Debemos trabajar más esta configuración. Para ello buscaremos informacion con el comando:
El cual nos pedirá información detallada acerca de cómo debe configurarse un paquete instalado en el sistema para afinar su configuración:
El DNS Domain name vamos a usar el dominio ifp.local.
Cuando se nos pida el Organization name pondremos ifp.
A continuación nos solicitará dos veces que definamos una contraseña de administrador.
Cuando un paquete debian se desinstala, los archivos de configuración, que pudimos haber modificado, permanecen. Si queremos que elimine incluso los archivos de configuración entonces no desinstalamos, sino que purgamos (apt purge) un paquete por lo que si queremos que cuando el administrador del Ubuntu Server purgue el paquete slapd
la base de datos de directorios con nuestra valiosa información se elimine también habremos de contestar Yes en el apartado “Do you want the database to be removed when slapd is purged?". Si decimos que no, nos avisará que hay unos ficheros de una base de datos anterior que ha de mover para crear la nueva base de datos.
Cuando se nos pregunte "Move old database?" , responderemos Yes.
Listo! Con esto ya debería estar configurado nuestro servicio de directorio.
Si quieres, puedes practicar las operaciones con los siguientes ejemplos:
Por ejemplo, un directorio web como es un buen ejemplo de servicio de directorio navegable. Por otro lado, el DNS no es considerado un servicio de directorio navegable, sino un servicio de consulta distribuido.
Paso 1. Apoyándonos en netplan, debemos configurar la máquina con una IP estática, para esta práctica, definiremos en VirtualBox una red NAT sin DHCP en la que el servidor OpenLDAP tendrá la IP 20.0.0.5/24, para ello puedes seguir el .