Backup del database
Vediamo come effettuare il backup del nostro database
Introduzione
Una volta popolato il nostro database sarà anche opportuno effettuarne il backup, o più precisamente effettuarne un dump brutale, perchè come potremo vedere non sarà gestita nativamente un differenziale delle modifiche, ma soltanto il travaso del nostro database in un file ldif, con la "sola" possibilità di filtrare in vari modi l'output in uscita.
Per fare questo utilizzeremo il comando slapcat; un aspetto di questo comando è che a differenza del suo cugino slapadd, è possibile lanciarlo a "caldo" senza prima dover obbligatoriamente effettuare lo stop del demone slapd.
Dump globale
Il comando slapcat, come tutti i comandi della serie slap* agisce direttamente sui file di configurazione e sui file contenenti il database vero e proprio, necessitando così dell'accesso ai file e alle directory di configurazione del database stesso, che nel nostro caso corrisponderà a /usr/local/var/openldap-data.
Vediamo come effettuare un dump dell'intero database:
$ sudo slapcat
dove sullo standard output restituirà il seguente listato:
dn: dc=example,dc=com description: Example com Industries o: example.com dc: example objectClass: top objectClass: dcObject objectClass: organization structuralObjectClass: organization entryUUID: bfd155ce-e846-102f-843d-e56d766ad1e2 creatorsName: cn=Admin,dc=example,dc=com createTimestamp: 20110321203714Z entryCSN: 20110321203714.392253Z#000000#000#000000 modifiersName: cn=Admin,dc=example,dc=com modifyTimestamp: 20110321203714Z ... dn: uid=amedeo,ou=people,dc=example,dc=com uid: amedeo ou: people sn: Amedeo cn: Amedeo Salvati displayName: Amedeo Salvati mail: amedeo@example.com userPassword:: cGFzc3dvcmQ=
Dove potremo vedere che per ogni record il nostro demone ha creato, ed in autonomia ne mantiene la consistenza, tutta una serie di record come entryUUID, creatorsName, createTimestamp, entryCSN, modifiersName e modifyTimestamp; ovvero:
- chi ha creato il record e quando tramite gli attributi creatorsName e createTimestamp;
- chi ha modificato il record e quando tramite gli attributi modifiersName e modifyTimestamp;
- un identificativo univoco del record tramite entryUUID;
- il Change Sequence Number dell'entry (entryCSN), che assieme al contextCSN sono utilizzati per la replica syncrepl.
In ultimo invece possiamo vedere che la userPassword viene codificata in base64 nel nostro db e non in chiaro, anche se è facilmente decodificabile tramite poche righe di codice:
$ python -c 'import base64 foo = base64.b64decode( "cGFzc3dvcmQ=" ) print "La password in base64: %s" % (foo)' La password in base64: password
Ovvero è equivalente ad avere una password scritta in chiaro.
Redirezione su un nuovo file
Adesso però vediamo come effettuare veramente il backup del nostro database redirezionando l'output verso un nuovo file:
$ sudo /usr/local/sbin/slapcat > /tmp/example.ldif
oppure
$ sudo /usr/local/sbin/slapcat \ -f /usr/local/etc/openldap/slapd.conf \ -l /tmp/example.ldif
Dove con il parametro -l potremo indicare il nome del file che conterrà il dump del nostro database, e con -f indicheremo il file di configurazione principale del demone slapd.
Aggiunta dei filtri
Ora vediamo come aggiungere alcuni filtri al nostro dump in modo da poter selezionare soltanto ciò che ci interessa, come ad esempio il dominio, la specifica organizational unit e via discorrendo.
Dominio example.com
$ sudo /usr/local/sbin/slapcat \ -a "(entryDN:dnSubtreeMatch:=dc=example,dc=com)"
Oppure usando il suffisso
$ sudo /usr/local/sbin/slapcat -b "dc=example,dc=com"
Dump del contenuto della organizational unit people
$ sudo /usr/local/sbin/slapcat -b "ou=people,dc=example,dc=com"
Ripristino da un backup
Per poter ripristinare un database da un backup possiamo utilizzare il comando slapadd, facendo prima un erase del nostro db.
Per fare questo dobbiamo seguire i seguenti passi:
- stop del demone slapd;
- cancellazione dell'intero database;
- lancio del comando slapadd passandogli come file ldif un nostro backup precedentemente creato.
Iniziamo con lo stop
$ sudo cat /usr/local/etc/openldap/slapd.conf | egrep '^pidfile' | \
awk '{print $2}' | xargs sudo cat | xargs sudo kill
Successivamente effettuiamo la cancellazione dei file associati al nostro database presenti nella directory /usr/local/var/openldap-data
$ cd /usr/local/var/openldap-data $ sudo rm __db.* $ sudo rm *.bdb $ sudo rm log.*
Ed infine ricarichiamo il tutto da un backup precedentemente creato
$ sudo /usr/local/sbin/slapadd -v -f /usr/local/etc/openldap/slapd.conf \ -l /tmp/example.ldif
Piccolo esempio per intercettare le differenze
Supponiamo di voler tracciare le differenze giornaliere apportate al nostro db, avendo dei semplici file testuali possiamo giocarci con il comando diff e/o patch:
Creiamo il nostro dump iniziale
$ sudo /usr/local/sbin/slapcat \ -f /usr/local/etc/openldap/slapd.conf \ -l /tmp/example01.ldif
Aggiungiamo l'uid luca nella nostra organizationalUnit people, di seguito il file ldif da creare:
dn: uid=luca,ou=people,dc=example,dc=com uid: luca ou: people sn: Luca cn: Luca Ferrari displayName: Luca Ferrari mail: luca@example.com userPassword: password objectClass: person objectClass: organizationalPerson objectClass: inetOrgPerson structuralObjectClass: inetOrgPerson
ed il comando per aggiungerlo al nostro db:
$ sudo slapadd -v -l luca.ldif
Adesso facciamo nuovamente il dump:
$ sudo slapcat > /tmp/example02.ldif
verifichiamo cosa è cambiato:
$ diff /tmp/example01.ldif /tmp/example02.ldif
Questo produrrà il listato seguente:
140a141,159 > dn: uid=luca,ou=people,dc=example,dc=com > uid: luca > ou: people > sn: Luca > cn: Luca Ferrari > displayName: Luca Ferrari > mail: luca@example.com > userPassword:: cGFzc3dvcmQ= > objectClass: person > objectClass: organizationalPerson > objectClass: inetOrgPerson > structuralObjectClass: inetOrgPerson > entryUUID: 1d585674-ebe5-102f-8632-aba2b7b1ff6e > creatorsName: cn=Admin,dc=example,dc=com > createTimestamp: 20110326110825Z > entryCSN: 20110326110825.276743Z#000000#000#000000 > modifiersName: cn=Admin,dc=example,dc=com > modifyTimestamp: 20110326110825Z >
Ovviamente possiamo giocarci come vogliamo, creando anche dei file di patch incrementali.
