Product SiteDocumentation Site

11.7. Directorio LDAP

OpenLDAP es una implementación del protocolo LDAP; en otras palabras, es una base de datos de propósito especial diseñada para almacenar directorios (N.T. directorio en el sentido de directorio/agenda de personas, equipos o configuraciones, no directorio de un sistema de archivos). En el caso de uso más común, utilizar un servidor LDAP permite centralizar la administración de las cuentas de usuario y los permisos relacionados. Además se puede replicar fácilmente una base de datos LDAP, lo que permite configurar varios servidores LDAP sincronizados. Cuando la red y la cantidad de usuarios crecen rápidamente se puede balancear la carga entre varios servidores.
Los datos LDAP son estructurados y jerárquicos. La estructura es definida por «esquemas» («schemas») que describen el tipo de objetos que la base de datos puede almacenar junto con una lista de todos sus atributos posibles. La sintaxis utilizada para hacer referencia a un objeto particular en la base de datos está basada en esta estructura, lo que explica su complejidad.

11.7.1. Instalación

El paquete slapd contiene el servidor OpenLDAP. El paquete ldap-utils incluye herramientas de línea de órdenes para interactuar con servidores LDAP.
La instalación de slapd normalmente solicita muy poca información, a menos que haya configurado debconf para que realice preguntas con menor prioridad. Afortunadamente basta ejecutar dpkg-reconfigure slapd para reconfigurar la base de datos LDAP más detalladamente:
  • ¿Evitar la configuración del servidor OpenLDAP? No, por supuesto que deseamos configurar este servicio.
  • Nombre de dominio DNS: «falcot.com».
  • Nombre de la organización: “Falcot Corp”.
  • Debe ingresar la contraseña de administración.
  • Base de datos a utilizar: «MDB».
  • ¿Desea eliminar la base de datos cuando se purge slapd? No. No tiene sentido arriesgarse a perder la base de datos por error.
  • ¿Mover una base de datos anterior? Esta pregunta sólo es realizada cuando se intenta configurarlo y ya existe una base de datos. Sólo responda «yes» si realmente desea iniciar nuevamente desde una base de datos limpia; por ejemplo, si ejecuta dpkg-reconfigure slapd inmediatamente después de instalarlo por primera vez.
  • ¿Permitir el protocol LDAPv2? No, no tiene sentido. Todas las herramientas que utilizaremos entienden el protocolo LDAPv3.
Ahora tiene configurada una base de datos mínima, como podrá ver con la siguiente consulta:
$ ldapsearch -x -b dc=falcot,dc=com
# extended LDIF
#
# LDAPv3
# base <dc=falcot,dc=com> with scope sub
# filter: (objectclass=*)
# requesting: ALL
#

# falcot.com
dn: dc=falcot,dc=com
objectClass: top
objectClass: dcObject
objectClass: organization
o: Falcot Corp
dc: falcot

# admin, falcot.com
dn: cn=admin,dc=falcot,dc=com
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator

# search result
search: 2
result: 0 Success

# numResponses: 3
# numEntries: 2
La consulta devolvió dos objetos: la organización en sí mismo y el usuario de administración.

11.7.2. Relleno del directorio

Debido a que una base de datos vacía no es particularmente útil, se trata ahora de integrar en ella todos los directorios existenes; esto incluye las bases de datos de usuarios, grupos, servicios y equipos.
El paquete migrationtools proporciona un conjunto de scripts para extraer los datos de los directorios estándar de Unix (/etc/passwd, /etc/group, /etc/services, /etc/hosts, etc.), convetir estos datos y agregarlos en la base de datos LDAP.
Una vez que instaló el paquete, es necesario editar el archivo /etc/migrationtools/migrate_common.ph; debe activar las opciones IGNORE_UID_BELOW y IGNORE_GID_BELOW (descomentarlas es suficiente) y debe actualizar DEFAULT_MAIL_DOMAIN/DEFAULT_BASE.
La operación de migración en sí es gestionada por el script migrate_all_online.sh, como sigue:
# cd /usr/share/migrationtools
# LDAPADD="/usr/bin/ldapadd -c" ETC_ALIASES=/dev/null ./migrate_all_online.sh
migrate_all_online.sh realizará unas pocas preguntas sobre la base de datos LDAP a la que migrará los datos. La Tabla 11.1 resume las respuestas dadas en el caso de uso de Falcot.

