🐋
Apuntes Sistemas
  • ⚓Presentación
  • 📊Sistemas y Servidores
    • Personalizar el prompt de Windows
    • Utilidad de manejo de apps para Windows
    • PRACTICA: Arranque dual Windows y Ubuntu
    • 🚧SysLinuxOS: el SO para ASIX
    • Comandos Linux
      • PRACTICA - Ejercicio de práctica comandos
      • 🚧Instalación de paquetes
      • Apuntes Linux: blue/red team
      • Ejemplos de bash
      • Listado de comandos de Linux
    • Comandos Windows
      • 🚧Apuntes Powershell
      • Bucles FOR con batch
      • Scripts de práctica de Windows
    • Prácticas con Windows 10
    • Configuración de netplan
    • Terminal shell
      • SSH
      • 🚧Ghostty
      • 🚧Warp: la terminal inteligente
      • tmux: paneles de terminal
      • Tabby: Mejorar terminal
      • Conexión SSH en red NAT con VirtualBox
      • TheFuck!: Corrección de comandos
      • Wave: Mejorar terminal Linux
      • 🚧Registros de sesiones
    • Instalación manual de Wordpress en CDMON
    • 🏗️Proxmox
    • 🚧TrueNAS
    • Docker
      • Instalación de Docker
      • Dockerfiles
      • Volúmenes de docker
      • Deployment web con Docker con ejemplos
        • 🚧PRACTICA: Node.js con docker
      • Docker Compose
        • Ejemplo 1: Implantación de Wordpress
        • Ejemplo 2: Implementación de servidor con Nginx, Flask y mySQL
        • Ejemplo 3: Implantación de onlyoffice
        • 🚧Ejemplo 4: Passbolt
        • 🚧PRACTICA: Creando una web de emulación de juegos con docker-compose
      • Monitorización con Grafana en Docker
      • Pi-hole con docker
      • Actividad clase: Deployment app
      • Proyectos self-hosted de docker
    • 🚧Ansible
      • Configuración de laboratorio de ansible
    • 🚧Monitorización de servicios y redes
      • Servicios y cronjobs
      • 1Panel
      • 🚧WatchYourLAN
      • 🚧Uptime-kuma
      • 🚧Netdata
      • 🚧Prometheus + Grafana + Loki
    • LDAP
      • 🚧Gestión gráfica de LDAP
      • Carpetas compartidas NFS
      • PRACTICA: Infraestructura LDAP
  • 🗃️Servicios
    • 🚧Servidor hosting público
    • DHCP
      • DHCP con Ubuntu
      • 🦖DHCP & DNS script
      • DHCP con Alpine
        • Alpine - configuración de red
    • DNS
      • 😡Comprobación DNS
      • Script para enumeración DNS
      • DNS con ubuntu server
      • 🏗️DNSmasq
      • 🚧Securizar servidor DNS
    • Web
      • IIS con Windows server
      • Apache
        • Instalación de LAMP en Ubuntu
          • Prueba de servidor LAMP
          • 🚧Configuración de seguridad de Ubuntu
          • Creación de un VirtualHost en LAMP
          • Creación de varios VirtualHosts en LAMP
          • 🚧Instalación por script de LAMP
        • Aplicaciones con LAMP
          • Instalación de WP en entorno LAMP
          • 🚧Instalación de MantisBT en LAMP
            • 👷Guía de MantisBT
          • 🚧Instalación de QDPM con LAMP
      • Nginx
        • Virtualhosts
        • Instalando Wordpress en nginx
      • 👷MEAN stack
      • 👷‍♂️Caddy
      • 🚧Plesk
      • 🚧Ajenti -Web interface
    • 🏗️Proxy
      • Nginx como proxy inverso y balanceador
      • 🚧Zoraxy
    • Mailing
      • 🚧Servidor Mail con cloudfare
      • 🚧Reenvío de correos de root
      • 🚧Roundcube como MUA
      • Comprobación ESMTP
      • 🚧Seguridad en mailing
      • 🚧Mailhog
    • 🏗️File transfer
      • 🚧FTP
      • Git
    • Sistemas de comunicación instantánea
      • Comunicación mediante CLI
      • Ejabberd - XMPP
        • 🚧Ejabberd con docker
      • 🚧Openfire - XMPP
      • 🚧Comunicaciones servidor-móvil
    • 🏗️Multimedia services
      • Stremio
      • Ver anime por CLI
      • Jellyfin
      • 🚧HLS sobre Apache
      • 🚧Servicio autohospedado de videoconferencia
      • 🚧Morphos: Conversor docs
      • 🚧Reproductores de música en CLI
      • 🚧Icecast - música en streaming
      • 🚧RTMP-HLS server
      • 🚧Guacamole
  • 🖱️Hardware
    • 🚧Identificando conectores
    • Curso de electrónica analógica
    • Alcanzar los 3200MHz con la RAM
    • Calculadora de cuellos de botella
    • 🚧PXE: Bootear sistemas en red
    • 🚧PRÁCTICA - Clonación de disco con Clonezilla
    • Logitech iFixit
  • 🕸️Redes
    • Apuntes IPv4 Alina
    • ¿Cómo diferenciar tantos elementos de red?
    • 🚧IPv6
    • PRÁCTICA - Subneteo con IPcalc en Linux
    • PRÁCTICA - Comandos de red en Windows
    • 🚧PRÁCTICA - Comandos de red en Linux
    • Herramientas de red
      • 🚧TCPDump: analizado de paquetes en red
      • PRÁCTICA - Netsh
      • 🚧PRÁCTICA - mtr.ping.pe
      • 🚧Netcat
    • Wireshark
    • VPN y escritorio remoto
      • Comunicación punto a punto con ngrok
      • 🚧VPN
    • Escaneo de red
      • PRÁCTICA - Mapeado de red con Draw.io
      • 🚧PRÁCTICA - Nmap/Zenmap
    • Redes inalámbricas
      • Wi-fi
        • 🚧PRÁCTICA - Configuración de router
        • 🚧PRÁCTICA - Como hacer un Wifi Heatmap
        • 🚧Seguridad de redes inalámbricas
        • PRÁCTICA - Crackear la contraseña del Wifi con WPA/WPA2
    • PRÁCTICA - Usar SSH en Cisco packet tracer
  • 🛑Ciberseguridad
    • 🚧Securizando un servidor Linux
      • Protégete de ataques de fuerza bruta con Fail2ban
      • Firewall
        • UFW (uncomplicated firewall)
          • GUFW - Interfaz gráfica de ufw
        • 🚧IPTables
        • 🚧PFsense
          • 🚧DMZ con PFsense
      • 🚧Passbolt: gestor de contraseñas autohospedado
      • 🚧Hashes y encriptación
      • 🚧Certificados SSL/TLS
      • Copias de seguridad
    • 🚧Alerta de escaneo de puertos
    • 🚧Google dorks
    • 🚧Enumeración DNS
    • Comandos destructivos de linux
    • Webs enseñanza cyber
    • Wireless Pentesting CheatSheet Github
    • The password game!
    • Personal Security Checklist
  • 🔌Arduino
    • Termómetro e higrómetros digitales y online con Arduino
    • Construyendo un coche multipropósito
      • Multi
      • Montaje del auto
    • Arduino con Sigfox para IoT
    • 10 proyectos de Arduino
  • 📚Recursos y libros
    • Media library: libros varios
    • Herramientas básicas de sysadmin
  • 🌍Sostenibilidad y digitalización
    • Portfolio curso digitalización MOOC
    • 🚧Explotación de recursos por IA
    • 🚧Nuevas tecnologias y comunicaciones
    • 🚧Enlaces sobre Inteligencia artificial
