mardi, juillet 10 2012

OpenDJ et les fichiers properties

Lorsque l'on souhaite passer une commande sur un annuaire il faut définir le serveur cible, son port, l'utilisateur et son mot de passe. Ceci est laborieux.

ldapsearch --hostname ldap.example.net --port 389 --bindDn "cn=Directory Manager" --bindPassword secret ...

Mais on peut s'en passer via les fichiers properties.

--propertiesFilePath \{CheminFichierPropriétés\}
    Chemin vers le fichier contenant les valeurs des propriétés par défaut pour
    les arguments de ligne de commande

Ce fichier permet de définir des informations génériques utilisables pour tous les outils en lignes de commandes opendj :

# Nom d'hôte ou adresse IP du serveur d'annuaire
hostname=ldap.example.net

# DN à utiliser pour effectuer une liaison au serveur
bindDN=cn=Directory Manager

# Mot de passe à utiliser pour effectuer une liaison au serveur
bindPassword=secret

# Numéro de port du serveur d'annuaire
port=1389

Il suffit alors de préciser le fichier properties à la ligne de commande :

ldapsearch --propertiesFilePath tools.properties

Mais on peut faire mieux encore et se passer de "propertiesFilePath".

Il suffit de placer ce fichier tools.properties dans le dossier ~/opends (oui j'ai bien noté opends, cela sera corrigé en 2.5.0[1]).

Et maintenant toutes les commandes opendj utilisent ce fichier.

Toutes et même stop-ds qui essaye de se connecter.

Ce qui ne nous intéresse pas outre mesure. Donc raffinons notre fichier :

# Nom d'hôte ou adresse IP du serveur d'annuaire
ldapsearch.hostname=ldap.example.net
ldapmodify.hostname=ldap.example.net

# DN à utiliser pour effectuer une liaison au serveur
ldapsearch.bindDN=cn=Directory Manager
ldapmodify.bindDN=cn=Directory Manager

# Mot de passe à utiliser pour effectuer une liaison au serveur
ldapsearch.bindPassword=secret
ldapmodify.bindPassword=secret

# Numéro de port du serveur d'annuaire
ldapsearch.port=1389
ldapmodify.port=1389

# Numéro de port d'administration du serveur d'annuaire (spécifique pour la commande dsconfig)
dsconfig.port=1390

Un peu de lecture

lundi, mai 24 2010

LDAP : les recherches non indexés et la pagination des résultats

Actuellement je travaille sur une application utilisant un annuaire LDAP comme conteneur de personnes. Dans cette application, les utilisateurs ont la possibilité de faire des recherches pouvant retourner beaucoup de résultats : quels personnes ont un nom commençant par "Du" (sn=Du*).

Par défaut, l'annuaire que nous utilisons (OpenDS 2.2) refuse cette requête :

ldapsearch -b "ou=People,dc=example,dc=com " -h localhost -p 1389 -D "uid=123456,ou=admins,dc=example,dc=com" -w azerty --countEntries "(sn=Du*)"
SEARCH RES conn=11 op=1 msgID=2 result=50 message="Vous ne disposez pas des privilèges suffisants pour lancer une recherche non indexée" nentries=0 etime=0

En effet les utilisateurs non-administrateur n'ont par défaut pas le privilège d'exécution de requête non indexées.

Exécutons la requête en mode administrateur : celle ci me retourne plusieurs milliers d'entrées.

Nous avons un index mais OpenDS limite sa taille à 4000 entrées.

dn: ds-cfg-backend-id=userRoot,cn=Backends,cn=config
ds-cfg-index-entry-limit: 4000

Que faire alors ?

Augmenter l'index peut paraitre une solution simple et évidente : mais quelle limite lui fixer ? 10000 ? Et qu'en sera il quand le volume de données dépassera se seuil ? Quid de l'espace disque consommé par cet index ? Et de son temps de calcul ?

Il semble plus pertinent de donner le privilège d'exécution des requêtes non indexés.

dn: uid=admin,ou=example,dc=com
changetype: modify
add: ds-privilege-name
ds-privilege-name: unindexed-search
SEARCH RES conn=15 op=1 msgID=2 result=4 message="Cette opération de recherche a renvoyé le nombre maximum d'entrées au client (1000)" nentries=1000 etime=532

Aie ! Ca ne marche toujours pas, car OpenDS ne permet pas de retourner plus de 1000 résultats pour une requête.

dn: cn=config ds-cfg-size-limit: 1000

Comment contourner cette limitation ?

Et bien paginons nos résultats !

Demandons à l'annuaire de nous retourner les toutes les entrées en X lots de 1000 résultats.

ldapsearch -b "ou=People,dc=example,dc=com " -h localhost -p 1389 -D "uid=admin,dc=example,dc=com" -w azerty --countEntries --simplePageSize 1000 "(sn=Du*)" dn

Et maintenant ca marche !

Source

LDAP Paged Results - More - Srikanth Konjarla (Sun)

OpenDS.org unindexed search (OpenDS Wiki)

Configuring Indexes on the Local DB Back End (OpenDS Wiki)