210.3 - Uso de cliente LDAP

Peso: 2

Conceptos fundamentales de LDAP

LDAP (Lightweight Directory Access Protocol) es un protocolo para acceder y gestionar servicios de directorio. Funciona sobre el puerto 389 (sin cifrar) y 636 (LDAPS con TLS/SSL).

Estructura del directorio LDAP

LDAP organiza la información en una estructura jerárquica de árbol (DIT - Directory Information Tree):

dc=ejemplo,dc=com
├── ou=personas
│   ├── uid=juan
│   └── uid=maria
├── ou=grupos
│   ├── cn=administradores
│   └── cn=usuarios
└── ou=equipos
    └── cn=servidor01

Terminología clave

TérminoDescripciónEjemplo
DN (Distinguished Name)Nombre completo y único de una entradauid=juan,ou=personas,dc=ejemplo,dc=com
RDN (Relative DN)Componente relativo del DNuid=juan
Base DNPunto de inicio para las búsquedasdc=ejemplo,dc=com
objectClassDefine qué atributos puede/debe tener una entradainetOrgPerson, posixAccount
AtributoPar clave-valor dentro de una entradacn: Juan García

Para el examen: Entender la diferencia entre DN, RDN y Base DN es fundamental. El DN es la ruta completa, el RDN es el nombre relativo, y el Base DN es el punto de inicio de búsquedas.

ObjectClasses comunes

objectClassUso
topClase base obligatoria
personInformación básica de persona (cn, sn)
organizationalPersonExtensión de person con datos organizativos
inetOrgPersonPersona con datos de Internet (mail, uid)
posixAccountCuenta POSIX (uidNumber, gidNumber, homeDirectory)
posixGroupGrupo POSIX (gidNumber, memberUid)
organizationalUnitUnidad organizativa (ou)

Formato LDIF

LDIF (LDAP Data Interchange Format) es el formato de texto para representar entradas LDAP y modificaciones.

Ejemplo de entrada LDIF

dn: uid=juan,ou=personas,dc=ejemplo,dc=com
objectClass: top
objectClass: person
objectClass: organizationalPerson
objectClass: inetOrgPerson
objectClass: posixAccount
uid: juan
cn: Juan García
sn: García
givenName: Juan
mail: juan@ejemplo.com
uidNumber: 1001
gidNumber: 1001
homeDirectory: /home/juan
loginShell: /bin/bash
userPassword: {SSHA}hash_de_contraseña

LDIF para modificaciones

# Modificar un atributo
dn: uid=juan,ou=personas,dc=ejemplo,dc=com
changetype: modify
replace: mail
mail: juan.garcia@ejemplo.com
 
# Añadir un atributo
dn: uid=juan,ou=personas,dc=ejemplo,dc=com
changetype: modify
add: telephoneNumber
telephoneNumber: +34 600 123 456
 
# Eliminar un atributo
dn: uid=juan,ou=personas,dc=ejemplo,dc=com
changetype: modify
delete: telephoneNumber

Para el examen: Conocer la sintaxis LDIF es imprescindible: cada entrada empieza con dn:, las entradas se separan con líneas en blanco, y las modificaciones usan changetype: modify con add, replace o delete.

Herramientas de cliente LDAP

ldapsearch

Realiza búsquedas en el directorio LDAP:

# Búsqueda básica
ldapsearch -x -b "dc=ejemplo,dc=com" "(uid=juan)"
 
# Búsqueda con autenticación
ldapsearch -x -D "cn=admin,dc=ejemplo,dc=com" -W -b "dc=ejemplo,dc=com" "(objectClass=posixAccount)"
 
# Buscar solo atributos específicos
ldapsearch -x -b "dc=ejemplo,dc=com" "(uid=juan)" cn mail uidNumber
 
# Búsqueda con STARTTLS
ldapsearch -x -ZZ -b "dc=ejemplo,dc=com" "(uid=juan)"
 