Con tecnología de GitBook
En esta página
  • 1. Qué es LDAP?
  • 1.1 ¿Qué es un servicio de directorio?
  • 1.2 ¿Qué es LDAP?
  • 1.3 ¿Cuándo usar LDAP y cuando no?
  • 1.4 Cliente LDAP
  • 2. Operaciones de LDAP en el directorio
  • 2.1 Operaciones de consulta
  • 2.2 Operaciones de actualización
  • 2.3 Operaciones LDAP de autenticación y control.
  • 2.4 Parámetros de las operaciones
  • 3. Instalación de ldap
  • 4. Configuración del servicio
  • 5. Práctica
  1. Sistemas y Servidores

LDAP

AnteriorPrometheus + Grafana + LokiSiguienteGestión gráfica de LDAP

Última actualización hace 1 mes

1. Qué es LDAP?

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:

1.1 ¿Qué es un servicio de directorio?

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:

  1. Están optimizados para realizar operaciones de lectura.

  2. La información que almacena es relativamente estática.

  3. Posee una estructura totalmente jerárquica.

  4. Un atributo, como el teléfono, puede tener múltiples valores.

  5. Están optimizados para almacenar pequeños fragmentos de información que pueden estructurarse como entradas con diferentes atributos.

  6. 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í.

1.2 ¿Qué es LDAP?

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:

objectClass
Tipo
¿Para qué se usa?

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:

dn: uid=juan,ou=usuarios,dc=example,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: top


1.3 ¿Cuándo usar LDAP y cuando no?

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.


1.4 Cliente LDAP

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.

🧷 Atributos

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/

📄 LDIF

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:

[<id>]
dn: <distinguished name>
<attrtype>: <attrvalue>
<attrtype>: <attrvalue>
<attrtype>: <attrvalue>
  • 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:

dn: cn=manuel, ou=engineer, dc=cern, dc=ch
 objectClass: person
 cn: manuel
 sn: marti
 description: IT
 mail: mm@cern.ch

Todos los pares <attrtype>: <attrvalue> deben estar definidos en un archivo de esquema correspondiente para poder usarlos. Cualquier valor entre < y > es una variable que puedes definir al crear una nueva entrada. La excepción es <id>, que es un número determinado por la aplicación usada para editar la entrada.

2. Operaciones de LDAP en el directorio

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.

2.1 Operaciones de consulta

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.

-b "ou=people,dc=example,dc=com"

Busca dentro de la unidad organizativa people.

2. Scope (Ámbito o profundidad)

Controla cuántos niveles se examinan a partir de la entrada base.

Scope
Descripción
Ejemplo práctico

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:

ldapsearch -x -b "ou=people,dc=example,dc=com" -s one "(objectClass=person)"

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.

ldapsearch -x -b "ou=people,dc=example,dc=com" "(uid=juan)" uid cn mail

→ 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:

Opción
Significado

never

Nunca seguir alias

always

Siempre seguir alias

search

Solo seguir alias si llevan a otras búsquedas

Por ejemplo:

ldapsearch -x -a always -b "dc=example,dc=com" "(uid=juan)"

6. Límites de búsqueda

Puedes controlar:

  • Tiempo máximo de búsqueda (-l)

  • Número máximo de entradas (-z)

ldapsearch -x -l 10 -z 5 -b "dc=example,dc=com" "(objectClass=person)"
  • -l 10 → Límite de 10 segundos

  • -z 5 → Límite de 5 entradas

Una busqueda combinada de esto seria:

ldapsearch -x -b "ou=people,dc=example,dc=com" -s subtree "(cn=Juan*)" cn mail

Busca en todo el árbol de personas (subtree) aquellas cuyo nombre común (cn) comience con "Juan", y muestra el cn y el mail.


2.1.1 Operación compare

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:

ldapcompare "uid=juan,ou=people,dc=example,dc=com" mail:juan@example.com

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.

2.2 Operaciones de actualización

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:

dn: uid=jose,ou=people,dc=example,dc=com
objectClass: inetOrgPerson
cn: José Pérez
sn: Pérez
uid: jose
mail: jose@example.com

Se aplicaría con:

ldapadd -x -D "cn=admin,dc=example,dc=com" -W -f jose.ldif

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:

ldapdelete -x -D "cn=admin,dc=example,dc=com" -W "uid=jose,ou=people,dc=example,dc=com"

Esto elimina al usuario jose del directorio.


✏️ rename (renombrar o mover)

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:

ldapmodrdn -x -D "cn=admin,dc=example,dc=com" -W \
    "uid=jose,ou=people,dc=example,dc=com" \
    "uid=jose" \
    -s -r \
    -newrdn "uid=jose" -newSuperior "ou=admins,dc=example,dc=com"

🛠️ modify (modificar atributos)

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:

dn: uid=jose,ou=people,dc=example,dc=com
changetype: modify
replace: mail
mail: nuevo_correo@example.com

Se aplica con:

ldapmodify -x -D "cn=admin,dc=example,dc=com" -W -f modificar.ldif

Recuerda: todas estas operaciones son atómicas. Por ejemplo, si intentas hacer un modify con 3 cambios y uno de ellos falla (por permisos, esquema, etc.), ningún cambio se aplicará.

2.3 Operaciones LDAP de autenticación y control.

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:

  1. Autenticación simple (bind):

    ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "dc=example,dc=com"

    Aquí, -D especifica el DN del usuario y -W pide la contraseña. Esta combinación realiza un bind autenticado.

  2. Autenticación anónima:

    ldapsearch -x -b "dc=example,dc=com"

    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):

