Product SiteDocumentation Site

11.7. Directori LDAP

OpenLDAP és una implementació del protocol LDAP; en altres paraules, és una base de dades de propòsit especial dissenyada per emmagatzemar directoris. En el cas d'ús més comú, l'ús d'un servidor LDAP permet centralitzar la gestió dels comptes d'usuari i els permisos relacionats. A més, una base de dades LDAP és fàcilment replicable, fet que permet establir múltiples servidors LDAP sincronitzats. Quan la xarxa i la base d'usuaris creixen ràpidament, la càrrega es pot equilibrar a través de diversos servidors.
Les dades LDAP estan estructurades i jerarquitzades. L'estructura està definida per “esquemes” que descriuen el tipus d'objectes que la base de dades pot emmagatzemar, amb una llista de tots els seus possibles atributs. La sintaxi utilitzada per referir-se a un objecte particular en la base de dades es basa en aquesta estructura, que explica la seva complexitat.

11.7.1. Instal·lació

El paquet slapd conté el servidor OpenLDAP. El paquet ldap-utils inclou eines de línia d'ordres per interaccionar amb servidors LDAP.
La instal·lació d'slapd sol demanar només la contrasenya de l'administrador i la base de dades resultant és improbable que s'adapti a les necessitats. Afortunadament, un senzill dpkg-reconfigure slapd us permetrà reconfigurar la base de dades LDAP amb més detall:
  • Ometre la configuració del servidor OpenLDAP? No, per descomptat, es vol configurar aquest servei.
  • Nom de domini DNS: “falcot.com”.
  • Nom de l'organizació: “Falcot Corp”.
  • Cal introduir una contrasenya administrativa.
  • Base de dades a usar: “MDB”.
  • Voleu que la base de dades s'elimini quan es purgui slapd? No. No té sentit arriscar-se a perdre la base de dades en cas d'un error.
  • Voleu moure la base de dades antiga? Aquesta pregunta només es fa quan s'intenta la configuració al temps que ja existeix una base de dades. Només responeu “sí” si de fet voleu tornar a començar des d'una base de dades neta, per exemple si executeu dpkg-reconfigure slapd just després de la instal·lació inicial.
Ara es disposa d'una base de dades mínima configurada, com ho demostra la següent 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 retorna dos objectes: l'organització en si i l'usuari administratiu.

11.7.2. Emplenar el directori

Atès que una base de dades buida no és especialment útil, li injectarem tots els directoris existents; això inclou les bases de dades d'usuaris, grups, serveis i servidors.
El paquet migrationtools proporciona un conjunt d'scripts dedicats a l'extracció de dades dels directoris estàndard d'Unix (/etc/passwd,/etc/group,/etc/services,/etc/hosts i així successivament), converteix aquestes dades i les injecta a la base de dades LDAP.
Una vegada instal·lat el paquet, s'ha d'editar el fitxer /etc/migrationtools/migrate_common.ph; les opcions IGNORE_UID_BELOW i IGNORE_GID_BELOW han d'estar habilitades (el fet de descomentar-les és suficient), i DEFAULT_MAIL_DOMAIN/DEFAULT_BASE ha de ser actualitzat.
L'operació de migració real és gestionada per l'ordre migrate_all_online.sh de la següent manera:
# 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 fa algunes preguntes sobre la base de dades LDAP a la qual s'han de migrar les dades. Taula 11.1 resumeix les respostes donades en el cas d'ús de Falcot.

Taula 11.1. Respostes a les preguntes plantejades per l'script migrate_all_online.sh

PreguntaResposta
Context de noms X.500dc=falcot,dc=com
Nom del servidor LDAPlocalhost
Administrador del DNcn=admin,dc=falcot,dc=com
Credencials de vinculacióla contrasenya administrativa
Crear DUAConfigProfileno
Us deveu haver adonat que s'amplia la variable PERL5LIB. Això és degut a l'informe d'error Debian #982666.
Potser també us heu fixat que ignorem deliberadament la migració del fitxer /etc/aliases, ja que l'esquema estàndard proporcionat per Debian no inclou les estructures que aquest script utilitza per descriure àlies de correu electrònic. Si volem integrar aquestes dades al directori, el fitxer /etc/ldap/schema/misc.schema s'hauria d'afegir a l'esquema estàndard.
Adoneu-vos-en també de l'ús de l'opció -c a l'ordre ldapadd; aquesta opció demana que el processament no s'aturi en cas d'error. Usar aquesta opció és necessari perquè la conversió dels /etc/services sovint genera alguns errors que es poden ignorar sense problemes.

