Formation OpenLDAP
Installation
Recherche du package:
yum search openldap
Vérification des packages déjà installés:
rpm -qa openldap
ATTENTION on n'a que la partie cliente...
Vérification de la version de noyau
uname -a
Installation du serveur openldap
yum install openldap-servers.x86_64
ATTENTION à cette étape, on n'a pas les commandes clientes ldap*, uniquement les slap*
yum install openldap-clients.x86_64
Configuration initiale
Fichier de configuration slapd.conf
ATTENTION pb: pas de slapd.conf
updatedb locate slapd.conf less /usr/share/openldap-servers/slapd.conf.obsolete cp /usr/share/openldap-servers/slapd.conf.obsolete /etc/openldap/slapd.conf
Edition de /etc/openldap/slapd.conf
Configuration du Root DN et de l'accès Manager
database bdb suffix "dc=pedrono,dc=fr" rootdn "cn=Manager,dc=pedrono,dc=fr" rootpw {SHA}C5wmJdwh7wX2rU3fR8XyA4N6oyw= (toto)
Génération du mot de passe du manager (rootdn) via slappasswd
slappasswd -h {SHA} -T ./pwdfile
ou
slappasswd -h {SHA} (fonctionnement interactif)
Le mot de passe est affichée sur la sortie standard.
Données
Les données sont dans /var/lib/ldap, mais préférer l'utilisation de slapcat pour faire ses sauvegardes en ldif.
Attention, faire des exports ldif réguliers, en particulier avant la mise à jour d'un serveur, car en cas de changement de format bdb, on peut abimer tout l'annuaire et donc devoir le réimporter.
Mise en place d'ACL
Toujours dans slapd.conf:
# On bloque tout pour tout le monde # Tout est déjà ouvert pour le rootdn puisque pas sujet aux ACL # On ouvre en lecture pour un eventuel futur utilisateur "admin" access to * by dn.exact="cn=admin,dc=pedrono,dc=fr" write by * none
Droits sur les fichiers
ATTENTION à ce que les données appartiennent bien à ldap et non à root, sinon chown.
Démarrage du service
Mise en place de traces:
tail -f /var/log/messages &
Démarrage du service:
/etc/init.d/slapd start
Warning dans les logs:
[root@kjh openldap]# /etc/init.d/slapd start Vérification des fichiers de configuration pour slapd : [AVERTISSEMENT] bdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2). Expect poor performance for suffix "dc=my-domain,dc=com". config file testing succeeded Démarrage de slapd : [ OK ]
Ceci est du certainement à de la mise en cache de la part d'openldap sur les fichiers de conf initiaux (cf la référence à dc=my-domain,dc=com).
Tentative:
touch /var/lib/ldap/DB_MONITOR chown ldap: /var/lib/ldap/DB_MONITOR
touch /var/lib/ldap/DB_CONFIG chown ldap: /var/lib/ldap/DB_CONFIG
Pas d'amélioration après restart du service.
Solution: suppression des données du cache:
rm -rf /etc/openldap/cacerts/
Sans effet, autre solution:
rm -rf /var/lib/ldap/*
Après restart du service disparition du warning.
Vérification du démarrage:
[root@kjh openldap]# netstat -tpln ... tcp 0 0 0.0.0.0:389 0.0.0.0:* LISTEN 30083/slapd ...
[root@kjh openldap]# ps fax|grep ldap 30098 pts/1 S+ 0:00 | \_ grep --color=auto ldap 30083 ? Ssl 0:00 /usr/sbin/slapd -h ldap:/// -u ldap
Création d'un domaine
Choix d'un schéma
A moins de partir d'une requête précise sur un schéma précis, le challenge est de choisir un schéma afin d'y piocher nos objectClasses.
[root@kjh openldap]# grep organization /etc/openldap/schema/*|grep objectclass /etc/openldap/schema/core.schema:objectclass ( 2.5.6.4 NAME 'organization' /etc/openldap/schema/core.schema:objectclass ( 2.5.6.5 NAME 'organizationalUnit' /etc/openldap/schema/core.schema:objectclass ( 2.5.6.7 NAME 'organizationalPerson' /etc/openldap/schema/core.schema:objectclass ( 2.5.6.8 NAME 'organizationalRole'
On souhaite créer une organisation donc on peut utiliser l'objectClass "organisation" disponible dans core.schema.
A priori nécessité d'utiliser un objectClass dcObject.
En synthèse, pour tout annuaire à mettre en place, on utilisera une base commune, cf le fichier LDIF ci dessous.
Création du fichier LDIF de création de notre organisation
Création d'un fichier entries.ldif:
dn: dc=pedrono,dc=fr objectClass: dcObject objectClass: organization dc: pedrono o: Pedrono Org description: Organisation Pedrono.fr
Import de ce fichier LDIF via la commande slapadd (initialisation de notre nouvel annuaire/organisation. ATTENTION: ceci nécessite l'arrêt du service slapd).
ATTENTION: si on souhaite modifier ce LDIF après import dans OpenLDAP, nécessité de supprimer et de recréer notre dn/annuaire.
Il est possible de gérer des LDIF de modification de notre annuaire, et de les appliquer par ldapmodify.
ATTENTION: ceci implique:
- qu'il faut historiser ses fichiers LDIF
- idéalement qu'on va gérer un script pour réappliquer tous les LDIF dans le bon ordre en cas de besoin de re création de la structure de l'annuaire.
- NB: il est possible de gérer à la base un LDIF pour l'organisation, plusieurs LDIF pour les OU, etc.
A cette étape, simple tentative de stop puis start du service avant toute entrée du LDIF. On se retrouve avec le même problème qu'au moment du lancement initial:
[root@kjh ~]# /etc/init.d/slapd start Vérification des fichiers de configuration pour slapd : [AVERTISSEMENT] bdb_db_open: warning - no DB_CONFIG file found in directory /var/lib/ldap: (2). Expect poor performance for suffix "dc=my-domain,dc=com". config file testing succeeded Démarrage de slapd : [ OK ]
Tentative de résolution de ce warning:
[root@kjh ~]# /etc/init.d/slapd stop Arrêt de slapd : [ OK ] [root@kjh ~]# rm -rf /var/lib/ldap/* [root@kjh ~]# touch /var/lib/ldap/DB_CONFIG [root@kjh ~]# chown ldap: /var/lib/ldap/DB_CONFIG [root@kjh ~]# /etc/init.d/slapd start
On a donc résolu à nouveau ce problème de warning.
cf cette page de résolution du problème
ATTENTION: une partie des problèmes peut venir de selinux => désactivation de selinux:
vi /etc/selinux/config ... SELINUX=enforcing (à modifier en disabled) ...
+ redémarrage du système ou setenforce 0 pour désactivation pour la session en cours.
ATTENTION: il peut rester un contenu de paramétrage initial sur la conf par défaut dans /etc/openldap/splapd.d/ (cf l'étape suivante)
Tentative:
cp -r /etc/openldap/slapd.d/ /etc/openldap/slapd.d.SAVE/ rm -rf /etc/openldap/slapd.d/*
Import du LDIF
[root@kjh ~]# slapadd -f conf_ldap/organisation.ldif conf_ldap/organisation.ldif: line 2: unknown directive <dn:> outside backend info and database definitions. slapadd: bad configuration file! [root@kjh ~]#
Tentatives sans suivre la page web ci dessus: ATTENTION utilisation du mauvais switch pour la commande slapadd!!!
[root@kjh ~]# slapadd -l /root/conf_ldap/organisation.ldif bdb_monitor_db_open: monitoring disabled; configure monitor database to enable _#################### 100.00% eta none elapsed none fast! Closing DB...
A priori OK, warning sur le fait d'avoir mis en commentaire "database monitor" dans /etc/openldap/slapd.conf. Pas de réel problème, réactivation par suppression de la mise en commentaire et redémarrage du service.
[root@kjh ~]# /etc/init.d/slapd start ls: impossible d'accéder à /etc/openldap/slapd.d//cn=config/olcDatabase*.ldif: Aucun fichier ou dossier de ce type sed: can't read /etc/openldap/slapd.d//cn=config.ldif: No such file or directory Vérification des fichiers de configuration pour slapd : [AVERTISSEMENT] bdb_monitor_db_open: monitoring disabled; configure monitor database to enable config file testing succeeded Démarrage de slapd : [ OK ]
On remet donc en place l'ancien contenu de /etc/openldap/slapd.d.
[root@kjh ~]# /etc/init.d/slapd stop Arrêt de slapd : [ OK ] [root@kjh ~]# rm -rf /etc/openldap/slapd.d slapd.d/ slapd.d.SAVE/ [root@kjh ~]# rm -rf /etc/openldap/slapd.d [root@kjh ~]# mv /etc/openldap/slapd.d.SAVE/ /etc/openldap/slapd.d/ [root@kjh ~]# ls -la /etc/openldap/slapd.d/ total 16 drwx------. 3 root root 4096 14 déc. 17:21 . drwxr-xr-x. 4 root root 4096 14 déc. 17:24 .. drwx------. 3 root root 4096 14 déc. 17:21 cn=config -rw-------. 1 root root 986 14 déc. 17:21 cn=config.ldif [root@kjh ~]# /etc/init.d/slapd start /var/lib/ldap/objectClass.bdb is not owned by "ldap" [AVERTISSEMENT] Vérification des fichiers de configuration pour slapd : [ÉCHOUÉ] ldif_read_file: Permission denied for "/etc/openldap/slapd.d/cn=config.ldif" slaptest: bad configuration file!
A cette étape, problème car slapadd lancé en tant que root: les données de /var/lib/ldap appartiennent à root et non à ldap...
[root@kjh ~]# chown -R ldap: /etc/openldap/slapd.d/ [root@kjh ~]# /etc/init.d/slapd start /var/lib/ldap/objectClass.bdb is not owned by "ldap" [AVERTISSEMENT] Démarrage de slapd : [ OK ] [root@kjh ~]# chown ldap: /var/lib/ldap/* [root@kjh ~]# /etc/init.d/slapd restart Arrêt de slapd : [ OK ] Démarrage de slapd : [ OK ] [root@kjh ~]#
Vérification de l'import:
[root@kjh ~]# ldapsearch -x -b 'dc=pedrono,dc=fr' # extended LDIF # # LDAPv3 # base <dc=pedrono,dc=fr> with scope subtree # filter: (objectclass=*) # requesting: ALL # # search result search: 2 result: 32 No such object # numResponses: 1
Apparement l'import s'est mal passé.
Nouvelle tentative:
[root@kjh ~]# /etc/init.d/slapd stop Arrêt de slapd : [ OK ] [root@kjh ~]# slapadd -l /root/conf_ldap/organisation.ldif slapadd: line 1: database #1 (dc=my-domain,dc=com) not configured to hold "dc=pedrono,dc=fr"; no database configured for that naming context _#################### 100.00% eta none elapsed none fast! Closing DB...
Nouveau test:
[root@kjh ~]# rm /etc/openldap/slapd.d/cn\=config.ldif rm : supprimer fichier « /etc/openldap/slapd.d/cn=config.ldif » ? y [root@kjh ~]# slapadd -l /root/conf_ldap/organisation.ldif bdb_monitor_db_open: monitoring disabled; configure monitor database to enable => bdb_tool_entry_put: id2entry_add failed: DB_KEYEXIST: Key/data pair already exists (-30995) => bdb_tool_entry_put: txn_aborted! DB_KEYEXIST: Key/data pair already exists (-30995) slapadd: could not add entry dn="dc=pedrono,dc=fr" (line=1): txn_aborted! DB_KEYEXIST: Key/data pair already exists (-30995) _#################### 100.00% eta none elapsed none fast! Closing DB...
Cette fois slapadd nous indique qu'on a déjà créé la base et qu'on ne peut pas la recréer, il faut donc à nouveau supprimer le contenu de /var/lib/ldap:
[root@kjh ~]# rm -rf /var/lib/ldap/* [root@kjh ~]# touch /var/lib/ldap/DB_CONFIG [root@kjh ~]# chown ldap: /var/lib/ldap/DB_CONFIG [root@kjh ~]# slapadd -l /root/conf_ldap/organisation.ldif bdb_monitor_db_open: monitoring disabled; configure monitor database to enable _#################### 100.00% eta none elapsed none fast! Closing DB... [root@kjh ~]# /etc/init.d/slapd start /var/lib/ldap/__db.006 is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/__db.002 is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/dn2id.bdb is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/alock is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/id2entry.bdb is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/objectClass.bdb is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/__db.004 is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/__db.005 is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/log.0000000001 is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/__db.001 is not owned by "ldap" [AVERTISSEMENT] /var/lib/ldap/__db.003 is not owned by "ldap" [AVERTISSEMENT] sed: can't read /etc/openldap/slapd.d//cn=config.ldif: No such file or directory Vérification des fichiers de configuration pour slapd : [ÉCHOUÉ] bdb_db_open: database "dc=pedrono,dc=fr": alock package is unstable. backend_startup_one (type=bdb, suffix="dc=pedrono,dc=fr"): bi_db_open failed! (-1) slap_startup failed (test would succeed using the -u switch) d'anciens fichiers verroux peuvent être présents dans /var/[AVERTISSEMENT] [root@kjh ~]# chown ldap: /var/lib/ldap/* [root@kjh ~]# /etc/init.d/slapd start sed: can't read /etc/openldap/slapd.d//cn=config.ldif: No such file or directory Vérification des fichiers de configuration pour slapd : [AVERTISSEMENT] bdb_monitor_db_open: monitoring disabled; configure monitor database to enable config file testing succeeded Démarrage de slapd : [ OK ]
Nouveau ldapsearch:
[root@kjh ~]# ldapsearch -x -b "dc=pedrono,dc=fr" # extended LDIF # # LDAPv3 # base <dc=pedrono,dc=fr> with scope subtree # filter: (objectclass=*) # requesting: ALL # # search result search: 2 result: 32 No such object # numResponses: 1
ATTENTION: à cause de nos ACL pour l'instant seul le rootdn peut interroger en s'authentifiant...
Nouveau ldapsearch:
[root@kjh ~]# ldapsearch -x -b "dc=pedrono,dc=fr" -D "cn=Manager,dc=pedrono,dc=fr" -W Enter LDAP Password: # extended LDIF # # LDAPv3 # base <dc=pedrono,dc=fr> with scope subtree # filter: (objectclass=*) # requesting: ALL # # pedrono.fr dn: dc=pedrono,dc=fr objectClass: dcObject objectClass: organization dc: pedrono o: Pedrono Org description: Organisation Pedrono.fr # search result search: 2 result: 0 Success # numResponses: 2 # numEntries: 1
On a donc créé notre organisation avec les bonnes caractéristiques.
Création d'OU
On va créer 1 OU dans un nouveau fichier LDIF ou1.ldif:
dn: ou=utilisateurs,dc=pedrono,dc=fr objectClass: organizationalUnit ou: utilisateurs postalCode: 44000 description: Unite organisationnelle des utilisateurs de Pedrono Organisation
Import de ce fichier LDIF:
[root@kjh conf_ldap]# ldapadd -f ./ou1.ldif -D 'cn=Manager,dc=pedrono,dc=fr' -W Enter LDAP Password: adding new entry "ou=utilisateurs,dc=pedrono,dc=fr" [root@kjh conf_ldap]#
Test de l'import:
[root@kjh conf_ldap]# ldapsearch -x -b 'dc=pedrono,dc=fr' -D 'cn=Manager,dc=pedrono,dc=fr' -W Enter LDAP Password: # extended LDIF # # LDAPv3 # base <dc=pedrono,dc=fr> with scope subtree # filter: (objectclass=*) # requesting: ALL # # pedrono.fr dn: dc=pedrono,dc=fr objectClass: dcObject objectClass: organization dc: pedrono o: Pedrono Org description: Organisation Pedrono.fr # utilisateurs, pedrono.fr dn: ou=utilisateurs,dc=pedrono,dc=fr objectClass: organizationalUnit ou: utilisateurs postalCode: 44000 description: Unite organisationnelle des utilisateurs de Pedrono Organisation # search result search: 2 result: 0 Success # numResponses: 3 # numEntries: 2
On va donc créer 2 autres OU:
- une OU "groupes" dans ou2.ldif.
- une OU "peripheriques" dans ou3.ldif.
ou2.ldif:
dn: ou=groupes,dc=pedrono,dc=fr objectClass: organizationalUnit ou: groupes postalCode: 44000 description: Unite organisationnelle des groupes de Pedrono Organisation
ou3.ldif:
dn: ou=peripheriques,dc=pedrono,dc=fr objectClass: organizationalUnit ou: peripheriques postalCode: 44000 description: Unite organisationnelle des peripheriques de Pedrono Organisation
Import de ces nouvelles OU:
[root@kjh conf_ldap]# ldapadd -f ./ou2.ldif -D 'cn=Manager,dc=pedrono,dc=fr' -W Enter LDAP Password: adding new entry "ou=groupes,dc=pedrono,dc=fr"
[root@kjh conf_ldap]# ldapadd -f ./ou3.ldif -D 'cn=Manager,dc=pedrono,dc=fr' -W Enter LDAP Password: adding new entry "ou=peripheriques,dc=pedrono,dc=fr"
Vérification:
[root@kjh conf_ldap]# ldapsearch -x -b 'dc=pedrono,dc=fr' -D 'cn=Manager,dc=pedrono,dc=fr' -W Enter LDAP Password: # extended LDIF # # LDAPv3 # base <dc=pedrono,dc=fr> with scope subtree # filter: (objectclass=*) # requesting: ALL # # pedrono.fr dn: dc=pedrono,dc=fr objectClass: dcObject objectClass: organization dc: pedrono o: Pedrono Org description: Organisation Pedrono.fr # utilisateurs, pedrono.fr dn: ou=utilisateurs,dc=pedrono,dc=fr objectClass: organizationalUnit ou: utilisateurs postalCode: 44000 description: Unite organisationnelle des utilisateurs de Pedrono Organisation # groupes, pedrono.fr dn: ou=groupes,dc=pedrono,dc=fr objectClass: organizationalUnit ou: groupes postalCode: 44000 description: Unite organisationnelle des groupes de Pedrono Organisation # peripheriques, pedrono.fr dn: ou=peripheriques,dc=pedrono,dc=fr objectClass: organizationalUnit ou: peripheriques postalCode: 44000 description: Unite organisationnelle des peripheriques de Pedrono Organisation # search result search: 2 result: 0 Success # numResponses: 5 # numEntries: 4