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.