LDAP : Installation et configuration d'un Annuaire LDAP
Contents
- 1 Introduction
- 2 Installation
- 3 Configuration
- 4 Rechercher des enregistrements
- 5 Sauvegarde d’une base de données LDAP
- 6 Restaurer une base LDAP
- 7 Scripts PHP
- 8 Liste partielle d'attributs
- 9 Clients
- 10 FAQ
- 10.1 Comment débugger ?
- 10.2 ldap_bind: Invalid credentials (49)
- 10.3 ldap_add: Naming violation (64)
- 10.4 operation not permitted during recovery
- 10.5 Purger les logs
- 10.6 Vider le cache
- 10.7 err -30978. Restore from backup
- 10.8 LDAP search descriptors and ‘user_attr’
- 10.9 ldap_add: No such object (32)
- 10.10 ldap_add: Constraint violation (19)
- 10.11 <= bdb_equality_candidates: (uid) not indexed
- 11 References
Software version | 2.4.23+ |
---|---|
Operating System | Debian 6 |
Website | OpenLDAP Website |
Last Update | 28/03/2013 |
Others |
1 Introduction
Lightweight Directory Access Protocol (LDAP) est un protocole permettant l'interrogation et la modification des services d'annuaire. Ce protocole repose sur TCP/IP. Un annuaire LDAP respecte généralement le modèle X.500 édicté par l'UIT-T : c'est une structure arborescente dont chacun des nœuds est constitué d'attributs associés à leurs valeurs.
Le nommage des éléments constituant l'arbre (racine, branches, feuilles) reflète souvent le modèle politique, géographique ou organisationnel de la structure representée. La tendance actuelle est d'utiliser le nommage DNS pour les éléments de base de l'annuaire (racine et premières branches). Les branches plus profondes de l'annuaire peuvent représenter des personnes (people), des unités organisationnelles (organizational units), des groupes (groups), ...
dc=fr | dc=example / \ ou=people ou=groups
2 Installation
Pour installer OpenLDAP :
apt-get install ldap-server ldap-client |
Ceci va nous installer :
- ldap-utils
- slapd
- libiodbc2
- libldap-2.3-0
3 Configuration
3.1 slapd.conf
3.1.1 Méthode récente
Voici la méthode récente[1] pour configurer votre OpenLDAP (enfin...le début) :
dpkg-reconfigure |
dpkg-reconfigure -plow slapd |
Suivez ensuite les instructions
3.1.2 Ancienne méthode
Tout d'abord, nous allons générer un mot de passe crypté car nous allons avoir besoin de le mettre dans le fichier de configuration. Nous avons le choix de le mettre également en clair, mais pour des raisons de sécurité, il sera crypté :
slappasswd |
# slappasswd New password: Re-enter new password: {SSHA}5y67xJ/t7esuGKUD7TQPcgykd8xiYMO2 |
Copiez la dernière ligne {SSHA}5y67x... qui correspond au mot de passe crypté. Ici le mot de passe est admin.
Editez le fichier /etc/ldap/slapd.conf :
Maintenant, pour que la configuration soit prise en compte, nous allons redémarrer le serveur :
/etc/init.d/slapd restart |
3.2 LDIF
Ce format de fichier est utilisé pour faire des imports / exports entre plusieurs bases ou pour modifier ou ajouter des données dans une base.
ATTENTION : Il est obligatoire de coder les données en UTF-8. Si lors de l’importation une erreur est rencontrée, celle-ci est abandonnée à l’endroit où elle en était.
3.2.1 Importer un schéma
Voici la structure d’un fichier LDIF :
dn: <distinguished name objectClass: <object class objectClass: <object class ... <attribute type:<attribute value <attribute type:<attribute value ...
Voici un exemple de fichier LDIF "AjoutRacine.ldif" pour créer la racine de l’arbre LDAP :
dn: dc=deimos,dc=fr objectClass: dcObject objectClass: organization o: deimos Corporation dc: deimos
Commande pour ajouter la racine :
ldapadd |
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -w admin -f AjoutRacine.ldif |
Vous pouvez également ne pas écrire en clair le mot de passe en demandant le prompt :
ldapadd |
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -W -f AjoutRacine.ldif |
Voici un exemple de fichier LDIF "AjoutFiche.ldif" pour créer une nouvelle fiche :
dn: cn=Pierre MAVRO,dc=deimos,dc=fr objectClass: inetOrgPerson cn: Pierre MAVRO givenName: Pierre sn: MAVRO
Certains champs du slapcat ne doivent figurer sous peine d'avoir l'erreur 19[2]. Nous allons donc utiliser sed pour faire le ménage :
sed_ldif |
/^creatorsName:/d /^createTimestamp:/d /^modifiersName:/d /^modifyTimestamp:/d /^structuralObjectClass:/d /^entryUUID:/d /^entryCSN:/d |
Puis nous allons faire ce sed sur la totalité de notre ldif :
sed |
sed -f sed_ldif import_unclear.ldif > import_clear.ldif |
Maintenant nous pouvons importer le LDIF :
ldapadd |
ldapadd -h localhost -x -W -D "cn=admin,dc=deimos,dc=fr" -c -f import_clear.ldif |
3.2.2 Importer des enregistrements
Commande pour ajouter la fiche :
ldapadd |
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -w admin -f AjoutFiche.ldif |
3.2.3 Modifier des enregistrements
Les commandes de modification ont la syntaxe suivante :
dn: distinguished name changetype {{TYPE}} change operation identifier list of attributes... ... - change operation identifier list of attributes ...
TYPE peu avoir l’une des valeurs suivantes :
- add (ajout d’une entrée),
- delete (suppression),
- modrdn (modification du RDN),
- modify (modification : add, replace, delete d’un attribut)
Le fichier "ModifFiche.ldif" ci-dessous permet d’ajouter le numéro de téléphone :
dn: cn=Père Noël,dc=deimos,dc=fr changetype: modify add: telephonenumber telephonenumber: 08 36 65 65 65
Commande pour modifier la fiche :
ldapadd |
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -w admin -f ModifFiche.ldif |
3.2.4 Supprimer des enregistrements
Le fichier "SuppFiche.ldif" ci-dessous permet de supprimer une fiche :
dn: cn=Pierre MAVRO,dc=deimos,dc=fr changetype: delete
Commande pour supprimer la fiche :
ldapadd |
ldapadd -x -D "cn=admin,dc=deimos,dc=fr" -w admin -f SuppFiche.ldif |
4 Rechercher des enregistrements
Rechercher les enregistrements contenant un attribut objectclass (donc tous) depuis la racine :
ldapsearch |
ldapsearch -x -b "dc=deimos,dc=fr" "objectclass=*" |
Rechercher les enregistrements contenant un attribut cn dans la branche deimos :
ldapsearch |
ldapsearch -x -b "o=deimos Corporation,dc=deimos,dc=fr" "cn=*" |
Rechercher les enregistrements donc l’attribut dc se termine par gray depuis la racine :
ldapsearch |
ldapsearch -x -b "dc=deimos,dc=fr" "dc=*gray" |
5 Sauvegarde d’une base de données LDAP
La commande suivante permet de générer un fichier .LDIF contenant la base complète (sans le schéma ou la configuration) :
ldapcat |
slapcat -l DumpLDAP.ldif -b "dc=deimos,dc=fr" |
Pour sauvegarder schéma et configuration[3] :
slapcat |
slapcat -b cn=config -l config.ldif |
Pour sauvegarder le schéma uniquement :
slapcat |
slapcat -b cn=schema -l config.ldif |
6 Restaurer une base LDAP
Pour restaurer une configuration, voici la marche à suivre[4] :
/etc/init.d/slapd stop rm -rf /etc/ldap/slapd.d/* su - openldap -c "slapadd -F /etc/ldap/slapd.d -b cn=config -l config.ldif" /etc/init.d/slapd start |
7 Scripts PHP
- Exemple de script PHP pour se connecter au serveur LDAP :
- Exemple de script PHP pour rechercher des enregistrements :
8 Liste partielle d'attributs
8.1 Classe organization
8.2 Classe inetOrgPerson
9 Clients
9.1 Installation
9.1.1 Debian
Pour pouvoir se connecter à l'annuaire OpenLDAP, nous aurons besoin de plusieurs choses :
apt-get |
aptitude install libnss-ldapd libpam-smbpass libpam-mount |
9.1.2 Red Hat
Sur Red Hat, il n'y a pas grand chose à installer :
yum |
yum install nss-pam-ldapd |
9.2 Configuration
D'une manière générale, les clients unix peuvent s'authentifier en utilisant les informations contenues dans l'annuaire LDAP via PAM et NSS. Il sufft donc d'installer et de configurer ces composants sur les différents systèmes.
9.2.1 Debian
Vous avez le choix d'installer libpam-ldapd ou libpam-ldap. libpam-ldapd est plus récent et évite quelques bugs vu sur libpam-ldap. A vous de voir ce que vous voulez :-)
9.2.1.1 libpam-ldapd
Si vous optez pour libnss-ldapd, alors vous n'avez simplement qu'a installer ceci et répondre aux questions.
aptitude |
aptitude install libnss-ldapd |
9.2.1.2 libpam-ldap
Si vous avez choisi d'installer libpam-ldap à la place de libpam-ldapd, vous allez devoir faire ceci à la main.
Par défaut, debian créé deux fichiers de configuration différents pour libpam-ldap et libnss-ldap. Ceci est inutile vu que ces deux fichiers vont contenir la même chose. Il faut supprimer les fichiers de configuration libpam-ldap et créer des liens depuis ceux de libnss-ldap ver ceux de libpam-ldap:
rm /etc/pam_ldap.* ln -s /etc/libnss-ldap.conf /etc/pam_ldap.conf ln -s /etc/libnss-ldap.secret /etc/pam_ldap.secret |
Editer /etc/libnss-ldap.conf et y mettre (il ne doit contenir que ces lignes) :
Dans /etc/libnss-ldap.secret, indiquer le mot de passe de l'utilisateur indiquer sur la ligne rootdn du fichier /etc/libnss-ldap.conf.
Vous devez ensuite modifier le fichier /etc/nsswitch.conf afin d'y indiquer que la recherche se fera entre autre dans l'annuaire ldap pour les différents services. Cela donne par exemple :
/etc/nsswitch.conf |
passwd: files ldap group: files ldap shadow: files ldap hosts: files dns networks: files protocols: db files services: db files ethers: db files rpc: db files netgroup: nis |
9.2.1.3 libpam-ldapd et libpam-ldap
Enfin, il faut modifier les chaines pam pour que celles-ci permettent l'authentification via l'annuaire ldap. Ceci se fait en copiant les différents fichier /etc/pam.d/common-* vers /etc/pam.d/common-*-ldap :
cd /etc/pam.d cp common-account{,-ldap} cp common-auth{,-ldap} cp common-pammount{,-ldap} cp common-password{,-ldap} cp common-session{,-ldap} |
Editer les différents fichiers /etc/pam.d/common-*-ldap pour avoir :
- /etc/pam.d/common-account-ldap :
/etc/pam.d/common-account-ldap |
account sufficient pam_ldap.so account sufficient pam_unix.so use_first_pass account required pam_deny.so |
- /etc/pam.d/common-auth-ldap
- /etc/pam.d/common-password-ldap
- /etc/pam.d/common-session-ldap
/etc/pam.d/common-session-ldap |
session required pam_unix.so session required pam_ldap.so session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 session optional pam_mount.so |
- /etc/pam.d/common-session
/etc/pam.d/common-session |
session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 session sufficient pam_ldap.so session required pam_unix.so |
Une fois ces fichiers common-*-ldap créés, on peut éditer les fichiers des différents services pour lesquels on veut autoriser l'authentification par ldap... Si par exemple on veut permettre aux utilisateurs contenus dans l'annuaire LDAP de se connecter en ssh sur la machine, on edite le fichier /etc/pam.d/ssh et on remplace les common-qqc en common-qqc-ldap.
Pour l'automount des partitions en fonction de l'utilisateur, éditez le fichier /etc/security/pam_mount.conf :
/etc/security/pam_mount.conf |
volume * cifs 192.168.0.30 &$ /media/windows/& sfu - - |
Si vous ne pouvez toujours pas vous connecter, redémarrer le service nscd :
/etc/init.d/nscd restart |
La commande suivante doit fonctionner correctement :
getent |
getent passwd mon_user |
9.2.1.4 Autoriser un groupe LDAP en particulier
Une des méthodes courantes est de n'autoriser qu'un ou certains groupes du LDAP à accéder à une machine. Pour celà, il faudra que les groupes aient comme attribut posixGroup nommé login.
9.2.1.4.1 Debian
Installez libpam-modules si ce n'est pas déjà fait :
aptitude |
aptitude install libpam-modules |
Ensuite ajoutez cette ligne dans le fichier /etc/pam.d/common-auth :
/etc/pam.d/common-auth |
... auth required pam_access.so |
9.2.1.4.2 Red Hat
Installez ce package :
yum |
yum install pam-devel |
Et ajoutez cette ligne sur le service que vous souhaitez (sshd par exemple), la restriction :
/etc/pam.d/sshd |
auth include password-auth
account required pam_access.soaccount required pam_nologin.so |
9.2.1.4.3 Configuration
Celà va nous permettre d'utiliser le fichier /etc/security/access.conf. Et voici le genre de ligne qu'il faut rajouter :
/etc/security/access.conf |
... # disallow all except people in the login group and root -:ALL EXCEPT root (sysadmin):ALL EXCEPT LOCAL |
Ceci permet de désactiver tous les comptes sauf :
- root
- Le groupe sysadmin (pas l'utilisateur grâce aux parenthèses)
- LOCAL : les utilisateurs locaux
9.2.2 Red Hat
Il existe 2 méthodes. La première passe par un script Red Hat qui va nous faire tout pour nous, tandis que la deuxième est la solution manuelle.
9.2.2.1 Méthode 1
Pour configurer PAM avec LDAP, utilisez cette commande et adaptez la à vos besoins :
authconfig |
authconfig --enableldap --enableldapauth --ldapserver=ldap://openldap-server.deimos.fr:389 --ldapbasedn="dc=openldap,dc=deimos,dc=fr" --enableldaptls --ldaploadcacer=http://serveur-web/deimosfr.crt --enablemkhomedir --update |
- --ldapserver : rentrez l'adresse de votre serveur web
- --ldapbasedn : le DN de votre serveur
- --enableldaptls : si vous utilisez des connections LDAP sécurisées
- --ldaploadcacer : le certificat à utiliser (si vous n'avez pas moyen de le récupérer de cette façon, regardez la procédure un peu plus bas)
ou une version sans ssl/tls :
Pour récupérer le certificat ssl demandé plus haut, voici une solution :
Dans le cas ou le certificat est récupérer de la manière manuelle, copiez le dans /etc/openldap/cacerts/ldap.crt, puis exécutez la commande suivante :
cacertdir_rehash |
cacertdir_rehash /etc/openldap/cacerts |
9.2.2.2 Méthode 2
Modifier /etc/ldap.conf. Ce fichier est l'équivalent de /etc/libnss_pam.conf sous debian. Vous pouvez donc y mettre la même chose.
Modifier le fichier /etc/pam.d/system_auth : c'est l'équivalent des différents common-* sous debian. Cela donne par exemple:
Comme sur debian, il faut également modifier le fichier /etc/nsswitch.conf.
9.2.3 Forcer un shell au login
Si vous avez une authentification de pam via LDAP, il est possible de forcer un shell en particulier au login. Il va donc overrider les informations envoyées par NSS et les remplacer par le shell souhaité. Nous allons utiliser ici lshell pour toutes les personnes se connectant via LDAP :
/etc/libnss-ldap.conf ou /etc/ldap.conf |
nss_override_attribute_value loginShell /usr/bin/lshell |
9.2.4 Solaris
- Configurer le fichier /etc/pam.conf :
Pour chaque ligne :
/etc/pam.conf |
service auth required pam_unix_auth.so.1 |
remplacer "required" par "sufficient" et ajouter derrière la ligne :
/etc/pam.conf |
service auth sufficient pam_ldap.so.1 try_first_pass |
Ce qui doit donner quelquechose comme ceci :
- Configurer le fichier /etc/nsswitch.ldap
Laisser "ldap" uniquement là où c'est utile : pour le moment sur les lignes passwd: et group:.
Pour le reste, mettre le contenu du fichier /etc/nsswitch.dns.
Ce qui donne :
Une fois que cela est fait, nous allons pouvoir mettre en place la configuration. Attention : si vous êtes en environnement cluster, adapatez à la conf initiale ! :
cp /etc/nsswitch.ldap /etc/nsswitch.conf |
- Lancer la configuration du client ldap
Il suffit de taper la commande :
Attention : il semble que la commande ldapclient soit buggée et nécéssite les paramètres proxyDN et proxyPassword même s'ils sont inutilisés ! (et même s'ils contiennent n'importe quoi)
- Attention au répertoire home, il faut configurer /etc/auto_home (http://www.solaris-fr.org/home/docs/base/utilisateurs). Ce qui donne pour ma part :
Au cas où vous voudriez créer automatiquement le home directory, vous devez effectuer un portage du pam_mkhomedir de linux :
- http://mega.ist.utl.pt/~filipe/pam_mkhomedir-sol/?C=D;O=A
- http://www.keutel.de/pam_mkhomedir/index.html
Une bonne idée serait aussi de monter automatiquement le home depuis un serveur nfs.
Il faut que les comptes utilisateurs dans l'annuaire LDAP aient dans leur liste d 'objectClass la classe « shadowAccount » pour pouvoir être pris en compte par solaris.
10 FAQ
10.1 Comment débugger ?
Il existe un moyen très efficace de débugger :
slapd |
slapd -d 17 |
10.2 ldap_bind: Invalid credentials (49)
Là clairement il y a un problème avec votre login et votre mot de passe ! Vérifiez le tout et faites bien attention si le mot de passe est en crypté ou non.
10.3 ldap_add: Naming violation (64)
Si vous avez un message du genre, lors de la création racine :
adding new entry "dc=deimos,dc=fr" ldap_add: Naming violation (64) additional info: value of naming attribute 'dc' is not present in entry
C'est que vous avez un problème au niveau du "dc". En effet, si votre "dn" contient 2 arguments comme ici (deimos et fr pour deimos.fr), alors vous devez indiquer pour votre "dc" le premier arguement de votre "dn". Ex :
dc=deimos,dc=fr
mon dc est alors deimos dans mon fichier d'import ldif.
10.4 operation not permitted during recovery
Suite à une coupure brutale du serveur, le serveur ldap n’est pas reparti. Voici le message que j’avais au démarrage en mode débugage :
# slapd -d 1 bdb_db_open: dbenv_open(/var/lib/ldap) bdb(dc=mondomaine,dc=com): operation not permitted during recovery bdb_db_open: db_open(/var/lib/ldap) failed: Invalid argument (22) backend_startup: bi_db_open failed! (22) bdb_db_destroy: close failed: Invalid argument (22) slapd stopped.
En fait, c’était la base ldap qui était corrompue et pour régler ce problème, je l’ai simplement ré-indexée avec ces commandes :
/etc/init.d/slapd stop slapindex /etc/init.d/slapd start |
10.5 Purger les logs
Il m'est arrivé de n'avoir plus de place sur un de mes disques à cause des logs qui prennent trop de place. Pour flusher automatiquement les logs, 2 méthodes existent : auto et manuelle.
10.5.1 Méthode automatique
Il suffit d'insérer ceci dans ce fichier /var/lib/ldap/DB_CONFIG :
/var/lib/ldap/DB_CONFIG |
set_flags DB_LOG_AUTOREMOVE |
10.5.2 Méthode manuelle
Il faut que le serveur ldap soit arrêter. Mais avant, il va déjà falloir installer ceci :
apt-get |
apt-get install db4.2-util |
Arrêtez maintenant le serveur ldap.
Pour lister les logs qui peuvent être supprimer, faites cette commande :
cd /var/lib/ldap/ db4.2_archive |
Pour supprimer les logs qui peuvent être supprimer :
cd /var/lib/ldap/ db4.2_archive -d |
Pour purger au maximum :
db4.2_checkpoint |
db4.2_checkpoint -1 |
10.6 Vider le cache
Il peut arriver d'avoir plusieurs utilisateurs qui se font la male suite à une malencontreuse synchronisation foireuse. Par exemple un slapcat vous montrera les utilisateurs et groupes ldap, mais pas la commande getent.
Tout ceci est du au cache. Pour corriger le problème, il faut donc le vider. La commande nscd :
La liste des caches disponible peut être donnée via un help sur la commande :
Si on souhaites donc vider par exemple le cache des groupes, il suffit de faire :
nscd |
nscd -i group |
Vous pouvez redémarrer le service si vous souhaitez tout flusher.
10.7 err -30978. Restore from backup
Quand on a ce genre de messages, c'est souvent la panique :
Pour réparer tout ce petit monde, nous avons la commande db_recover. Adaptez la selon votre version :
db4.2_recover |
db4.2_recover |
Vous pouvez encore rencontrer des soucis après celà. Pour ma part, la commande slapcat fonctionne. On peut donc extraire le contenu pour en faire un ldif, repartir base vide et réinjecter ce ldif (je n'ai pas testé, mais dans l'idée, ça doit marcher). Pour repartir base vide, voici comment faire :
- S'assurer que le serveur ldap est bien éteint
- Backupper son ancienne base /var/lib/ldap
- Créer tous les dossiers de vos bases avec un dossier logs dedans (ex: /var/lib/ldap/base/logs)
- Se placer /var/lib/ldap et lancer la commande db_recover
- Se placer dans chaque base et lancer la commande db_recover
- Lancez le serveur ldap
- Réinjectez le ldif et ça doit être bon :-)
10.8 LDAP search descriptors and ‘user_attr’
Si vous avez ce type de message d'erreur :
[ID 293258 user.warning] libsldap: Status: 4 Mesg: Service search descriptor for service 'passwd' contains filter, which can not be used for service 'user_attr'.
C'est simplement qu'il vous manque 2 lignes dans votre fichier de configuration ldap client :
Puis killez le service nscd pour qu'il reboot.
10.9 ldap_add: No such object (32)
Si vous avez ce genre d'erreur lors de l'import d'un LDIF dans une instance LDAP :
ldap_add: No such object (32)
C'est tout simplement que les ajouts (utilisateurs par exemple) n'ont pas leurs entrées prêtes pour y être insérés. Je m'explique, si un utilisateur de ce type :
dn: uid=pmavro,o=test,ou=person,dc=deimos,dc=fr
Il faut que l'Organisation test et l'OU person existent avant de pouvoir importer. Et malheureusement, si la création de ces entrées ne sont pas présente dans l'arborescence, alors l'import échouera.
10.10 ldap_add: Constraint violation (19)
Si vous avez ce genre d'erreur lors de l'import d'un LDIF dans une instance LDAP :
ldap_add: Constraint violation (19)
C'est qu'il y a des informations figurant dans votre LDIF qui ne devraient pas être présentes. Pour corrigez celà, il va falloir supprimer des champs, comme expliqué ici.
10.11 <= bdb_equality_candidates: (uid) not indexed
Si vous rencontrez ce genre de message :
<= bdb_equality_candidates: (uid) not indexed
C'est qu'il y a des champs non indexés lorsqu'une application tente d'y accéder. Pour corriger ceci, il faut rajouter (l'UID ici) à l'index. Nous allons donc éditer ce fichier et rajouter l'uid dans notre cas :
Ensuite nous devons redémarrer le LDAP et lancer une commande d'indexation à froid :
/etc/init.d/slapd stop su - openldap -c slapindex openldap /etc/init.d/slapd start |
11 References
- ^ http://wiki.debian.org/LDAP/OpenLDAPSetup?highlight=%28openldap%29
- ^ http://virtualtee.blogspot.fr/2012/02/openldap-after-upgrading-debian.html
- ^ http://trac.evolix.net/infogerance/wiki/HowtoOpenLDAP
- ^ http://wiki.freegeekvancouver.org/article/LDAP
Documentation sur le fonctionnement
Documentation pour une mise en place
OpenLDAP installation on Debian
Documentation sur Fedora Core 7
Formation Linagora OpenLDAP
Formation Linagora sur le Protocole LDAP
Formation Linagora sur l'optimisation d'OpenLDAP