# Búsqueda en servidor específico
ldapsearch -x -H ldap://ldap.ejemplo.com -b "dc=ejemplo,dc=com" "(cn=*)"

Opciones comunes de ldapsearch

OpciónDescripción
-xAutenticación simple (en lugar de SASL)
-bBase DN para la búsqueda
-DDN del usuario para autenticarse (bind DN)
-WSolicitar contraseña de forma interactiva
-wContraseña en la línea de comandos
-HURI del servidor LDAP
-ZZForzar STARTTLS (falla si no es posible)
-ZIntentar STARTTLS (continúa si falla)
-sAlcance de búsqueda: base, one, sub
-LSalida en formato LDIF
-LLLDIF sin comentarios
-LLLLDIF sin comentarios ni versión

Alcance de búsqueda (-s)

AlcanceDescripción
baseSolo la entrada especificada por el Base DN
oneSolo un nivel por debajo del Base DN
subTodo el subárbol desde el Base DN (por defecto)

ldapadd

Añade nuevas entradas al directorio desde un archivo LDIF:

# Añadir desde un archivo LDIF
ldapadd -x -D "cn=admin,dc=ejemplo,dc=com" -W -f nueva_entrada.ldif
 
# Añadir con contraseña en línea
ldapadd -x -D "cn=admin,dc=ejemplo,dc=com" -w secreto -f usuarios.ldif

ldapmodify

Modifica entradas existentes en el directorio:

# Modificar desde un archivo LDIF
ldapmodify -x -D "cn=admin,dc=ejemplo,dc=com" -W -f cambios.ldif
 
# Ejemplo de archivo de cambios
# changetype: modify
# replace: mail
# mail: nuevo@ejemplo.com

ldapdelete

Elimina entradas del directorio:

# Eliminar una entrada específica
ldapdelete -x -D "cn=admin,dc=ejemplo,dc=com" -W "uid=juan,ou=personas,dc=ejemplo,dc=com"
 
# Eliminar recursivamente
ldapdelete -x -D "cn=admin,dc=ejemplo,dc=com" -W -r "ou=temporal,dc=ejemplo,dc=com"

Para el examen: Todos los comandos de cliente LDAP comparten las opciones -x (autenticación simple), -D (bind DN), -W (pedir contraseña) y -H (servidor). Memoriza estas opciones comunes.

Configuración del cliente LDAP

Archivo /etc/ldap/ldap.conf

Este archivo configura los valores por defecto para las herramientas de cliente LDAP:

# /etc/ldap/ldap.conf (Debian/Ubuntu)
# /etc/openldap/ldap.conf (RHEL/CentOS)
 
BASE    dc=ejemplo,dc=com
URI     ldap://ldap.ejemplo.com ldaps://ldap.ejemplo.com
 
# Configuración TLS
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt
TLS_REQCERT     demand
TLS_CACERTDIR   /etc/ssl/certs
 
# Timeout
TIMEOUT     15
NETWORK_TIMEOUT 10

Directivas principales de ldap.conf

DirectivaDescripción
BASEBase DN por defecto para búsquedas
URIURI del servidor LDAP
TLS_CACERTRuta al certificado CA
TLS_CACERTDIRDirectorio de certificados CA
TLS_REQCERTNivel de verificación de certificado: never, allow, try, demand
TIMEOUTTimeout general de operación (segundos)
NETWORK_TIMEOUTTimeout de conexión de red (segundos)

Configuración TLS/STARTTLS

Niveles de verificación TLS_REQCERT

ValorComportamiento
neverNo se verifica el certificado del servidor
allowSe verifica pero se permite la conexión aunque falle
trySe verifica si el servidor presenta certificado
demandSe requiere un certificado válido (recomendado en producción)

Integración LDAP con NSS y PAM

Configuración con nss-ldap

