Fork me on GitHub

Rebuild openldap database and indexes

Una directory accessibile mediante protocollo ldap come OpenLDAP non è immune a problematiche di corruzione, che in determinate situazioni ne compromettono l'usabilità.

Durante la gestione della mia directory mi è capitato di imbattermi in un clamoroso, almeno per me, "Impossibile eliminare l'oggetto":

internal (implementation specific)
error 0x50 (ldap_other)
mentre tentavo di eliminare un oggetto in un unità organizzativa.

Riflettendo sulla situazione l'errore non sembrava bloccante, gli applicativi afferenti alla directory potevano infatti continuare ad usufruire del servizio, ma la presenza di oggetti che non fosse possibile eliminare o rinominare denunciavano uno stato di compromessa stabilità che non mi permetteva di stabilire se e quando le cose sarebbero potute peggiorare.

Sgoogolare per ottenere una rapida soluzione che risolvesse il problema specifico è stato infruttuoso. Tale errore benché richiami palesemente ad un errore interno, si manifesta, secondo i principali risultati ottenuti dal motore di ricerca, in condizioni di accesso insufficiente, quali (possibilità via via più remote):

  • alterazioni dei permessi sul file system del direttorio del database di OpenLDAP a seguito di un operazione manuale di re-indicizzazione condotta da un utente diverso da quello che esegue il processo ldap
  • livello di accesso inadeguato dovuto a difetti di cifratura nel protocollo di autenticazione tls
  • operazione svolta da un utenza priva di privilegi

Qualsiasi oggetto creassi nell'unità organizzativa "corrotta" risultava leggibile, modificabile negli attributi, ma non rinominabile ne eliminabile.

Ho tentato di riparare il database ma il problema sopravviveva alla riparazione, pertanto si è reso necessario ricostruire per intero il database.

La procedura di riparazione è tipicamente condotta offline ed è basata su 3 passi chiave:

  • dump dei contenuti della directory su file ldiff
  • ricostruzione dell'infrastruttura vuota del database utilizzando una copia del file DB_CONFIG
  • ripristino dei dati nel database

Estraete in un file ldif le informazioni complete dal database utilizzando slpcat

[[email protected] ldap]# slapcat > /tmp/dirdump.ldif

Arrestate quindi il servizio ldap e rinominate la directory del database originale; quindi ricostruite il path copiatevi il file DB_CONFIG e ripristinate i permessi

[[email protected] ldap]# service ldap stop
Interruzione di slapd:                                     [  OK  ]
Interruzione di slurpd:                                    [  OK  ]
[[email protected] ~]# mv /var/lib/ldap /var/lib/ldap_old
[[email protected] ~]# mkdir /var/lib/ldap
[[email protected] ~]# cp /var/lib/ldap_old/DB_CONFIG /var/lib/ldap/
[[email protected] ~]# chown ldap:ldap /var/lib/ldap/
[[email protected] ldap]# service ldap start
Controllo file di configurazione per slapd:  config file testing succeeded
                                                           [  OK  ]
Avvio di slapd:                                            [  OK  ]
Avvio di slurpd:                                           [  OK  ]

Al riavvio del demone ldap, verrà ricreato un database vuoto.

[[email protected] ldap]# ls -l
totale 184
-rw-r--r-- 1 ldap ldap      2048 19 lug 13:08 alock
-rw------- 1 ldap ldap     24576 19 lug 13:08 __db.001
-rw------- 1 ldap ldap  80019456 19 lug 13:08 __db.002
-rw------- 1 ldap ldap 335552512 19 lug 13:08 __db.003
-rw------- 1 ldap ldap   2359296 19 lug 13:08 __db.004
-rw------- 1 ldap ldap    352256 19 lug 13:08 __db.005
-rw------- 1 ldap ldap     24576 19 lug 13:08 __db.006
-rw-r----- 1 ldap ldap       886 19 lug 13:08 DB_CONFIG
-rw------- 1 ldap ldap      8192 19 lug 13:08 dn2id.bdb
-rw------- 1 ldap ldap     32768 19 lug 13:08 id2entry.bdb
-rw------- 1 ldap ldap  10485760 19 lug 13:08 log.0000000001
drwxr-xr-x 2 root root      4096 19 lug 13:08 replica

