Instalación y Configuración de OpenLDAP en Linux
OpenLDAP proporciona un servicio de directorio centralizado que permite gestionar usuarios, grupos y credenciales de autenticación para todos los servidores y aplicaciones de tu infraestructura desde un único punto. En lugar de crear y gestionar cuentas de usuario en cada servidor individualmente, con OpenLDAP los usuarios se autentican contra el directorio central y tienen acceso a todos los sistemas con las mismas credenciales. Esta guía cubre la instalación de slapd, la configuración del esquema, el cifrado TLS y la integración de clientes Linux.
Requisitos Previos
- Servidor Linux (Ubuntu 20.04+, Debian 11+, CentOS 8+)
- Nombre de dominio configurado o un FQDN (p.ej.,
ldap.empresa.com) - Acceso root o sudo
- Conexión de red entre el servidor LDAP y los clientes
Instalación de OpenLDAP (slapd)
Ubuntu/Debian
# Actualizar el sistema e instalar OpenLDAP
sudo apt-get update
sudo apt-get install -y slapd ldap-utils
# Durante la instalación se pedirá la contraseña del administrador LDAP
# Si no se configuró o quieres reconfigurar:
sudo dpkg-reconfigure slapd
# Opciones durante la configuración:
# - Omit OpenLDAP server configuration: No
# - DNS domain name: empresa.com (determina el DN base: dc=empresa,dc=com)
# - Organization name: Mi Empresa
# - Administrator password: (introduce una contraseña segura)
# - Database backend: MDB
# - Remove database when slapd is purged: No
# - Move old database: Yes
CentOS/Rocky Linux
# Instalar OpenLDAP y las utilidades
sudo dnf install -y openldap openldap-servers openldap-clients
# Copiar la configuración de ejemplo
cp /usr/share/openldap-servers/DB_CONFIG.example /var/lib/ldap/DB_CONFIG
chown ldap:ldap /var/lib/ldap/DB_CONFIG
# Habilitar e iniciar el servicio
sudo systemctl enable --now slapd
# Verificar que el servicio está activo
sudo systemctl status slapd
Verificar la instalación
# Probar la conexión local
ldapsearch -x -H ldap://localhost -b "" -s base namingContexts
# Debería devolver el DN base configurado:
# dn:
# namingContexts: dc=empresa,dc=com
Configuración del Directorio
Estructura básica del directorio
# El DIT (Directory Information Tree) básico:
# dc=empresa,dc=com
# ├── ou=usuarios,dc=empresa,dc=com
# ├── ou=grupos,dc=empresa,dc=com
# └── ou=sistemas,dc=empresa,dc=com
Crear la estructura base
# Crear el archivo LDIF con la estructura organizacional
cat > /tmp/estructura-base.ldif << 'EOF'
# Unidad organizativa para usuarios
dn: ou=usuarios,dc=empresa,dc=com
objectClass: organizationalUnit
ou: usuarios
description: Usuarios del sistema
# Unidad organizativa para grupos
dn: ou=grupos,dc=empresa,dc=com
objectClass: organizationalUnit
ou: grupos
description: Grupos del sistema
# Unidad organizativa para sistemas
dn: ou=sistemas,dc=empresa,dc=com
objectClass: organizationalUnit
ou: sistemas
description: Cuentas de servicio
EOF
# Importar la estructura (reemplaza ADMIN_PASSWORD con tu contraseña)
ldapadd -x -D "cn=admin,dc=empresa,dc=com" \
-W \
-H ldap://localhost \
-f /tmp/estructura-base.ldif
Gestión de Usuarios y Grupos
Crear un usuario
# Generar el hash de la contraseña del usuario
slappasswd -s "contraseña-del-usuario"
# Salida: {SSHA}hasheado=
# Crear el LDIF del usuario
cat > /tmp/usuario-juan.ldif << 'EOF'
dn: uid=jgarcia,ou=usuarios,dc=empresa,dc=com
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: jgarcia
cn: Juan García
sn: García
givenName: Juan
mail: [email protected]
userPassword: {SSHA}HASH_GENERADO_AQUI
uidNumber: 10001
gidNumber: 10001
homeDirectory: /home/jgarcia
loginShell: /bin/bash
shadowMin: 0
shadowMax: 90
shadowWarning: 7
EOF
# Añadir el usuario al directorio
ldapadd -x -D "cn=admin,dc=empresa,dc=com" \
-W \
-H ldap://localhost \
-f /tmp/usuario-juan.ldif
Crear un grupo
cat > /tmp/grupo-sysadmins.ldif << 'EOF'
dn: cn=sysadmins,ou=grupos,dc=empresa,dc=com
objectClass: posixGroup
cn: sysadmins
gidNumber: 10001
description: Administradores del sistema
memberUid: jgarcia
memberUid: mlopez
EOF
ldapadd -x -D "cn=admin,dc=empresa,dc=com" \
-W \
-H ldap://localhost \
-f /tmp/grupo-sysadmins.ldif
Modificar y eliminar entradas
# Cambiar la contraseña de un usuario
ldappasswd -x -D "cn=admin,dc=empresa,dc=com" \
-W \
-H ldap://localhost \
-S "uid=jgarcia,ou=usuarios,dc=empresa,dc=com"
# Añadir un atributo a una entrada existente
cat > /tmp/modificar-usuario.ldif << 'EOF'
dn: uid=jgarcia,ou=usuarios,dc=empresa,dc=com
changetype: modify
add: telephoneNumber
telephoneNumber: +34 612 345 678
EOF
ldapmodify -x -D "cn=admin,dc=empresa,dc=com" -W -f /tmp/modificar-usuario.ldif
# Eliminar una entrada
ldapdelete -x -D "cn=admin,dc=empresa,dc=com" \
-W \
"uid=jgarcia,ou=usuarios,dc=empresa,dc=com"
Configuración de TLS/SSL
El cifrado TLS es fundamental para proteger las credenciales en tránsito.
# Crear los certificados SSL para el servidor LDAP
# (usar certificados de Let's Encrypt en producción)
# Opción: generar certificados autofirmados
sudo mkdir -p /etc/ldap/ssl
cd /etc/ldap/ssl
# Generar la clave privada y el certificado autofirmado
sudo openssl req -new -x509 -nodes \
-out /etc/ldap/ssl/ldap-cert.pem \
-keyout /etc/ldap/ssl/ldap-key.pem \
-days 3650 \
-subj "/CN=ldap.empresa.com/O=Empresa/C=ES"
sudo chmod 644 /etc/ldap/ssl/ldap-cert.pem
sudo chmod 600 /etc/ldap/ssl/ldap-key.pem
sudo chown openldap:openldap /etc/ldap/ssl/ldap-key.pem
Configurar TLS en slapd
# Crear el LDIF de configuración TLS
cat > /tmp/configurar-tls.ldif << 'EOF'
dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ldap/ssl/ldap-cert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ldap/ssl/ldap-cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ldap/ssl/ldap-key.pem
EOF
# Aplicar la configuración TLS
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/configurar-tls.ldif
# Reiniciar slapd
sudo systemctl restart slapd
# Probar la conexión con TLS
ldapsearch -x -H ldaps://ldap.empresa.com \
-b "dc=empresa,dc=com" \
-D "cn=admin,dc=empresa,dc=com" \
-W "(objectClass=*)"
Configurar LDAPS en el firewall
# Abrir los puertos LDAP y LDAPS
sudo ufw allow 389/tcp # LDAP (con STARTTLS)
sudo ufw allow 636/tcp # LDAPS (TLS desde el inicio)
Integración de Clientes Linux
Ubuntu/Debian
# Instalar los paquetes de integración LDAP
sudo apt-get install -y libnss-ldapd libpam-ldapd nscd
# Durante la instalación configurar:
# - LDAP server URI: ldap://IP_SERVIDOR_LDAP
# - LDAP base DN: dc=empresa,dc=com
# - Name services to configure: passwd, group, shadow
# O configurar manualmente en /etc/nslcd.conf
sudo cat > /etc/nslcd.conf << 'EOF'
uid nslcd
gid nslcd
uri ldap://IP_SERVIDOR_LDAP
base dc=empresa,dc=com
binddn cn=readonly,dc=empresa,dc=com
bindpw clave-solo-lectura
# Mapeos para usuarios y grupos Unix
base passwd ou=usuarios,dc=empresa,dc=com
base group ou=grupos,dc=empresa,dc=com
base shadow ou=usuarios,dc=empresa,dc=com
# Opciones de TLS
tls_reqcert allow
EOF
sudo systemctl restart nslcd nscd
Configurar PAM para autenticación LDAP
# Editar /etc/pam.d/common-auth para incluir LDAP
# (este cambio se aplica automáticamente si instalas libpam-ldapd)
# Verificar que la autenticación LDAP funciona
getent passwd jgarcia
# Debería mostrar el usuario del directorio LDAP
getent group sysadmins
# Debería mostrar el grupo del directorio LDAP
Búsqueda y Administración LDAP
# Búsqueda básica: listar todos los usuarios
ldapsearch -x -H ldap://localhost \
-b "ou=usuarios,dc=empresa,dc=com" \
-D "cn=admin,dc=empresa,dc=com" \
-W "(objectClass=posixAccount)" \
uid cn mail
# Buscar un usuario específico
ldapsearch -x -H ldap://localhost \
-b "dc=empresa,dc=com" \
-D "cn=admin,dc=empresa,dc=com" \
-W "(uid=jgarcia)"
# Listar todos los grupos y sus miembros
ldapsearch -x -H ldap://localhost \
-b "ou=grupos,dc=empresa,dc=com" \
-D "cn=admin,dc=empresa,dc=com" \
-W "(objectClass=posixGroup)" \
cn memberUid
# Contar el número de usuarios
ldapsearch -x -H ldap://localhost \
-b "ou=usuarios,dc=empresa,dc=com" \
-D "cn=admin,dc=empresa,dc=com" \
-W "(objectClass=posixAccount)" \
| grep "^dn:" | wc -l
Replicación del Directorio
Para alta disponibilidad, configura un servidor esclavo que replica el directorio principal.
# En el servidor primario: configurar como proveedor de sincronización
cat > /tmp/configurar-sync-primario.ldif << 'EOF'
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncProvOverlay
olcSyncProvOverlay: syncprov
-
add: olcSpCheckpoint
olcSpCheckpoint: 100 10
EOF
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/configurar-sync-primario.ldif
# En el servidor secundario: configurar como consumidor
cat > /tmp/configurar-sync-secundario.ldif << 'EOF'
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcSyncRepl
olcSyncRepl: rid=001
provider=ldap://IP_SERVIDOR_PRIMARIO
bindmethod=simple
binddn="cn=admin,dc=empresa,dc=com"
credentials=ADMIN_PASSWORD
searchbase="dc=empresa,dc=com"
scope=sub
schemachecking=on
type=refreshAndPersist
retry="30 5 300 3"
interval=00:00:05:00
EOF
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/configurar-sync-secundario.ldif
Solución de Problemas
El servicio slapd no inicia
# Ver los mensajes de error
sudo journalctl -u slapd -n 30
# Verificar la configuración
sudo slaptest -u
# Comprobar permisos de los directorios
ls -la /etc/ldap/slapd.d/
ls -la /var/lib/ldap/
Error de autenticación: Invalid credentials
# Verificar el DN del administrador y la contraseña
ldapsearch -x -H ldap://localhost \
-b "dc=empresa,dc=com" \
-D "cn=admin,dc=empresa,dc=com" \
-W "(objectClass=*)" dn
Los usuarios LDAP no aparecen en el cliente
# Verificar la configuración de nsswitch
grep ldap /etc/nsswitch.conf
# Debería mostrar:
# passwd: files ldap
# group: files ldap
# shadow: files ldap
# Reiniciar los servicios de nombre
sudo systemctl restart nslcd nscd
Problemas de rendimiento con muchos usuarios
# Añadir índices para mejorar el rendimiento de búsquedas
cat > /tmp/indices.ldif << 'EOF'
dn: olcDatabase={1}mdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uid eq
olcDbIndex: mail eq
olcDbIndex: memberUid eq
olcDbIndex: uidNumber eq
olcDbIndex: gidNumber eq
EOF
sudo ldapmodify -Y EXTERNAL -H ldapi:/// -f /tmp/indices.ldif
Conclusión
OpenLDAP instalado y configurado correctamente proporciona una base sólida para la gestión centralizada de identidades en cualquier infraestructura Linux. Con TLS para cifrado, replicación para alta disponibilidad e índices para rendimiento, el directorio LDAP puede escalar para gestionar miles de usuarios y servir como fuente de autenticación para todos los servicios de la organización, desde servidores SSH hasta aplicaciones web.