Tabla 11.1. Respuestas a las preguntas del script migrate_all_online.sh

PreguntaRespuesta
Contexto de nombre X.500dc=falcot,dc=com
Nombre del servidor LDAPlocalhost
Administrador del DNcn=admin,dc=falcot,dc=com
Credenciales Bindla contraseña de administración
Crear DUAConfigProfileno
Deliberadamente evitamos migrar el archivo /etc/aliases, ya que el esquema estándar provisto por Debian no incluye la estructura que utiliza este script para describir alias de correo. Si quisiéramos integrar estos datos en el directorio, debe agregar el archivo /etc/ldap/schema/misc.schema al esquema estándar.
Sepa también que el programa ldapadd tiene una opción -c; esta opción solicita que no se detenga el proceso en caso de errores. Es necesario utilizar esta opción debido a que la conversión del archivo /etc/services genera unos pocos errores que puede ignorar sin problemas.

11.7.3. Administración de cuentas con LDAP

Ahora que la base de datos LDAP contiene información útil, es momento de utilizar estos datos. Esta sección se enfoca en cómo configurar un sistema Linux para que los directorios de sistema utilicen la base de datos LDAP.

11.7.3.1. Configuración de NSS

El sistema NSS (cambio de servicio de nombres: «Name Service Switch», revise el recuadro YENDO MÁS ALLÁ NSS y bases de datos de sistema) es un sistema modular diseñado para definir u obtener información para directorios de sistemas. Utilizar LDAP como fuente de datos para NSS requiere instalar el paquete libnss-ldap. Al hacerlo, se harán unas pocas preguntas cuyas respuestas están resumidas en la Tabla 11.2.

Tabla 11.2. Configuración del paquete lbnss-ldap

PreguntaRespuesta
Identificar de recurso uniforme (URI) del servidor LDAPldap://ldap.falcot.com
Nombre distinguido de la base de búsquedadc=falcot,dc=com
Versión LDAP a utilizar3
¿La base de datos LDAP requiere inicio de sesión?no
Permisos LDAP especiales para rootsi
Modifique el archivo de configuración para que sólo pueda ser leído/escrito por su dueñono
cuenta LDAP para rootcn=admin,dc=falcot,dc=com
contraseña de la cuenta root de LDAPla contraseña de administración
Luego necesita modificar el archivo /etc/nsswitch.conf para configurar que NSS utilice el módulo ldap recién instalado.

Ejemplo 11.26. El archivo /etc/nsswitch.conf

# /etc/nsswitch.conf
#
# Ejemplo de configuración de la funcionalidad de GNU Name Service
# Switch. Si están instalados los paquetes «glibc-doc» e «info»,
# intente «info libc "Name Service Switch"» para más información
# sobre este archivo.

passwd: ldap compat
group: ldap compat
shadow: ldap compat

hosts: files dns ldap
networks: ldap files

protocols: ldap db files
services: ldap db files
ethers: ldap db files
rpc: ldap db files

netgroup: ldap files
Generalmente agregará el módulo ldap antes que los demás para que, de esa forma, sea consultado primero. La excepción notable es el servicio hosts ya que para contactar el servidor LDAP necesita una consulta de DNS primero (para resolver ldap.falcot.com). Sin esta excepción, una consulta de nombres intentaría consultar al servidor LDAP; esto dispararía una resolución de nombres para el servidor LDAP, y así sucesivamente en un ciclo infinito.
Si se debe considerar al servidor LDAP como autoritativo (e ignorar los archivos locales utilizados por el módulo files), puede configurar los servicios con la siguiente sintaxis:
servicio: ldap [NOTFOUND=return] files.
Si la entrada solicitada no existe en la base de datos LDAP, la consulta devolverá la respuesta «inexistente» aún cuando el recurso exista en uno de los archivos locales; sólo se utilizarán estos archivos locales cuando el servicio LDAP esté caído.

