Product SiteDocumentation Site

11.7. Directory LDAP

OpenLDAP è un'implementazione del protocollo LDAP: in altre parole si tratta di un database progettato con lo speciale proposito di conservare directory. Il caso d'uso più comune riguarda l'impiego di un server LDAP per centralizzare la gestione degli account utente ed i relativi permessi. Un database LDAP è inoltre facilmente replicato cosa che permette di impostare server LDAP multipli e sincronizzati. Quando la rete e la base utenti crescono velocemente il carico può essere bilanciato tra i vari server.
I dati di LDAP sono strutturati e gerarchici. La struttura è definita attraverso «schemi» che descrivono il tipo di oggetti che il database può contenere, con una lista di tutti i loro possibili attributi. La sintassi usata per riferirsi ad un particolare oggetto nel database è basata su questa struttura, cosa che spiega la sua complessità.

11.7.1. Installazione

Il pacchetto slapd contiene il server OpenLDAP. Il pacchetto ldap-utils include strumenti a riga di comando per interagire con i server LDAP.
Installare slapd necessita normalmente di rispondere a qualche domanda debconf. Questa fase della configurazione può essere forzata con il comando dpkg-reconfigure slapd.
  • Omettere la configurazione del server OpenLDAP? No, naturalmente vogliamo configurare questo servizio.
  • Nome di dominio DNS: “falcot.com”.
  • Nome dell'organizzazione: “Falcot Corp”.
  • Dev'essere inserita una password amministrativa.
  • Database di backend da usare: «HDB».
  • Eliminare il database in caso di rimozione completa di slapd? No. Non ha senso rischiare di perdere il database in caso di uno sbaglio.
  • Spostare il vecchio database? Questa domanda è posta solamente quando viene tentata un configurazione ed un database è già presente. Rispondere «sì» se si desidera ricominciare da un database pulito, per esempio se si esegue dpkg-reconfigure slapd subito dopo la prima installazione.
  • Abilitare il protocollo LDAPv2? No, non c'è motivo. Tutti gli strumenti che vogliamo utilizzare utilizzano il protocollo LDAPv3.
Un database minimale è attualmente configurato, come dimostra la seguente richiesta:
$ 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 richiesta restituisce due oggetti: l'organizzazione stessa e l'utente amministrativo.

11.7.2. Riempire la directory

Dato che un database vuoto non è particolarmente utile ci apprestiamo ad inserire al suo interno tutte le directory esistenti: inclusi i database utenti, gruppi, servizi ed host.
Il pacchetto migrationtools fornisce un insieme di script dedicati ad estrarre i dati dalle directory standard di Unix (/etc/passwd, /etc/group, /etc/services, /etc/hosts e così via), convertire questi dati ed inserirli all'interno del database LDAP.
Dopo aver installato il pacchetto il file /etc/migrationtools/migrate_common.ph dev'essere modificato. Le opzioni IGNORE_UID_BELOW e IGNORE_GID_BELOW devono essere abilitate (è sufficiente de-commentarle).
La reale operazione di migrazione è gestita dal comando migrate_all_online.sh come segue:
# cd /usr/share/migrationtools
# LDAPADD="/usr/bin/ldapadd -c" ETC_ALIASES=/dev/null ./migrate_all_online.sh
migrate_all_online.sh rivolge alcune domande a proposito del database LDAP nel quale si vogliono migrare i dati. Tabella 11.1 riassume le risposte fornite nel caso d'uso della Falcot.

Tabella 11.1. Le risposte fornite alle domande poste dallo script migrate_all_online.sh

Domanda Risposta
X.500 naming context dc=falcot,dc=com
Nome host del server LDAP localhost
Manager DN cn=admin,dc=falcot,dc=com
Bind credentials la password amministrativa
Create DUAConfigProfile no

Abbiamo deliberatamente ignorato la migrazione del file /etc/aliases dato che lo schema standard fornito da Debian non include le strutture che utilizza questo script per gli alias email. Se dovessimo integrare questi dati nella directory il file /etc/ldap/schema/misc.schema dovrebbe essere aggiunto allo schema standard.
Notare altresì l'uso dell'opzione -c con il comando ldapadd: questa opzione richiede che l'elaborazione non si interrompa in caso di errori. Utilizzare questa opzione è necessario poiché convertire il database /etc/services genera spesso qualche errore che può essere ignorato senza conseguenze.

11.7.3. Gestire gli account con LDAP