11.7.3. Gestió de comptes amb LDAP

Ara que la base de dades LDAP conté informació útil, ha arribat el moment d'utilitzar aquestes dades. Aquesta secció se centra en com configurar un sistema Linux de manera que els diversos directoris del sistema utilitzin la base de dades LDAP.

11.7.3.1. Configuració del NSS

The NSS system (Name Service Switch, see sidebar ANANT MÉS ENLLÀ NSS i les bases de dades de sistema) is a modular system designed to define or fetch information for system directories. Using LDAP as a source of data for NSS requires installing the libnss-ldapd package.
The /etc/nsswitch.conf file then needs to be modified, so as to configure NSS to use the freshly-installed ldap module.

Exemple 11.23. El fitxer /etc/nssswitch.conf

# /etc/nsswitch.conf
#
# An example file that could be copied over to /etc/nsswitch.conf; it
# uses LDAP conjunction with files.
#
# "hosts:" and "services:" in this file are used only if the
# /etc/netconfig file has a "-" for nametoaddr_libs of "inet" transports.

# the following lines obviate the "+" entry in /etc/passwd and /etc/group.
passwd:         files ldap
shadow:         files ldap
group:          files ldap

# consult DNS first, we will need it to resolve the LDAP host. (If we
# can't resolve it, we're in infinite recursion, because libldap calls
# gethostbyname(). Careful!)
hosts:          dns ldap

# LDAP is nominally authoritative for the following 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

# no support for netmasks, bootparams, publickey yet.
netmasks:   files
bootparams: files
publickey:  files
automount:  files

# I'm pretty sure nsswitch.conf is consulted directly by sendmail,
# here, so we can't do much here. Instead, use bbense's LDAP
# rules ofr sendmail.
aliases:    files
sendmailvars:   files

# Note: there is no support for netgroups on Solaris (yet)
netgroup:   ldap [NOTFOUND=return] files
El mòdul ldap s'insereix normalment abans que d'altres, i per tant es consultarà primer. La notable excepció és el servei hosts ja que el contacte amb el servidor LDAP requereix consultar abans el DNS (per resoldre ldap.falcot.com). Sense aquesta excepció, una consulta del nom d'un servidor intentaria preguntar al servidor LDAP; això desencadenaria una resolució de nom per al servidor LDAP, i així successivament en un bucle infinit.
Si el servidor LDAP s'ha de considerar autoritatiu (i els fitxers locals utilitzats pel mòdul files siguin ignorats), els serveis es poden configurar amb la següent sintaxi:
servei: ldap [NOTFOUND=return] files.
Si l'entrada sol·licitada no existeix a la base de dades LDAP, la consulta retornarà una resposta «no existent» encara que el recurs existeixi en un dels fitxers locals; aquests fitxers locals només s'utilitzaran quan el servei LDAP estigui caigut.

11.7.3.2. Configuració del PAM

Aquesta secció descriu una configuració del PAM (vegeu la barra lateral ENTRE BASTIDORS/etc/environment i /etc/default/locale) que permetrà a les aplicacions realitzar les autenticacions necessàries contra la base de dades LDAP.
The LDAP module for PAM is provided by the libpam-ldapd package. Installing this package asks a few questions very similar to those in libnss-ldapd; some configuration parameters (such as the URI for the LDAP server) are even actually shared with the libnss-ldapd package.
Installing libpam-ldapd automatically adapts the default PAM configuration defined in the /etc/pam.d/common-auth, /etc/pam.d/common-password and /etc/pam.d/common-account files. This mechanism uses the dedicated pam-auth-update tool (provided by the libpam-runtime package). This tool can also be run by the administrator should they wish to enable or disable PAM modules.

11.7.3.3. Protegir els intercanvis de dades LDAP