11.7.3.2. Configuración de PAM

Esta sección describe una configuración PAM (revise el recuadro TRAS BAMBALINAS /etc/environment y /etc/default/locale) que permitirá a las aplicaciones realizar las autenticaciones necesarias contra la base de datos LDAP.
El paquete libpam-ldap provee el módulo LDAP para PAM. La instalación de este paquete realiza unas pocas preguntas muy similares a aquellas en el paquete libnss-ldap; algunos parámetros de configuración (como el URI del servidor LDAP) son inclusive compartidos con el paquete libnss-ldap. Encontrará resumidas las respuestas en la Tabla 11.3.

Tabla 11.3. Configuración de libpam-ldap

PreguntaRespuesta
¿Permitir a la cuenta de administración LDAP comportarse como root local?Sí. Esto permite utilizar el programa passwd típico para modificar las contraseñas almacenadas en la base de datos LDAP.
¿La base de datos LDAP requiere inicio de sesión?no
cuenta LDAP para rootcn=admin,dc=falcot,dc=com
contraseña de la cuenta root de LDAPla contraseña de administración de la base de datos LDAP
Algoritmo local de cifrado para las contraseñascrypt
Instalar el paquete libpam-ldap automáticamente adapta la configuración PAM predeterminada definida en los archivos /etc/pam.d/common-auth, /etc/pam.d/common-password y /etc/pam.d/common-account. Este mecanismo utiliza la herramienta dedicada pam-auth-update (provista por el paquete libpam-runtime). El administrador también puede utilizar esta herramienta si desea activar o desactivar módulos PAM.

11.7.3.3. Protección de intercambios de datos LDAP

