OpenLDAP Indexation
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.
Votre avis
Current user rating: 69/100 (2 votes)
|
|
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
.
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
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
Voir aussi
La mise en place des indexes a été inspirée des sites suivants:
http://www.miek.nl/s/ccc890bf85/