Ora il database LDAP contiene diverse informazioni utili ed è giunto il momento di sfruttarle. Questa sezione si concentra su come configurare un sistema Linux per far sì che le varie directory di sistema utilizzino il database LDAP.

11.7.3.1. Configurare NSS

Il sistema NSS (Name Service Switch, si veda il riquadro APPROFONDIMENTI NSS ed i database di sistema) è un sistema modulare progettato per definire o recuperare informazioni sulle directory di sistema. Utilizzare LDAP come sorgente di dati per NSS richiede l'installazione del pacchetto libnss-ldap. La sua installazione pone alcune domande: le risposte sono riassunte in Tabella 11.2.

Tabella 11.2. Configurare il pacchetto libnss-ldap

Domanda Risposta
L'Uniform Resource Identifier del server LDAP ldap://ldap.falcot.com
Il nome distintivo per la base di ricerca dc=falcot,dc=com
La versione di LDAP da utilizzare 3
Il database LDAP deve richiedere il login? no 
L'account LDAP per root cn=admin,dc=falcot,dc=com
La password per l'account root di LDAP la password amministrativa

Il file /etc/nsswitch.conf richiede poi di essere modificato per configurare NSS in modo che utilizzi il modulo ldap appena installato.

Esempio 11.31. Il file /etc/nsswitch.conf

# /etc/nsswitch.conf
#
# Esempio di configurazione della funzionalità GNU Name Service Switch.
# Se sono (stati) installati i pacchetti `glibc-doc' ed `info' provare:
# `info libc "Name Service Switch"' per informazioni riguardo questo file.

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: files

Il modulo ldap è generalmente inserito prima degli altri e sarà conseguentemente richiamato per primo. L'unica eccezione degna di nota è il servizio hosts dato che contattare il server LDAP richiede di contattare per prima cosa il DNS (per risolvere ldap.falcot.com). Senza questa eccezione la richiesta DNS cercherebbe di contattare il server LDAP ma questo causerebbe un tentativo di risoluzione del nome per il server LDAP e così via in un ciclo infinito. Per ciò che riguarda i servizi netgroup, essi non sono ancora gestiti dal modulo LDAP.
Se il server LDAP dev'essere considerato autoritativo (e i file locali utilizzati dal modulo files ignorati) i servizi possono essere configurati con la seguente sintassi:
servizio: ldap [NOTFOUND=return] files.
Se l'entità richiesta non esiste nel database LDAP, la richiesta restituirà una risposta «non esistente» anche se la risorsa esiste in uno dei file locali: questi file locali saranno utilizzati unicamente quando il servizio LDAP non è raggiungibile.

11.7.3.2. Configurare PAM

Questa sezione descrive una configurazione di PAM (si veda il riquadro DIETRO LE QUINTE /etc/environment e /etc/default/locale) che consentirà alle applicazioni di eseguire le autenticazioni richieste attraverso il database LDAP.
Il modulo LDAP per PAM è fornito dal pacchetto libpam-ldap. L'installazione di questo pacchetto pone alcune domande molto simili a quelle viste con libnss-ldap: alcuni parametri di configurazione (come l'URI del server LDAP) sono in realtà persino condivisi con il pacchetto libnss-ldap. Le risposte sono riassunte in Tabella 11.3.

Tabella 11.3. Configurazione di libpam-ldap

Domanda Risposta
Permettere all'account amministrativo LDAP di agire come root? Sì. Questo ci consente di utilizzare il comando passwd per cambiare le password conservate nel database LDAP.
Il database LDAP richiede il login? no 
L'account LDAP per root cn=admin,dc=falcot,dc=com
La password per l'account root di LDAP La password amministrativa del database LDAP

L'installazione di libpam-ldap adatta automaticamente la configurazione predefinita di PAM contenuta nei file /etc/pam.d/common-auth, /etc/pam.d/common-password e /etc/pam.d/common-account. Questo meccanismo utilizza lo strumento dedicato pam-auth-update (fornito con il pacchetto libpam-runtime). Questo strumento può anche essere eseguito dall'amministratore qualora desideri abilitare o disabilitare dei moduli PAM.

11.7.3.3. Mettere al sicuro lo scambio dati di LDAP

