Quando si installa il pacchetto slapd, si configura una directory, generalmente chiamata dc=nodomain. Da quel punto in poi, tutta la modifica alla configurazione può essere fatta con un client LDAP, oppure si può operare direttamente con i file. Vediamo questa seconda via.
La prima cosa da considerare è che una directory LDAP viene memorizzata in una directory del file system tramite vari file che contengono dati e indici. Il sistema più vecchio di memorizzazione è quello chiamato bdb (Oracle Berkeley DB), ma ne esistono anche altri quali hdb (hierarchical Berkeley DB), mdb (Memory-Mapped DB) e sql. Ce ne sono anche altri, ma non sono generici. Scartiamo l’ultimo della lista, sql, poiché si tratta di uno strumento che permette solo di leggere dati, senza poterli modificare. Scartiamo anche il primo e il secondo, bdb e hdb, che sono ormai vetusti e addirittura sconsigliati per l’uso. Ci rimane sostanzialmente mdb.
In Debian, per avere informazioni su mdb dobbiamo usare il comando «man slapd-mdb», difatti tutti i sistemi di memorizzazione indicati sopra sono definiti backend che slapd utilizza per lo strato di persistenza.
Oltre ad un meccanismo per memorizzare i dati, una directory LDAP ha anche un sistema di autorizzazioni: ci sono le credenziali di un utente che fa da supervisore alla directory, ci sono dei controlli per permettere solo ad alcuni di memorizzare certi attributi. Tipicamente, il supervisore può cambiare la password di chiunque, ciascuno può cambiare solo la propria, gli accessi anonimi possono usare la password solo per tentare l’accesso.
Infine c’è la caratteristica principale di una directory: il suo nome. Normalmente un nome è chiamato Base DN ed è composto da uno o più componenti di tipo DC. Ad esempio DC=azienda, DC=com, il che implica che gli oggetti di primo livello nella nostra directory LDAP saranno chiamati con quella estensione, come in OU=utenti, DC=azienda, DC=com, oppure CN=manager, DC=azienda, DC=com, o uid=Francesco Stoppani, DC=azienda, DC=com. (Nella terminologia di LDAP, CN è common name, OU è organizationl unit name, mentre un DC è un domain component, UID è user identification.)
Per configurare una directory LDAP è quindi necessario stabilire quale nome darle, quale modalità di memorizzazione utilizzare, come impostare le autorizzazioni, quali credenziali usare per il supervisore. Nel nostro caso, decidiamo di voler definire una directory LDAP chiamata DC=azienda, DC=com, di avere un supervisore chiamato CN=manager e password «slpnss» (come password uso le consonanti del titolo del sonetto Solo e pensoso di Petrarca), per la persistenza uso Memory-Mapped DB e memorizzo tutto in /var/lib/ldap-azienda.com.
Per prima cosa va creata la directory nella quale memorizzare il tutto, /var/lib/ldap-azienda.com, e assegnare i diritti corretti in modo che sia di proprietà dell’utenza che esegue il server LDAP, normalmente openldap. Possiamo verificare quale sia questa utenza nel file di configurazione di slapd, con il comando «grep ^SLAPD_USER= /etc/default/slapd».
# mkdir /var/lib/ldap-azienda.com # chown openldap:openldap /var/lib/ldap-azienda.com
Poi ci spostiamo nella directory della configurazione di slapd, /etc/ldap/slapd.d/cn=config, e definiamo un file per la configurazione della persistenza. In questa directory i file vanno tutti numerati a seconda del tipo, che nel nostro caso è olcBackend, quindi vediamo quali altri file ci sono già con nomi simili:
# cd /etc/ldap/slapd.d/cn=config # ls -l olcBackend* -rw------- 1 openldap openldap 414 ott 9 16:47 olcBackend={0}mdb.ldif
Di norma questo file c’è già, poiché viene generato all’istallazione di slapd. In caso negativo andrebbe creato così:
dn: olcBackend={0}mdb objectClass: olcBackendConfig olcBackend: {0}mdb structuralObjectClass: olcBackendConfig
Nota importante: tutti i nomi dei file in questa directory devono avere estensione «ldif».
Nel caso che ci sia già un file backend che usa il numero sequenziale 0 e che non definisce mdb, si dovrebbe usare il numero 1 sia per nominare questo file che nelle righe che iniziano con dn e con olcBackend. Il nuovo file sarebbe chiamato olcBackend={1}mdb.ldif e conterrebbe:
dn: olcBackend={1}mdb objectClass: olcBackendConfig olcBackend: {1}mdb structuralObjectClass: olcBackendConfig
Poi va definita la directory vera e propria, in un file di tipo olcDatabase. Vediamo quali già ci sono:
# ls -l olcDa* -rw------- 1 openldap openldap 543 ott 9 16:47 olcDatabase={0}config.ldif -rw------- 1 openldap openldap 657 ott 9 16:47 olcDatabase={-1}frontend.ldif -rw------- 1 openldap openldap 1326 ott 9 17:24 olcDatabase={1}mdb.ldif
e creiamo quello che si chiama con il numero 2, olcDatabase={2}mdb.ldif, e che conterrà:
# BDB definition for example.com dn: olcDatabase={2}mdb objectClass: olcDatabaseConfig objectClass: olcMdbConfig olcDatabase: {2}mdb olcSuffix: dc=azienda,dc=com olcDbDirectory: /var/lib/ldap-azienda.com olcRootDN: cn=manager,dc=azienda,dc=com olcRootPW: e1NTSEF9OXJZdDVyTy9uaU5PN2FvUkhxUEVCZkVIVWFwM3ViSng= olcDbIndex: objectClass eq olcDbIndex: uidNumber,gidNumber eq olcDbIndex: loginShell eq olcDbIndex: uid,cn eq,sub olcDbIndex: memberUid eq,sub olcDbIndex: member,uniqueMember eq olcDbIndex: sambaSID eq olcDbIndex: sambaPrimaryGroupSID eq olcDbIndex: sambaGroupType eq olcDbIndex: sambaSIDList eq olcDbIndex: sambaDomainName eq olcDbIndex: default sub,eqolcAccess: to attrs=userPassword by self write by anonymous auth by dn.base="cn=manager,dc=azienda,dc=com" write by * none olcAccess: to * by self write by dn.base="cn=manager,dc=azienda,dc=com" write by * read
Nota: la parola dopo il numero tra parentesi graffe, nel nome del file, non è un nome qualsiasi, ma deve essere il tipo di backend scelto per la persistenza.
Nota: la password è una codifica base64 di una cifratura SSHA. Per ottenere la password cifrata si deve convertirla secondo SSHA e memorizzare sia il salt che il valore cifrato in una sola stringa, come mostrato qui.
Una volta terminato con queste modifiche, è sufficiente riavviare il server LDAP perché siano attive. Il comando per riavviare è:
# systemctl restart slapd.service
che non dovrebbe dare nessun output, vale a dire che tutto è andato bene. Se invece c’è qualche errore nella configurazione, oppure nei diritti sul file system, ci sarà un errore criptico. Per capire esattamente cosa sia successo è possibile avviare slapd con l’opzione di debug e un parametro che indica il lvello di informazione richiesta, ad esempio
/usr/sbin/slapd -d 3