ldapsearch -x -D "cn=admin,dc=example,dc=com" -W -b "dc=example,dc=com" "(objectClass=*)"

Cuando el comando termina, se ejecuta internamente unbind para cerrar la sesión.

2.3.3 Cancelar una operación en curso

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:

ldapsearch -x -b "dc=example,dc=com" "(cn=*)" 

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.

2.4 Parámetros de las operaciones

Hasta ahora hemos visto algunas opciones de los comandos, vamos a resumir:

Opción
Descripción
Ejemplo

-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

3. Instalación de ldap

Lo primero y más importante es contar con que requisitos pide:

  1. Instalar los componentes esenciales.

  2. Aplicar las últimas actualizaciones de software del SO.

  3. Elegir ext4 como sistema de archivos para el directorio, u otro adecuado.

  4. Detener todos los servicios y demonios que no se utilicen. ya que disminuirá la exposición a riesgos de seguridad.

  5. Monitorizar el servidor para verificar su rendimiento.

  6. 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:

20.0.0.5    ldapserver.ifp.local    ldapserver

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.

sudo apt install update && sudo apt install upgrade -y

Paso 4. Instalaremos los componentes principales con:

sudo apt install slapd ldap-utils -y

Cuando se configure slapd se nos solicitará una contraseña nueva, que habremos de repetir.

4. Configuración del servicio

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:

dpkg -L slapd | grep schema

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:

sudo dpkg-reconfigure slapd

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.

5. Práctica

Si quieres, puedes practicar las operaciones con los siguientes ejemplos:

PRACTICA: Operaciones básicas

✅ Requisitos previos

  • VirtualBox o entorno similar

  • Ubuntu Server instalado

  • Acceso como usuario root o con permisos sudo

  • Conexión a internet con IP fija

  • Instalado OpenLDAP

🛠️ PASO 1: Configurar OpenLDAP

Configura el dominio cuando te lo pida:

  • Dominio base: ifp.local

  • DN base: dc=ifp,dc=local

  • Admin: cn=admin


🏷️ Paso 2: Añadir una unidad organizativa y un grupo

  1. Crea un archivo grupos.ldif:

nano grupos.ldif

Contenido:

dn: ou=alumnado,dc=ifp,dc=local
objectClass: organizationalUnit
objectClass: top
ou: alumnado

dn: cn=asix,ou=alumnado,dc=ifp,dc=local
objectClass: posixGroup
objectClass: top
cn: asix
gidNumber: 1002
  1. Añade el archivo con:

sudo ldapadd -x -D "cn=admin,dc=ifp,dc=local" -W -f grupos.ldif

🧩 Paso 3: Operaciones LDAP

Vamos a crear un usuario a partir de un archivo base.ldif:

dn: uid=alex,ou=alumnado,dc=ifp,dc=local
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
cn: Alex Viladot
sn: Viladot
uid: alex
uidNumber: 1501
gidNumber: 1002 #Asegúrate de que gidNumber coincida con el gidnumber de asix
homeDirectory: /home/alex
loginShell: /bin/bash

a) Conectar con el servidor local con autenticación simple como admin para añadir entradas desde un fichero .ldif , pero que antes nos solicite contraseña (-W).

sudo ldapadd -x -D "cn=admin,dc=ifp,dc=local" -W -f base.ldif

Deberás añadirle contraseña ahora:

sudo ldappasswd -S -W -D "cn=admin,dc=ifp,dc=local" -x "uid=alex,ou=alumnado,dc=ifp,dc=local"

b) Buscar si el usuario se ha creado:

ldapsearch -x -b dc=ifp,dc=local -s sub "(uid=alex)"

c) Conectar con el servidor local con autenticación simple y busca información disponible sobre la base del directorio dc=ifp,dc=local.

ldapsearch -x -h localhost -b dc=ifp,dc=local

🔑 Paso 4: Establecer contraseña al usuario LDAP

Puedes usar ldappasswd:

sudo ldappasswd -S -W -D "cn=admin,dc=ifp,dc=local" -x "uid=alex,ou=alumnado,dc=ifp,dc=local"

🌳 Paso 5: Ver el contenido del árbol LDAP

  • Mostrar todo el árbol:

sudo ldapsearch -x -LLL ldap:/// -b dc=ifp,dc=local dn
  • Ver la unidad organizativa alumnado:

sudo ldapsearch -x -H ldap:/// -b ou=alumnado,dc=ifp,dc=local dn
  • Ver el usuario alex:

sudo ldapsearch -x -H ldap:/// -b "uid=alex,ou=alumnado,dc=ifp,dc=local"

📌 Importante: Si el usuario tuviera espacios se usarían comillas dobles, en este ejemplo puede ser opcional.

PRACTICA: Laboratorio de otros comandos

✅ Requisitos previos

  • VirtualBox o entorno similar

  • Ubuntu Server instalado

  • Acceso como usuario root o con permisos sudo

  • Conexión a internet con IP fija

  • Instalado OpenLDAP


🛠️ PASO 1: Configurar OpenLDAP

Configura el dominio cuando te lo pida:

  • Dominio base: laboratory.com

  • DN base: dc=laboratory,dc=com

  • Admin: cn=admin

  • Contraseña: (elige una)


🧱 PASO 2: Crear archivo base.ldif

Este archivo crea la base de tu árbol LDAP: la organización y unidad de personas.

base.ldif
dn: ou=people,dc=laboratory,dc=com
objectClass: organizationalUnit
ou: people

dn: ou=groups,dc=laboratory,dc=com
objectClass: organizationalUnit
ou: groups

Aplicarlo:

sudo ldapadd -x -D "cn=admin,dc=laboratory,dc=com" -W -f base.ldif

👤 PASO 3: Añadir usuarios de prueba

juan.ldif
dn: uid=juan,ou=people,dc=laboratory,dc=com
objectClass: inetOrgPerson
uid: juan
sn: Pérez
cn: Juan Pérez
userPassword: {CRYPT}x

⚠️ Usa {CRYPT}x como marcador de contraseña si no quieres asignar una real aún.

sudo ldapadd -x -D "cn=admin,dc=laboratory,dc=com" -W -f juan.ldif

🔍 PASO 4: Buscar entradas

ldapsearch -x -b "dc=laboratory,dc=com" "(objectClass=inetOrgPerson)"

Buscar sólo a juan:

ldapsearch -x -b "ou=people,dc=laboratory,dc=com" "uid=juan"

❌ PASO 5: Eliminar entradas

ldapdelete -x -D "cn=admin,dc=laboratory,dc=com" -W "uid=juan,ou=people,dc=laboratory,dc=com"

🔑 PASO 6: Cambiar contraseña

ldappasswd -x -D "cn=admin,dc=laboratory,dc=com" -W \
    "uid=juan,ou=people,dc=laboratory,dc=com"

🔎 PASO 7: Consultar con getent

(Primero debes tener NSS configurado para LDAP. Si aún no lo has hecho, te puedo ayudar con eso.)

getent passwd juan
getent group

👥 PASO 8: Crear grupos y añadir usuarios a ellos

grupo.ldif
dn: cn=developers,ou=groups,dc=laboratory,dc=com
objectClass: posixGroup
cn: developers
gidNumber: 10000
memberUid: juan
sudo ldapadd -x -D "cn=admin,dc=laboratory,dc=com" -W -f grupo.ldif

⚙️ PASO 9: Usar chage para gestión de contraseñas (usuarios locales)

sudo chage -l juan   # Ver tiempos
sudo chage -M 30 juan   # Obligar cambio de contraseña cada 30 días

🧰 PASO 10: Usar useradd, usermod, groupadd, etc.

sudo groupadd backupers
sudo useradd -m -s /bin/bash -G backupers juanlocal
sudo passwd juanlocal
sudo chage -M 90 juanlocal

📦 OPCIONAL: Automatiza tareas con script

Por ejemplo, un pequeño script que busque todos los usuarios y guarde el resultado:

#!/bin/bash
ldapsearch -x -b "ou=people,dc=laboratory,dc=com" "(objectClass=inetOrgPerson)" > todos_los_usuarios.ldif

Más info:

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.

add (añadir)

delete (eliminar)

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 .

➕
❌
Curlie
siguiente tutorial
OpenLDAP Software 2.4 Administrator's Guide
Directory Service
Lightweight Directory Access Protocol
System Security Services Daemon
White Pages Schema
📊
RFC 2116
RFC 2251
OpenLDAP
Page cover image
Esquema básico
Podríamos decir que LDAP esta estructurado parecido a como estaban las antiguas páginas amarillas
Funcionamiento conceptual de slapd
Menú de configuración