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 solo la contraseña del administrador, y es poco probable que la base de datos resultante se ajuste a sus necesidades. 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.
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 subtree
# 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: 2
# numEntries: 1
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
# PERL5LIB="${PERL5LIB}:/etc/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
Posiblemente notes que ampliamos la variable PERL5LIB. Esto se debe al informe de error de Debian #982666.
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, se 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», ver 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.
El archivo /etc/nsswitch.conf luego debe modificarse, así configurar NSS para que use el recién instalado módulo ldap .

Ejemplo 11.23. El archivo /etc/nsswitch.conf

# /etc/nsswitch.conf
#
# Un archivo de ejemplo que podría copiarse en /etc/nsswitch.conf; 
# usa LDAP junto con archivos.
#
# "hosts:" y "services:" in this file are used only if the
# el archivo /etc/netconfig tiene un "-" para nametoaddr_libs de transportes "inet".

# las siguientes líneas obvian la entrada " + " en /etc/passwd and /etc/group.
passwd:         files ldap
shadow:         files ldap
group:          files ldap

# consulte primero el DNS, lo necesitaremos para resolver el host LDAP. (Si nosotros
# no podemos resolverlo, estamos en recursión infinita, porque libldap llama
#a gethostbyname(). ¡Cuidado!)
hosts:          dns ldap

# LDAP tiene autoridad nominal para los siguientes maps
services:   ldap [NOTFOUND=return] files
networks:   ldap [NOTFOUND=return] files
protocols:  ldap [NOTFOUND=return] files
rpc:        ldap [NOTFOUND=return] files
ethers:     ldap [NOTFOUND=return] files

# aún no hay soporte para netmasks, bootparams, publickey.
netmasks:   files
bootparams: files
publickey:  files
automount:  files

#Estoy bastante seguro de que a nsswitch.conf le consulta directamente por sendmail,
# aquí, así que no podemos hacer mucho aquí. En su lugar, usar las reglas
# LDAP de bbense ofr sendmail.
aliases:    files
sendmailvars:   files

# Nota: no hay soporte para grupos de red en Solaris (yet)
netgroup:   ldap [NOTFOUND=return] 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 ENTRE 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.
La instalación de libpam-ldapd adapta automáticamente la configuración PAM predeterminada definida en /etc/pam.d/common-auth, /etc/pam.d/contraseña común y /etc/pam.d/common-account archivos. Este mecanismo utiliza la herramienta pam-auth-update dedicada (proporcionada por el paquetelibpam-runtime). Esta herramienta también la puede ejecutar el administrador en caso de que desee habilitar o deshabilitar los 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.2, “Infraestructura de llave pública: easy-rsa. Si ejecuta ./easyrsa build-server-full ldap.falcot.com nopass, le preguntará sobre el «common name» (nombre común). La respuesta a esa pregunta 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 pki/issued/ldap.falcot.com.crt; la llave privada correspondiente es almacenada en pki/private/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 pki/private/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 pki/issued/ldap.falcot.com.crt /etc/ssl/certs/ldap.falcot.com.pem
# chown root.root /etc/ssl/certs/ldap.falcot.com.pem
# chmod 0644 /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.24. Configuración de slapd para cifrado

# cat >ssl.ldif <<END
dn: cn=config
changetype: modify
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap.falcot.com.key
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
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"
# systemctl restart slapd.service
# ldapsearch -Y EXTERNAL -H ldapi:/// -b cn=config -s base | grep TLS
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
olcTLSCertificateFile: /etc/ssl/certs/ldap.falcot.com.pem
olcTLSCertificateKeyFile: /etc/ssl/certs/ldap.falcot.com.key
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.25. El archivo /etc/default/slapd

# Ubicación predeterminada del archivo slapd.conf o slapd.d cn=config directory. If
# vacío, use el compilado predeterminado (/etc/ldap/slapd.d con una alternativa a
# /etc/ldap/slapd.conf).
SLAPD_CONF=

# Cuenta del sistema para ejecutar el servidor slapd. Si vacía el servidor
# se ejecutará como root . 
SLAPD_USER= "openldap"

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

# Ruta al archivo pid del servidor slapd. Si no, configure el script init.d
# intentará averiguarlo desde $SLAPD_CONF (/etc/ldap/slapd.d por
# predeterminado ) 
SLAPD_PIDFILE=

# slapd normalmente sirve ldap solo en todos los puertos TCP 389. slapd también puede
# servir solicitudes en el puerto TCP 636 (ldaps) y solicitudes a través de conexiones
# unix . 
# Ejemplo de uso:
# SLAPD_SERVICES= "ldap://127.0.0.1: 389 / ldaps: ///ldapi:///"
SLAPD_SERVICES= " ldaps: /// ldapi:///"

# Si se establece SLAPD_NO_START, el script de inicio no se iniciará ni reiniciará
# slapd (pero stop seguirá funcionando).  Descomente esto si es así
# iniciando slapd por otros medios o si no quieres slapd normalmente
# comenzó en el arranque . 
# SLAPD_NO_START=1

# Si SLAPD_SENTINEL_FILE se establece en ruta a un archivo y ese archivo existe,
# el script de inicio no se iniciará ni reiniciará slapd (pero stop seguirá
# funcionando).  Úselo para deshabilitar temporalmente el inicio de slapd (cuando haga
# mantenimiento, por ejemplo, o a través de un sistema de gestión de la configuración)
# cuando no desea editar un archivo de configuración.
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# Para la autenticación Kerberos (a través de SASL), slapd por defecto usa el sistema
# archivo keytab (/etc/krb5.keytab).  Para usar un archivo de tabla de claves diferente,
# descomente esta línea y cambie la ruta.
# exportar KRB5_KTNAME=/etc / krb5.tabla de claves

# Opciones adicionales para pasar a slapd
SLAPD_OPTIONS=""
11.7.3.3.2. Configuración del cliente
On the client side, the configuration for the libpam-ldapd and libnss-ldapd modules needs to be modified to use an ldaps:// URI.
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 pki/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.26. El archivo /etc/ldap/ldap.conf

#
# Predeterminados para LDAP
#

# Revise ldap.conf(5) para más detalles
# Este archivo ha de ser legible, pero no escrito por cualquiera.

#BASE   dc=example,dc=com
#URI    ldap://ldap.example.com ldap://ldap-provider.example.com:666

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

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