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
sudoen ambos. - Un nombre de host para el servidor LDAP que el cliente pueda resolver. En esta guía se usa
ldap.example.comy el dominioexample.com, que da como base del directoriodc=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:
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...):
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:
sudo dpkg-reconfigure slapd
Responde a las preguntas así:
- Omit OpenLDAP server configuration? No
- DNS domain name:
example.com(genera la basedc=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:
sudo systemctl status slapd --no-pager
Active: active (running) since ...
Y que el directorio responde con la base correcta:
ldapsearch -x -LLL -H ldap://localhost -b "" -s base namingContexts
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:
nano ~/base.ldif
Con este contenido:
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:
ldapadd -x -D cn=admin,dc=example,dc=com -W -f ~/base.ldif
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:
nano ~/users.ldif
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: [email protected]
uidNumber: 10001
gidNumber: 10000
homeDirectory: /home/jgarcia
loginShell: /bin/bash
Añade las entradas:
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:
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:
ldapwhoami -x -D uid=jgarcia,ou=people,dc=example,dc=com -W
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:
dn: uid=jgarcia,ou=people,dc=example,dc=com
changetype: modify
replace: loginShell
loginShell: /bin/zsh
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:
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:
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:
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:
nano ~/tls.ldif
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:
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f ~/tls.ldif
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:
ldapwhoami -x -ZZ -H ldap://ldap.example.com
anonymous
Tipen 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:
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:
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:
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:
ldapwhoami -x -ZZ -H ldap://ldap.example.com
Crea la configuración de SSSD:
sudo nano /etc/sssd/sssd.conf
[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:
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:
sudo pam-auth-update --enable mkhomedir
Comprueba que el sistema ve el usuario y el grupo del directorio:
getent passwd jgarcia
getent group sysadmins
jgarcia:*:10001:10000:Juan Garcia:/home/jgarcia:/bin/bash
sysadmins:*:10000:jgarcia
Finalmente, inicia sesión con la cuenta del directorio:
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.