In via predefinita il protocollo LDAP transita sulla rete come testo in chiaro: questo include le password (cifrate). Poiché le password cifrate possono essere estratte dalla rete rimangono vulnerabili ad attacchi a dizionario. Questo può essere evitato utilizzando uno strato di cifratura addizionale: abilitare questo strato è l'argomento di questa sezione.
11.7.3.3.1. Configurare il server
Il primo passo richiede la creazione di una coppia di chiavi (comprensiva di chiave pubblica e chiave privata) per il server LDAP. Questo richiede l'installazione del pacchetto openssl. L'esecuzione di /usr/lib/ssl/misc/CA.pl -newcert pone alcune domande banali (luogo, nome dell'organizzazione e così via). La risposta alla domanda "common name" deve essere il nome di dominio pienamente qualificato del server LDAP: nel nostro caso ldap.falcot.com.
Questo comando crea un certificato nel file newcert.pem: la corrispondente chiave privata è conservata nel file newkey.pem.
Ora queste chiavi devono essere installate nella posizione standard:
# mv newkey.pem /etc/ssl/private/ldap-key.pem
# chmod 0600 /etc/ssl/private/ldap-key.pem
# mv newcert.pem /etc/ssl/certs/ldap-cert.pem
Il demone slapd dev'essere avvertito di utilizzare queste chiavi di cifratura. Ciò richiede l'aggiunta delle seguenti direttive al file /etc/ldap/slapd.conf:

Esempio 11.32. Configurare slapd per la cifratura

# TLS support
TLSCipherSuite HIGH
TLSCertificateFile /etc/ssl/certs/ldap-cert.pem
TLSCertificateKeyFile /etc/ssl/private/ldap-key.pem

L'ultimo passo per abilitare la cifratura richiede la modifica della variabile SLAPD_SERVICES nel file /etc/default/slapd. Inoltre, per essere prudenti, si renderà necessario disabilitare l'LDAP non sicuro.

Esempio 11.33. Il file /etc/default/slapd

# Posizione predefinita per il file slapd.conf
SLAPD_CONF=

# Account di sistema con cui eseguire il server slapd. Se vuoto
# il server sarà eseguito con root.
SLAPD_USER=

# Gruppo di sistema con cui eseguire il server slapd. Se vuoto
# il server sarà eseguito nel gruppo primario del suo utente.
SLAPD_GROUP=

# Percorso al file pid del server slapd. Se non impostato
# lo script init.d proverà ad individuarlo tramite $SLAPD_CONF
# (/etc/ldap/slapd.conf)
SLAPD_PIDFILE=

# Configura se il demone slurpd dev'essere eseguito.
# Valori possibili:
# - yes:   Avviare sempre slurpd
# - no:    Mai avviare slurpd
# - auto:  Avviare slurpd se un'opzione replicata viene trovata
#            in slapd.conf (valore predefinito)
SLURPD_START=auto

# slapd serve normalmente ldap solo su tutte le porte TCP 389.
# slapd può anche servire richieste sulla porta TCP 636 (ldaps)
# e richieste via socket unix.
# Esempio d'uso:
SLAPD_SERVICES="ldaps:/// ldapi:///"

# Opzioni addizionali da passare a slapd e slurpd
SLAPD_OPTIONS=""
SLURPD_OPTIONS=""

11.7.3.3.2. Configurare il client
Sul client la configurazione per i moduli libpam-ldap e libnss-ldap dev'essere modificata aggiungendo la direttiva ssl on ai file di configurazione /etc/pam_ldap.conf e /etc/libnss-ldap.conf.
I client LDAP devono inoltre essere in grado di autenticare il server conoscendo la sua chiave pubblica. Questo richiede l'installazione di una copia della chiave (per esempio in /etc/ssl/certs/ldap-cert.pem) e l'indicazione della posizione della copia nel file /etc/ldap/ldap.conf.

Esempio 11.34. Il file /etc/ldap/ldap.conf

#
# LDAP Defaults
#

# Si veda ldap.conf(5) per dettagli
# Questo file dovrebbe essere leggibile da tutti ma non scrivibile da tutti.

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

#SIZELIMIT      12
#TIMELIMIT      15
#DEREF          never

TLS_CACERT /etc/ssl/certs/ldap-cert.pem

Questo capitolo ha unicamente dato dimostrazione di una piccola parte dei software disponibili per i sistemi server: tuttavia molti dei servizi di rete comuni sono stati descritti. Ora è tempo di passare ad un capitolo ancora più tecnico: scenderemo ancor più in profondità su alcuni concetti, descrivendo implementazioni massive e virtualizzazione.