De forma predeterminada, el protocolo LDAP se transmite por la red como texto plano; incluyendo las contraseñas (cifradas). Debido a que se pueden obtener las claves cifradas de la red, pueden ser vulnerables a ataques de tipo diccionario. Puede evitarlo aplicando una capa extra de cifrado; el tema de esta sección es cómo activar esta capa.
11.7.3.3.1. Configuración del servidor
El primer paso es crear un par de llaves (compuestas de una llave pública y una llave privada) para el servidor LDAP. Los administradores de Falcot reutilizaron easy-rsa para generarlas (revise la Sección 10.2.1.1, “Infraestructura de llave pública: easy-rsa. Si ejecuta ./build-key-server ldap.falcot.com deberá responder unas pocas preguntas mundanas (ubicación, nombre de la organización, etc.). La respuesta a la pregunta por el «nombre común» («common name») debe ser el nombre de equipo completamente calificado del servidor LDAP; en nuestro caso: ldap.falcot.com.
Este programa crea un certificado en el archivo keys/ldap.falcot.com.crt; la llave privada correspondiente es almacenada en keys/ldap.falcot.com.key.
Ahora debe instalar estas llaves en sus ubicaciones estándar y debemos asegurarnos que el servidor LDAP, que ejecuta bajo la identidad del usuario openldap, pueda leer el archivo privado:
# adduser openldap ssl-cert
Adding user `openldap' to group `ssl-cert' ...
Adding user openldap to group ssl-cert
Done.
# mv keys/ldap.falcot.com.key /etc/ssl/private/ldap.falcot.com.key
# chown root:ssl-cert /etc/ssl/private/ldap.falcot.com.key
# chmod 0640 /etc/ssl/private/ldap.falcot.com.key
# mv newcert.pem /etc/ssl/certs/ldap.falcot.com.pem
También necesita indicarle al demonio slapd que utilice estas llaves para el cifrado. La configuración del servidor LDAP es gestionada de forma dinámica: puede actualizar la configuración con operaciones LDAP normales en la jerarquía de objetos cn=config y el servidor actualizará /etc/ldap/slapd.d en tiempo real para que la configuración sea persistente. Por lo tanto, ldapmodify es la herramienta correcta para actualizar la configuración:

Ejemplo 11.27. Configuración de slapd para cifrado

# cat >ssl.ldif <<END
dn: cn=config
changetype: modify
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key
-
END
# ldapmodify -Y EXTERNAL -H ldapi:/// -f ssl.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "cn=config"
El último paso para activar el cifrado involucra cambiar la variable SLAPD_SERVICES en el archivo /etc/default/slapd. Para esta más seguros desactivaremos LDAP inseguro completamente.

Ejemplo 11.28. El archivo /etc/default/slapd

# Ubicación predeterminada del archivo slapd.conf o el directorio cn=config
# de slapd.d. Si está vacío, utilice el valor predeterminado durante la
# compilación (/etc/ldap/slapd.d con /etc/ldap/slapd.conf como respaldo).
SLAPD_CONF=

# Cuenta del sistema bajo la que se ejecutará el servidor slapd. Si está
# vacío, el servidor ejecutará como root.
SLAPD_USER="openldap"

# Grupo del sistema bajo el que se ejecutará el servidor slapd. Si está
# vacío, el servidor ejecutará en el grupo primario de su usuario.
SLAPD_GROUP="openldap"

# Ruta al archivo de pid del servidor slapd. Si no está definido, el script
# init.d intentará adivinarlo basándose en $SLAPD_CONF
# (/etc/ldap/slapd.conf de forma predeterminada)
SLAPD_PIDFILE=

# slapd normalmente provee sólo ldap en todos los puertos TCP 389. slapd
# también puede atender pedidos en el puerto TCP 636 (ldaps) y a través
# de zócalos unix.
# Ejemplo de uso:
# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
SLAPD_SERVICES="ldaps:/// ldapi:///"

# Si está definida SLAPD_NO_START, el script de inicialización no iniciará
# o reiniciará slapd (podrá detenerlo, sin embargo). Descomente esta línea
# si está iniciando slapd por otros medios o no desea que inicie slapd
# durante el arranque del equipo.
#SLAPD_NO_START=1

# Si SLAPD_SENTINEL_FILE está configurado como la ruta a un archivo y dicho
# archivo exist, el script de inicialización no iniciará o reiniciará slapd
# (podrá detenerlo, sin embargo). Utilícelo para desactivar temporalmente
# el inicio de slapd (por ejemplo, mientras realiza mantenimiento o con un
# sistema de administración de configuraciones) cuando no desee editar
# un archivo de configuración.
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# Para autenticación Kerberos (a través de SASL), slapd utiliza el archivo
# keytab del sistema (/etc/krb5.keytab) de forma predeterminada. Descomente
# esta línea y cambie la ruta si desea utilizar otro archivo keytab.
#export KRB5_KTNAME=/etc/krb5.keytab

# Opciones adicionales para slapd
SLAPD_OPTIONS=""
11.7.3.3.2. Configuración del cliente
En lado cliente, necesita modificar la configuración de los módulos libpam-ldap y libnss-ldap para que utilicen una URI ldaps://.
Los clientes LDAP también necesitan poder autenticar el servidor. En una infraestructura de llave pública X.509, los certificados públicos están firmados con la llave de una autoridad de certificación (CA). Con easy-rsa, los administradores de Falcot crearon su propia CA y ahora necesitan configurar el sistema para confiar en las firmas de la CA de Falcot. Puede lograr esto ubicando el certificado de la CA En /usr/local/share/ca-certificates y ejecutando update-ca-certificates.
# cp keys/ca.crt /usr/local/share/ca-certificates/falcot.crt
# update-ca-certificates
Updating certificates in /etc/ssl/certs... 1 added, 0 removed; done.
Running hooks in /etc/ca-certificates/update.d....
Adding debian:falcot.pem
done.
done.
Por último, puede modificar la URI LDAP predeterminada y el DN base predeterminado utilizado por varias herramientas de línea de órdenes en el archivo /etc/ldap/ldap.conf. Esto le ahorrará bastante tiempo.

Ejemplo 11.29. El archivo /etc/ldap/ldap.conf

#
# Valores predeterminados para LDAP
#

# Revise ldap.conf(5) para más detalles
# Este archivo debe poder ser leído (pero no escrito) por cualquiera.

BASE   dc=falcot,dc=com
URI    ldaps://ldap.falcot.com

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# Certificados TLC (necesarios para GnuTLS)
TLS_CACERT /etc/ssl/certs/ca-certificates.crt