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
You might notice that we extend the PERL5LIB variable. This is due to Debian bug report #982666.
As you might have also noticed, we deliberately ignore migration of the /etc/aliases file, since the standard schema as provided by Debian does not include the structures that this script uses to describe email aliases. Should we want to integrate this data into the directory, the /etc/ldap/schema/misc.schema file should be added to the standard schema.
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

El sistema NSS (“Seleccionador del Servei de Noms” o «Name Service Switch», vegeu la barra lateral ANANT MÉS ENLLÀ NSS i les bases de dades de sistema) és un sistema modular dissenyat per definir o recuperar informació per als directoris del sistema. L'ús de LDAP com a font de dades per a NSS requereix la instal·lació del paquet libnss-ldap. La instal·lació d'aquest paquet fa algunes preguntes; les respostes es resumeixen a Taula 11.2.

Taula 11.2. Configuring the libnss-ldap package:

PreguntaResposta
LDAP server URI (Uniform Resource Identifier)ldapi://ldap.falcot.com
Nom distingit de la base de cercadc=falcot,dc=com
Versió LDAP a utilitzar3
Compte LDAP per a l'usuari «root»cn=admin,dc=falcot,dc=com
Contrasenya del compte de l'usuari «root» d'LDAPla contrasenya administrativa
Permetre que el compte d'administrador LDAP es comporti com a superusuari local?
La base de dades LDAP requereix iniciar una sessió?no
El fitxer /etc/nsswitch.conf a continuació s'ha de modificar, per tal de configurar l'NSS per utilitzar el mòdul ldap recentment instal·lat. Podeu utilitzar l'exemple proporcionat a /usr/share/doc/libnss-ldap/examples/nsswitch.ldap o editar la configuració existent.

Exemple 11.23. El fitxer /etc/nssswitch.conf

#ident $Id: nsswitch.ldap,v 2.4 2003/10/02 02:36:25 lukeh Exp $
#
# 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.
El mòdul LDAP per al PAM és proporcionat pel paquet libpam-ldap. La instal·lació d'aquest paquet fa algunes preguntes molt similars a les de libnss-ldap; alguns paràmetres de configuració (com ara l'URI del servidor LDAP) són fins i tot realment compartits amb el paquet libnss-ldap. Les respostes es resumeixen a Taula 11.3.

Taula 11.3. Configuració de libpam-ldap

PreguntaResposta
Permet que el compte d'administrador LDAP es comporti com a superusuari local?Sí. Això permet utilitzar l'ordre habitual passwd per canviar les contrasenyes desades a la base de dades LDAP.
La base de dades LDAP requereix iniciar sessió?no
LDAP account for root:cn=admin,dc=falcot,dc=com
LDAP administrative password:la contrasenya d'administració de la base de dades LDAP
Local encryption algorithm to use for passwords: crypt
PAM profiles to enable:LDAP Authentication is among the enabled profiles
La instal·lació de libpam-ldap adapta automàticament la configuració predeterminada del PAM definida als fitxers /etc/pam.d/common-auth, /etc/pam.d/common-password i /etc/pam.d/common-account. Aquest mecanisme utilitza l'eina dedicada pam-auth-update (proveïda pel paquet libpam-runtime). L'administrador també pot executar aquesta eina si desitja activar o desactivar mòduls PAM.

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
A la banda del client, la configuració per al mòdul libpam-ldap i libnss-ldap necessita ser modificada per utilitzar un URI ldaps://.
LDAP clients also need to be able to authenticate the server. In an X.509 public key infrastructure, public certificates are signed by the key of a certificate authority (CA). With easy-rsa, the Falcot administrators have created their own CA and they now need to configure the system to trust the signatures of Falcot's CA. This can be done by putting the CA certificate in /usr/local/share/ca-certificates and running 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