--- title: "Cómo instalar y configurar OpenLDAP en Ubuntu 24.04" description: "Instala OpenLDAP (slapd) en Ubuntu 24.04, crea usuarios y grupos POSIX, cifra las conexiones con StartTLS y conecta clientes Linux mediante SSSD." category: "Gestión de Identidad y Acceso" language: es source: https://cubepath.com/es/docs/gestión-de-identidad-y-acceso/instalacion-y-configuracion-de-openldap updated: 2026-09-25 --- # Cómo instalar y configurar OpenLDAP en Ubuntu 24.04 OpenLDAP es la implementación de código abierto más extendida del protocolo LDAP. Con un directorio central, los usuarios y grupos se definen una sola vez y todos los servidores Linux de tu infraestructura los consultan para autenticar, en lugar de mantener cuentas locales en cada máquina. En este tutorial instalarás el servidor OpenLDAP (`slapd`) en Ubuntu 24.04, crearás la estructura del directorio con un usuario y un grupo, cifrarás las conexiones con StartTLS y configurarás un cliente Ubuntu para que inicie sesión con esas cuentas mediante SSSD. ## Requisitos previos Para seguir esta guía necesitas: - Dos servidores con Ubuntu 24.04 LTS, por ejemplo dos VPS de CubePath: uno para el servidor LDAP y otro que hará de cliente. Idealmente conectados por una red privada. - Un usuario no root con privilegios `sudo` en ambos. - Un nombre de host para el servidor LDAP que el cliente pueda resolver. En esta guía se usa `ldap.example.com` y el dominio `example.com`, que da como base del directorio `dc=example,dc=com`. Sustitúyelos por los tuyos. - UFW activo en el servidor con SSH permitido. Si no tienes DNS para el nombre del servidor, añade una línea con su IP privada en `/etc/hosts` de ambas máquinas: ```text 10.0.0.10 ldap.example.com ldap ``` ## Paso 1: Instalar slapd Instala el servidor y las utilidades de línea de comandos (`ldapsearch`, `ldapadd`, `ldapmodify`...): ```bash sudo apt update sudo apt install slapd ldap-utils ``` La instalación pide la contraseña del administrador del directorio, pero el sufijo lo deduce del nombre de host y puede no ser el que quieres. Reconfigura el paquete para fijarlo explícitamente: ```bash sudo dpkg-reconfigure slapd ``` Responde a las preguntas así: - **Omit OpenLDAP server configuration?** No - **DNS domain name:** `example.com` (genera la base `dc=example,dc=com`) - **Organization name:** el nombre de tu organización - **Administrator password:** una contraseña robusta para `cn=admin,dc=example,dc=com` - **Do you want the database to be removed when slapd is purged?** No - **Move old database?** Yes Comprueba que el servicio está activo: ```bash sudo systemctl status slapd --no-pager ``` ```output Active: active (running) since ... ``` Y que el directorio responde con la base correcta: ```bash ldapsearch -x -LLL -H ldap://localhost -b "" -s base namingContexts ``` ```output dn: namingContexts: dc=example,dc=com ``` ## Paso 2: Crear las unidades organizativas Un directorio se organiza como un árbol. Crearás dos unidades organizativas (OU): `people` para los usuarios y `groups` para los grupos. En LDAP los cambios se describen en archivos LDIF. Crea el archivo: ```bash nano ~/base.ldif ``` Con este contenido: ```text dn: ou=people,dc=example,dc=com objectClass: organizationalUnit ou: people dn: ou=groups,dc=example,dc=com objectClass: organizationalUnit ou: groups ``` Cárgalo autenticándote como administrador. La opción `-W` pide la contraseña que definiste en el paso 1: ```bash ldapadd -x -D cn=admin,dc=example,dc=com -W -f ~/base.ldif ``` ```output adding new entry "ou=people,dc=example,dc=com" adding new entry "ou=groups,dc=example,dc=com" ``` ## Paso 3: Crear un grupo y un usuario Para que Linux pueda usar las cuentas del directorio, los usuarios necesitan los atributos POSIX (`uidNumber`, `gidNumber`, `homeDirectory`, `loginShell`), que aporta la clase `posixAccount`. El esquema `nis` que la incluye viene cargado por defecto en Ubuntu. Usa números de UID y GID altos (a partir de 10000) para que no choquen con las cuentas locales de ningún servidor. Crea el archivo del grupo y el usuario: ```bash nano ~/users.ldif ``` ```text dn: cn=sysadmins,ou=groups,dc=example,dc=com objectClass: posixGroup cn: sysadmins gidNumber: 10000 memberUid: jgarcia dn: uid=jgarcia,ou=people,dc=example,dc=com objectClass: inetOrgPerson objectClass: posixAccount objectClass: shadowAccount uid: jgarcia cn: Juan Garcia givenName: Juan sn: Garcia mail: jgarcia@example.com uidNumber: 10001 gidNumber: 10000 homeDirectory: /home/jgarcia loginShell: /bin/bash ``` Añade las entradas: ```bash ldapadd -x -D cn=admin,dc=example,dc=com -W -f ~/users.ldif ``` El usuario todavía no tiene contraseña. Asígnale una con `ldappasswd`, que la guarda como hash en el atributo `userPassword`. La opción `-S` pide la contraseña nueva del usuario y `-W` la del administrador: ```bash ldappasswd -x -D cn=admin,dc=example,dc=com -W -S uid=jgarcia,ou=people,dc=example,dc=com ``` Comprueba que el usuario puede autenticarse con su propia contraseña: ```bash ldapwhoami -x -D uid=jgarcia,ou=people,dc=example,dc=com -W ``` ```output dn:uid=jgarcia,ou=people,dc=example,dc=com ``` Para modificar un atributo más adelante, usa `ldapmodify` con un LDIF de tipo `changetype: modify`. Por ejemplo, para cambiar la shell crea `~/change-shell.ldif` con este contenido: ```text dn: uid=jgarcia,ou=people,dc=example,dc=com changetype: modify replace: loginShell loginShell: /bin/zsh ``` ```bash ldapmodify -x -D cn=admin,dc=example,dc=com -W -f ~/change-shell.ldif ``` ## Paso 4: Cifrar las conexiones con StartTLS Sin cifrado, las contraseñas viajan en texto claro por la red. Con StartTLS el cliente se conecta al puerto 389 habitual y negocia TLS antes de enviar credenciales. SSSD, que usarás en el cliente, se niega a autenticar sin TLS. Genera un certificado autofirmado para el nombre del servidor. El SAN (`subjectAltName`) debe coincidir con el nombre que usan los clientes: ```bash sudo openssl req -x509 -newkey rsa:3072 -nodes -days 825 \ -keyout /etc/ldap/ldap_key.pem \ -out /etc/ldap/ldap_cert.pem \ -subj "/CN=ldap.example.com" \ -addext "subjectAltName=DNS:ldap.example.com" ``` `slapd` se ejecuta como el usuario `openldap`, así que debe poder leer la clave. Dale acceso de lectura al grupo sin exponerla al resto: ```bash sudo chgrp openldap /etc/ldap/ldap_key.pem sudo chmod 0640 /etc/ldap/ldap_key.pem ``` Como el certificado es autofirmado, añádelo a los certificados de confianza del sistema. Las herramientas de `ldap-utils` usan ese almacén por defecto: ```bash sudo cp /etc/ldap/ldap_cert.pem /usr/local/share/ca-certificates/ldap-example.crt sudo update-ca-certificates ``` La configuración de `slapd` vive en el propio directorio (`cn=config`) y se modifica con LDIF. Crea el archivo: ```bash nano ~/tls.ldif ``` ```text dn: cn=config changetype: modify replace: olcTLSCACertificateFile olcTLSCACertificateFile: /etc/ldap/ldap_cert.pem - replace: olcTLSCertificateFile olcTLSCertificateFile: /etc/ldap/ldap_cert.pem - replace: olcTLSCertificateKeyFile olcTLSCertificateKeyFile: /etc/ldap/ldap_key.pem ``` Aplícalo con autenticación `EXTERNAL` a través del socket local, que identifica a root como administrador de la configuración sin contraseña: ```bash sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f ~/tls.ldif ``` ```output SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=config" ``` Prueba la conexión con StartTLS. La opción `-ZZ` exige que TLS se negocie correctamente y falla si no: ```bash ldapwhoami -x -ZZ -H ldap://ldap.example.com ``` ```output anonymous ``` > Tip: en producción puedes usar un certificado de tu CA interna o de Let's Encrypt en lugar de uno autofirmado. En ese caso los clientes ya confían en él y no necesitas copiar el certificado a cada máquina. Por último, permite el puerto LDAP solo desde la red de tus clientes. Ajusta la subred a la tuya: ```bash sudo ufw allow from 10.0.0.0/24 to any port 389 proto tcp ``` ## Paso 5: Configurar un cliente Linux con SSSD SSSD es el servicio que Ubuntu recomienda para que el sistema obtenga usuarios y grupos de un directorio y los autentique, con caché para seguir funcionando si el servidor no está disponible un momento. En el **servidor cliente**, instala SSSD con el backend LDAP: ```bash sudo apt update sudo apt install sssd-ldap ldap-utils ``` Copia el certificado del servidor LDAP (`/etc/ldap/ldap_cert.pem`) al cliente, por ejemplo con `scp`, y añádelo a los certificados de confianza: ```bash sudo cp ldap_cert.pem /usr/local/share/ca-certificates/ldap-example.crt sudo update-ca-certificates ``` Comprueba que el cliente llega al servidor con TLS: ```bash ldapwhoami -x -ZZ -H ldap://ldap.example.com ``` Crea la configuración de SSSD: ```bash sudo nano /etc/sssd/sssd.conf ``` ```ini [sssd] config_file_version = 2 domains = example.com [domain/example.com] id_provider = ldap auth_provider = ldap ldap_uri = ldap://ldap.example.com ldap_search_base = dc=example,dc=com ldap_id_use_start_tls = true ldap_tls_reqcert = demand ldap_tls_cacert = /etc/ssl/certs/ca-certificates.crt cache_credentials = true ``` SSSD no arranca si el archivo es legible por otros usuarios. Ajusta los permisos y arranca el servicio: ```bash sudo chmod 0600 /etc/sssd/sssd.conf sudo systemctl enable --now sssd sudo systemctl restart sssd ``` Para que se cree el directorio personal la primera vez que un usuario del directorio inicia sesión, activa el módulo `mkhomedir` de PAM: ```bash sudo pam-auth-update --enable mkhomedir ``` Comprueba que el sistema ve el usuario y el grupo del directorio: ```bash getent passwd jgarcia getent group sysadmins ``` ```output jgarcia:*:10001:10000:Juan Garcia:/home/jgarcia:/bin/bash sysadmins:*:10000:jgarcia ``` Finalmente, inicia sesión con la cuenta del directorio: ```bash sudo login jgarcia ``` Tras introducir la contraseña que asignaste con `ldappasswd`, deberías tener una shell en `/home/jgarcia`. El inicio de sesión por SSH funciona igual si `sshd` tiene habilitada la autenticación por contraseña; con claves públicas, cada usuario necesita su `authorized_keys` en su directorio personal. ## Solución de problemas **`ldapadd` devuelve `Invalid credentials (49)`.** El DN o la contraseña del administrador no son correctos. Con `sudo slapcat -b cn=config | grep olcRootDN` ves el DN de administración real de la base de datos. **`ldapwhoami -ZZ` falla con `Connect error (-11)` o un error de certificado.** El nombre usado en `-H` no coincide con el SAN del certificado, o el cliente no confía en él. Comprueba que usas `ldap.example.com` y no la IP, y que ejecutaste `update-ca-certificates` en esa máquina. **`getent passwd jgarcia` no devuelve nada en el cliente.** Revisa el log de SSSD con `sudo journalctl -u sssd -n 50`. Tras corregir la configuración, borra la caché con `sudo sss_cache -E` y reinicia el servicio. **`slapd` no arranca tras un cambio en la configuración TLS.** Casi siempre es un problema de permisos de la clave. Comprueba que el grupo es `openldap` con `ls -l /etc/ldap/ldap_key.pem` y consulta `sudo journalctl -u slapd -n 30`. ## Conclusión Ya tienes un servidor OpenLDAP en Ubuntu 24.04 con usuarios y grupos POSIX, conexiones cifradas con StartTLS y un cliente que autentica contra el directorio con SSSD. Como siguientes pasos, puedes restringir las búsquedas anónimas y crear una cuenta de solo lectura para los clientes, exigir TLS en el servidor con el atributo `olcSecurity`, y añadir un segundo servidor con replicación `syncrepl` para tener alta disponibilidad.