El archivo /etc/nsswitch.conf se modifica para incluir LDAP como fuente de nombres:

# /etc/nsswitch.conf
passwd:     files ldap
group:      files ldap
shadow:     files ldap

Configuración con SSSD

SSSD es la solución moderna para integrar autenticación LDAP:

# /etc/sssd/sssd.conf
[sssd]
services = nss, pam
domains = ejemplo.com
 
[domain/ejemplo.com]
id_provider = ldap
auth_provider = ldap
ldap_uri = ldap://ldap.ejemplo.com
ldap_search_base = dc=ejemplo,dc=com
ldap_tls_reqcert = demand
ldap_tls_cacert = /etc/ssl/certs/ca-certificates.crt

Para el examen: SSSD es la forma recomendada actualmente para integrar LDAP con el sistema. Conocer tanto la configuración tradicional (nss-ldap/pam_ldap) como la moderna (SSSD) es necesario.

Resumen de archivos clave

ArchivoFunción
/etc/ldap/ldap.confConfiguración del cliente LDAP (Debian)
/etc/openldap/ldap.confConfiguración del cliente LDAP (RHEL)
/etc/nsswitch.confFuentes de resolución de nombres
/etc/sssd/sssd.confConfiguración de SSSD
/etc/nslcd.confConfiguración del demonio nslcd (nss-ldap)

Trampas del examen

Errores comunes y distinciones criticas que LPI suele evaluar en este subtema:

  • DN vs RDN vs Base DN — DN es la ruta completa (uid=juan,ou=personas,dc=ejemplo,dc=com), RDN es el componente relativo (uid=juan), Base DN es el punto de inicio de busquedas (dc=ejemplo,dc=com). El examen confunde estos tres conceptos frecuentemente.

  • -x es obligatorio para autenticacion simple en ldapsearch — sin -x, los comandos LDAP intentan autenticacion SASL. Si el servidor no tiene SASL configurado, la consulta falla. Casi siempre se necesita -x en el examen.

  • -ZZ fuerza STARTTLS, -Z solo lo intenta — con -ZZ (doble Z), si STARTTLS falla la conexion se aborta. Con -Z (una sola Z), si falla se continua sin cifrado. Para seguridad en produccion, siempre -ZZ.

  • Puerto 389 (LDAP) vs 636 (LDAPS) — LDAP en el 389 puede usar STARTTLS para cifrar. LDAPS en el 636 usa TLS desde el inicio. Son mecanismos diferentes: STARTTLS es una actualizacion de la conexion, LDAPS es cifrado desde la conexion.

  • LDIF: las entradas se separan con lineas en blanco — cada entrada comienza con dn: y las entradas consecutivas DEBEN separarse con una linea vacia. Olvidar la linea en blanco causa errores de parseo.

  • TLS_REQCERT demand es el valor seguro para produccionnever acepta cualquier certificado (inseguro), allow acepta incluso certificados invalidos, try verifica solo si se presenta. Solo demand garantiza la validacion completa del certificado.

  • Alcance de busqueda: sub es el predeterminadosub busca en todo el subarbol, one solo un nivel abajo, base solo la entrada exacta. Si no se especifica -s, se usa sub.

  • ldapadd es equivalente a ldapmodify -a — ambos anaden entradas. Pero ldapmodify sin -a solo modifica entradas existentes. Si usas ldapmodify con un LDIF que no tiene changetype, falla.

  • Ruta del archivo ldap.conf difiere entre distribuciones — en Debian es /etc/ldap/ldap.conf, en RHEL es /etc/openldap/ldap.conf. El examen puede preguntar la ruta segun la distribucion.

  • SSSD es la solucion moderna, nss-ldap/pam_ldap es la tradicional — el examen puede preguntar por ambas. SSSD usa /etc/sssd/sssd.conf con permisos 600 obligatorios. La configuracion tradicional usa /etc/nsswitch.conf con passwd: files ldap.