Arrestiamo nuovamente il servizio, e procediamo alla fase 3 ripristinando i dati estrapolati, reindicizzando, e reimpostando per sicurezza i permessi utente corretti:

[[email protected] ldap]# service ldap stop
Interruzione di slapd:                                     [  OK  ]
Interruzione di slurpd:                                    [  OK  ]
[[email protected] ldap]# cat /tmp/dirdump.ldif |slapadd -c
[[email protected] ldap]# slapindex -f /etc/openldap/slapd.conf
[[email protected] ldap]# chown -R ldap:ldap /var/lib/ldap
[[email protected] ldap]# ls -l
totale 81604
-rw-r--r-- 1 ldap ldap      2048 19 lug 13:09 alock
-rw------- 1 ldap ldap   1429504 19 lug 13:09 cn.bdb
-rw------- 1 ldap ldap     24576 19 lug 13:08 __db.001
-rw------- 1 ldap ldap  80019456 19 lug 13:08 __db.002
-rw------- 1 ldap ldap 335552512 19 lug 13:08 __db.003
-rw------- 1 ldap ldap   2359296 19 lug 13:08 __db.004
-rw------- 1 ldap ldap    352256 19 lug 13:08 __db.005
-rw------- 1 ldap ldap     24576 19 lug 13:08 __db.006
-rw-r----- 1 ldap ldap       886 19 lug 13:08 DB_CONFIG
-rw------- 1 ldap ldap   1347584 19 lug 13:09 displayName.bdb
-rw------- 1 ldap ldap    512000 19 lug 13:09 dn2id.bdb
-rw------- 1 ldap ldap     53248 19 lug 13:09 gidNumber.bdb
-rw------- 1 ldap ldap   8667136 19 lug 13:09 id2entry.bdb
-rw------- 1 ldap ldap  10485760 19 lug 13:09 log.0000000001
-rw------- 1 ldap ldap  10485760 19 lug 13:09 log.0000000002
-rw------- 1 ldap ldap  10485760 19 lug 13:09 log.0000000003
-rw------- 1 ldap ldap  10485760 19 lug 13:09 log.0000000004
-rw------- 1 ldap ldap  10485760 19 lug 13:09 log.0000000005
-rw------- 1 ldap ldap  10485760 19 lug 13:09 log.0000000006
-rw------- 1 ldap ldap    139264 19 lug 13:09 memberUid.bdb
-rw------- 1 ldap ldap    307200 19 lug 13:09 objectClass.bdb
drwxr-xr-x 2 ldap ldap      4096 19 lug 13:08 replica
-rw------- 1 ldap ldap     36864 19 lug 13:09 sambaDomainName.bdb
-rw------- 1 ldap ldap      8192 19 lug 13:09 sambaGroupType.bdb
-rw------- 1 ldap ldap     40960 19 lug 13:09 sambaPrimaryGroupSID.bdb
-rw------- 1 ldap ldap     94208 19 lug 13:09 sambaSID.bdb
-rw------- 1 ldap ldap    847872 19 lug 13:09 sn.bdb
-rw------- 1 ldap ldap    897024 19 lug 13:09 uid.bdb
-rw------- 1 ldap ldap     94208 19 lug 13:09 uidNumber.bdb
[[email protected] ldap]# service ldap start
Controllo file di configurazione per slapd:  config file testing succeeded
                                                           [  OK  ]
Avvio di slapd:                                            [  OK  ]
Avvio di slurpd:                                           [  OK  ]
[[email protected] ldap]# service ldap start

Da questo momento in poi la situazione è completamente ripristinata, il problema di cancellazione degli oggetti non si presenterà più e l'infrastruttura database completamente rinnovata.

Commenti !

blogroll

social