Creare un nuova directory in LDAP con la nuova configurazione in /etc/ldap/slapd.d

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