Différences
Ci-dessous, les différences entre deux révisions de la page.
Prochaine révision | Révision précédente | ||
sysadmin:tips:ldap [2010/06/25 10:36] james créée |
sysadmin:tips:ldap [2016/02/04 18:05] (Version actuelle) james [recuperation de bases dbd] |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | {{tag>ldap serveur lister suffixes ldapsearch namingContexts ldapi slapd index auth EXTERNAL bdb_equality_candidates cn=config}} | ||
====== LDAP ====== | ====== LDAP ====== | ||
- | Obtenir la liste des suffixes disponibles sur un serveur LDAP :<code>ldapsearch -xLL -h ldap.mondomaine.com -b "" -s base "objectclass=*" "cn=SubSchema" +</code> | + | ===== Obtenir la liste des suffixes disponibles sur un serveur LDAP ===== |
+ | |||
+ | Pour btenir la liste des suffixes disponibles sur un serveur LDAP :<code>ldapsearch -xLL -h ldap.mondomaine.com -b "" -s base "objectclass=*" "cn=SubSchema" +</code> | ||
qui devrait vous renvoyer un résultat similaire à : <code>... | qui devrait vous renvoyer un résultat similaire à : <code>... | ||
namingContexts: dc=local | namingContexts: dc=local | ||
...</code> | ...</code> | ||
+ | |||
+ | ===== Utiliser ses credentials UNIX(Linux) pour effectuer une recherche LDAP ===== | ||
+ | Pour ne pas avoir à retaper ses credentials, on peut se connecter au serveur LDAP via le socket UNIX : | ||
+ | * déjà pour vérifier que votre serveur LDAP ecoute sur un socket UNIX :<code># ps aux | grep ldapi</code> | ||
+ | * si vous voyez une ligne similaire à celle qui suit c'est gagné :<code>openldap 10773 0.0 0.2 101128 5616 ? Ssl févr.13 0:36 /usr/sbin/slapd -h ldap:/// ldapi:/// -g openldap -u openldap -F /etc/ldap/slapd.d</code> | ||
+ | * sinon il faut dire a slapd d’écouter sur un socket, pour se faire sous debian/ubuntu cela se passe dans le fichier /etc/default/slapd : chercher la définition de SLAPD_SERVICES et ajoutez y **%%ldapi:///%%** pour obtenir une ligne similaire à : <code>SLAPD_SERVICES="ldap:/// ldapi:///"</code> | ||
+ | * Un restart du service slapd plus tard ca devrait être bon : <code>service slapd restart</code> | ||
+ | * Il ne reste plus qu'à effectuer votre recherche (l'emplacement du socket peut être différent si vous n'utilisez pas la même distribution/version : adaptez à votre cas ) : | ||
+ | * trouver quel socket utiliser grâce a netstat : <code># netstat -nlp | grep slap</code> qui doit renvoyer quelque chose comme : <code># netstat -nlp | grep slap | ||
+ | tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 4319/slapd | ||
+ | tcp6 0 0 :::389 :::* LISTEN 4319/slapd | ||
+ | unix 2 [ ACC ] STREAM LISTENING 9727856 4319/slapd /var/run/slapd/ldapi | ||
+ | </code> tadaaaa voila notre socket :-) | ||
+ | * faire enfin notre ldapsearch (authentification EXTERNAL en passant le socket en paramètre) :<code>ldapsearch -Y EXTERNAL -H ldapi://%2fvar%2frun%2fslapd%2fldapi -b "cn=config" "(objectclass=*)" dn</code> | ||
+ | <note tip>L’intérêt de cette méthode est par exemple d'effectuer des modifications sur le cn=config sans avoir défini d'utilisateur ni ACLs pour y accéder : il suffit alors d'être root sur la machine locale en lançant les commandes de modification : on est alors root sur le LDAP :-)</note> | ||
+ | |||
+ | ===== Jouer avec les index de son LDAP ===== | ||
+ | On va utiliser l’authentification par socket ci dessus pour jour avec les index de son annuaire LDAP. | ||
+ | <note tip>Noter bien sur que comme tout index de base plus on en à plus l'utilisation mémoire est forte et plus les requêtes d'update sont coûteuses : a vous d'estimer quel(s) index sont utiles/nécessaires car tout de même les requêtes en lecture utilisant les index seront bien plus rapides :-)</note> | ||
+ | On pourra ainsi se débarrasser des messages de warning type : <code>slapd[1482]: <= bdb_equality_candidates: (uidNumber) not indexed"</code> | ||
+ | ==== Lister les index actuels ==== | ||
+ | On va utilise rla commande ldapsearch en se connectant en root sur le socket qui-va-bien : | ||
+ | <code># ldapsearch -LLL -Y EXTERNAL -H ldapi://%2fvar%2frun%2fslapd%2fldapi -b "olcDatabase={1}hdb,cn=config" olcDbIndex</code> | ||
+ | qiu devrait vous retourner quelque chose comme : <code> | ||
+ | # ldapsearch -LLL -Y EXTERNAL -H ldapi://%2fvar%2frun%2fslapd%2fldapi -b "olcDatabase={1}hdb,cn=config" olcDbIndex | ||
+ | SASL/EXTERNAL authentication started | ||
+ | SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth | ||
+ | SASL SSF: 0 | ||
+ | dn: olcDatabase={1}hdb,cn=config | ||
+ | olcDbIndex: objectClass eq | ||
+ | olcDbIndex: entryUUID eq | ||
+ | olcDbIndex: entryCSN eq | ||
+ | olcDbIndex: cn eq | ||
+ | olcDbIndex: uid eq</code> | ||
+ | Si vous estimez qu'il en manque on peut en rajouter : je vais par exemple rajouter des index d'egalité sur uidNumber et gidNumber | ||
+ | ==== Ajouter de nouveaux index ==== | ||
+ | on va utiliser ldapmodify en root qui nous donne un shell :<code># ldapmodify -Y EXTERNAL -H ldapi://%2fvar%2frun%2fslapd%2fldapi </code> | ||
+ | la syntaxe ldapmodify est la suivante : | ||
+ | * tout d'abord entrer le dn a modifier : <code>dn: olcDatabase={1}hdb,cn=config</code> | ||
+ | * ensuite le changement à effecteur : dans notre cas ajouter un/des champs "olcDbIndex" :<code>add: olcDbIndex</code> | ||
+ | * ensuite les valeurs que l'on souhaite ajouter, une par ligne :<code>olcDbIndex: uidNumber eq | ||
+ | olcDbIndex: gidNumber eq</code> | ||
+ | * ensuite valider ce changement par une ligne vide, ce qui devrait vous afficher quelque chose comme :<code>modifying entry "olcDatabase={1}hdb,cn=config"</code> | ||
+ | * vous pouvez quitter ce shell avec Ctrl C si vous le souhaitez ou repartir pour un nouveau changement en spécifiant un nouveau dn a modifier, et ainsi de suite. | ||
+ | |||
+ | Voici donc la transcription complète de cet ajout d'index :<code> | ||
+ | # ldapmodify -Y EXTERNAL -H ldapi://%2fvar%2frun%2fslapd%2fldapi | ||
+ | SASL/EXTERNAL authentication started | ||
+ | SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth | ||
+ | SASL SSF: 0 | ||
+ | dn: olcDatabase={1}hdb,cn=config | ||
+ | add: olcDbIndex | ||
+ | olcDbIndex: uidNumber eq | ||
+ | olcDbIndex: gidNumber eq | ||
+ | |||
+ | modifying entry "olcDatabase={1}hdb,cn=config" | ||
+ | |||
+ | ^C | ||
+ | </code> | ||
+ | La requête de listage des index ci dessus devrait donc nous montrer cet ajout, il suffit de le vérifier :-) <code> | ||
+ | # ldapsearch -LLL -Y EXTERNAL -H ldapi://%2fvar%2frun%2fslapd%2fldapi -b "olcDatabase={1}hdb,cn=config" olcDbIndex | ||
+ | SASL/EXTERNAL authentication started | ||
+ | SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth | ||
+ | SASL SSF: 0 | ||
+ | dn: olcDatabase={1}hdb,cn=config | ||
+ | olcDbIndex: objectClass eq | ||
+ | olcDbIndex: entryUUID eq | ||
+ | olcDbIndex: entryCSN eq | ||
+ | olcDbIndex: cn eq | ||
+ | olcDbIndex: uid eq | ||
+ | olcDbIndex: uidNumber eq | ||
+ | olcDbIndex: gidNumber eq | ||
+ | </code> | ||
+ | |||
+ | ===== recuperation de bases dbd ===== | ||
+ | Si votre serveur LDAP ne demarre pas avec une erreur "id2entry.bdb: unexpected file type or format ", il est possible d'essayer de réparer. | ||
+ | Bien sur avant faites des sauvegardes ;p : | ||
+ | |||
+ | Deja on s'assure que rien ne tourne a grands coups de ps aux , et au besoin :<code> | ||
+ | # /etc/init.d/nslcd stop | ||
+ | # /etc/init.d/slapd stop | ||
+ | </code> | ||
+ | L'idee est de dumper les données correctes puis de les reimporter dans un nouveau fichier<code> | ||
+ | # cd /var/lib/ldap/example.com/ | ||
+ | # db4.2_dump id2entry.bdb > /root/id2entry.bdb.dump | ||
+ | # rm id2entry.bdb | ||
+ | # db4.2_load id2entry.bdb < /root/id2entry.bdb.dump | ||
+ | </code> | ||
+ | <note important>Ne pas oublier de faire un chown pour faire appartenir ce(s) noveau(x) fichiers a l'utilisateur faisant tourner slapd</note> | ||
+ | <note> Le fichier ".dump" est un fichier texte a plat qui peut rapidement comporter un nombre certain de lignes tres longues, donc prendre de la place ;-)</note> | ||
+ | |||
+ | ===== Références ===== | ||
+ | * Schémas et imports : http://www.zytrax.com/books/ldap/ch6/slapd-config.html#use-schemas |