OpenLDAP Indexation

De EjnTricks
Révision de 20 septembre 2014 à 02:13 par Etienne (discussion | contributions)

(diff) ← Version précédente | Voir la version courante (diff) | Version suivante → (diff)

Lors de l'installation de l'annuaire OpenLDAP, un index a été posé sur la propriété objectClass. Cependant, les requêtes ne sont pas uniquement basée sur celle-ci, et très souvent sur uid, member lors de la recherche de groupe, ou même memberOf lors de l'utilisation de l'overlay memberof. Le manquee d'index peut être constaté en visualisant le fichier de log du système, fichier /var/log/syslog:

Apr 23 00:09:20 etienne-server slapd[25704]: <= bdb_equality_candidates: (uid) not indexed
Apr 23 00:09:20 etienne-server slapd[25704]: connection_read(12): no connection!
Apr 23 00:10:07  slapd[25704]: last message repeated 3 times
Apr 23 00:10:07 etienne-server slapd[25704]: connection_read(19): no connection!
Apr 23 00:11:22  slapd[25704]: last message repeated 3 times
Apr 23 00:11:22 etienne-server slapd[25704]: <= bdb_equality_candidates: (memberOf) not indexed
Apr 23 00:11:22 etienne-server slapd[25704]: connection_read(19): no connection!
Apr 23 00:11:22 etienne-server slapd[25704]: connection_read(19): no connection!
Apr 23 00:14:45 etienne-server slapd[25704]: <= bdb_equality_candidates: (uid) not indexed

Cet article présente la mise en place d'un index après création de l'annuaire.


Hand-icon.png Votre avis

Current user rating: 69/100 (2 votes)

 You need to enable JavaScript to vote


Icon Personnalisation.png Fichier LDIF

Comme pour toute modification, l'ajout d'index s'effectue par injection d'un fichier ldif avec la commande ldapadd. Dans le cadre de cet article le contenu suivant est mis en place dans un fichier index.ldif:

# Database settings
dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcDbIndex
olcDbIndex: uid eq
olcDbIndex: memberOf eq

Ce fichier sera appliqué sur la base identifiée par la valeur de dn, soit olcDatabase={1}hdb,cn=config. Pour s'assurer de la valeur, il suffit d'identifier le fichier olcDatabase={X}hdb.ldif, où X = 1 pour cet exemple, dans le répertoire /etc/ldap/slapd.d/cn=config.

La valeur modify de la directive changetype permet d'indiquer le mode d'injection, modification, dans la base.

Enfin, les trois dernières directives permettent d'indiquer que les valeurs suivantes vont être ajoutées à la propriété olcDbIndex, le nom pour les indexes:

  • uid eq
  • memberOf eq

Ainsi deux indexes seront positionnés, utilisés lors de filtre d'égalité sur les propriétés uid et memberOf.


Run-icon.png Injection fichier LDIF

L'injection de ces paramétrages s'effectuent à l'aide de la commande ldapadd, directement depuis la machine. Cependant cette commande ne doit pas être exécutée avec le compte d'administration mis en place. En effet, elles s'appliquent sur la configuration de la base. Or les permissions sont spécifiées au niveau du fichier /etc/ldap/slapd.d/cn=config/olcDatabase={0}config.ldif, où seul le compte de connexion, sur la machine, est habilité à effectuer des modifications.

 dn: olcDatabase={0}config
 objectClass: olcDatabaseConfig
 olcDatabase: {0}config
 olcAccess: {0}to * by dn.exact=gidNumber=0+uidNumber=0,cn=peercred,cn=external
  ,cn=auth manage by * break
 structuralObjectClass: olcDatabaseConfig
 entryUUID: 2807382e-2113-1031-96d6-0132d087d369
 creatorsName: cn=config
 createTimestamp: 20120422220629Z
 entryCSN: 20120422220629.347905Z#000000#000#000000
 modifiersName: cn=config
 modifyTimestamp: 20120422220629Z

L'injection s'effectue via la commande suivante:

#sudo ldapadd -Y EXTERNAL -H ldapi:/// -f index.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
modifying entry "olcDatabase={1}hdb,cn=config"

Les modifications apportées peuvent être visualisées dans le fichier ldif correspondant à la base, fichier /etc/ldap/slapd.d/cn=config/olcDatabase={1}hdb.ldif, qui contient alors les directives d'indexation.

dn: olcDatabase={1}hdb
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcDbDirectory: /var/lib/ldap
olcSuffix: dc=ejnserver,dc=fr
olcAccess: {0}to attrs=userPassword by dn="cn=admin,dc=ejnserver,dc=fr" write
 by anonymous auth by self write by * none
olcAccess: {1}to attrs=shadowLastChange by self write by * read
olcAccess: {2}to dn.base="" by * read
olcAccess: {3}to * by dn="cn=admin,dc=ejnserver,dc=fr" write by * read
olcLastMod: TRUE
olcRootDN: cn=admin,dc=ejnserver,dc=fr
olcRootPW:: R0NXNUU1UzhMZGFwQWRtaW4=
olcDbCheckpoint: 512 30
olcDbConfig: {0}set_cachesize 0 2097152 0
olcDbConfig: {1}set_lk_max_objects 1500
olcDbConfig: {2}set_lk_max_locks 1500
olcDbConfig: {3}set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcDbIndex: uid eq
olcDbIndex: memberOf eq
structuralObjectClass: olcHdbConfig
entryUUID: 50524e72-2113-1031-8a79-870dd4356727
creatorsName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
createTimestamp: 20120422220736Z
entryCSN: 20120422230917.881584Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20120422230917Z


Icon-database-process.png Génération index

Une fois les directives d'indexation mises en place, il est nécessaire de régénérer les indexes à l'aide de la commande slapindex, sans aucun argument pour une utilisation simplifiée.

#sudo slapindex

WARNING!
Runnig as root!
There's a fair chance slapd will fail to start.
Check file permissions!

Il faut bien prendre en compte le message d'avertissement et s'assurer que le compte, d'exécution du serveur LDAP, possède les droits suffisant sur les fichiers. Dans le cas de l'installation décrite, les fichiers se trouvent dans le répertoire /var/lib/ldap et le compte d'exécution est openldap. Afin de s'assurer des permissions, i lfaut lancer la commande:

#sudo chown -R openldap:openldap /var/lib/ldap


Viewer icon.png Voir aussi

La mise en place des indexes a été inspirée des sites suivants:

http://www.miek.nl/s/ccc890bf85/

http://www.zytrax.com/books/ldap/ch8/#add

http://www.zytrax.com/books/ldap/ch14/#slapindex