Per defecte, el protocol LDAP es transmet per la xarxa com a text clar; això inclou les contrasenyes (encriptades). Com que les contrasenyes encriptades es poden extreure de la xarxa, poden ser vulnerables als atacs de tipus diccionari. Això es pot evitar utilitzant una capa de xifratge addicional; habilitar aquesta capa és el tema d'aquesta secció.
11.7.3.3.1. Configuració del servidor
El primer pas és crear un parell de claus (que comprèn una clau pública i una clau privada) per al servidor LDAP. Els administradors de Falcot tornen a usar easy-rsa per generar-la (vegeu Secció 10.2.2, «Infraestructura de clau pública: easy-rsa»). Executant ./easyrsa build-server-full ldap.falcot.com nopass us preguntarà el “nom comú” o «common name» en anglès. La resposta a aquesta pregunta ha de ser el nom d'amfitrió completament qualificat del servidor LDAP; en el nostre cas, ldap.falcot.com.
Aquesta ordre crea un certificat al fitxer pki/issued/ldap.falcot.com.crt; la corresponent clau privada s'emmagatzema a pki/private/ldap.falcot.com.key.
Ara aquestes claus s'han d'instal·lar en la seva ubicació estàndard, i hem d'assegurar-nos que el fitxer privat sigui llegible pel servidor LDAP que s'executa sota la identitat d'usuari openldap:
# 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
Al dimoni slapd també se li ha de dir que utilitzi aquestes claus per a l'encriptació. La configuració del servidor LDAP es gestiona dinàmicament: la configuració es pot actualitzar amb operacions LDAP normals en la jerarquia d'objectes cn=config, i el servidor actualitza /etc/ldap/slapd.d en temps real per fer que la configuració sigui persistent. ldapmodify és per tant l'eina correcta per actualitzar la configuració:

Exemple 11.24. Configuració d'slapd per al xifratge

# 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
L'últim pas per habilitar el xifrat implica canviar la variable SLAPD_SERVICES del fitxer /etc/default/slapd. No ens la jugarem i inhabilitarem completament l'LDAP no segur.

Exemple 11.25. El fitxer /etc/default/slapd

# Default location of the slapd.conf file or slapd.d cn=config directory. If
# empty, use the compiled-in default (/etc/ldap/slapd.d with a fallback to
# /etc/ldap/slapd.conf).
SLAPD_CONF=

# System account to run the slapd server under. If empty the server
# will run as root.
SLAPD_USER="openldap"

# System group to run the slapd server under. If empty the server will
# run in the primary group of its user.
SLAPD_GROUP="openldap"

# Path to the pid file of the slapd server. If not set the init.d script
# will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.d by
# default)
SLAPD_PIDFILE=

# slapd normally serves ldap only on all TCP-ports 389. slapd can also
# service requests on TCP-port 636 (ldaps) and requests via unix
# sockets.
# Example usage:
# SLAPD_SERVICES="ldap://127.0.0.1:389/ ldaps:/// ldapi:///"
SLAPD_SERVICES="ldaps:/// ldapi:///"

# If SLAPD_NO_START is set, the init script will not start or restart
# slapd (but stop will still work).  Uncomment this if you are
# starting slapd via some other means or if you don't want slapd normally
# started at boot.
#SLAPD_NO_START=1

# If SLAPD_SENTINEL_FILE is set to path to a file and that file exists,
# the init script will not start or restart slapd (but stop will still
# work).  Use this for temporarily disabling startup of slapd (when doing
# maintenance, for example, or through a configuration management system)
# when you don't want to edit a configuration file.
SLAPD_SENTINEL_FILE=/etc/ldap/noslapd

# For Kerberos authentication (via SASL), slapd by default uses the system
# keytab file (/etc/krb5.keytab).  To use a different keytab file,
# uncomment this line and change the path.
#export KRB5_KTNAME=/etc/krb5.keytab

# Additional options to pass to slapd
SLAPD_OPTIONS=""
11.7.3.3.2. Configuració del client
On the client side, the configuration for the libpam-ldapd and libnss-ldapd modules needs to be modified to use an ldaps:// URI.
Els clients LDAP també han de ser capaços d'autenticar el servidor. En una infraestructura de clau pública X.509, els certificats públics estan signats per la clau d'una autoritat de certificació (CA). Amb easy-rsa, els administradors de Falcot han creat la seva pròpia CA i ara han de configurar el sistema per confiar en les signatures de la CA de Falcot. Això es pot fer posant el certificat de CA a /usr/local/share/ca-certificates i executant 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.
Finalment però no menys important, l'URI LDAP per defecte i la base DN utilitzada per les diverses eines de la línia d'ordres es poden modificar a /etc/ldap/ldap.conf. Això estalviarà teclejar una mica.

Exemple 11.26. El fitxer /etc/ldap/ldap.conf

#
# LDAP Defaults
#

# See ldap.conf(5) for details
# This file should be world readable but not world writable.

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

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

# TLS certificates (needed for GnuTLS)
TLS_CACERT      /etc/ssl/certs/ca-certificates.crt