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:

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

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

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.