OpenLDAP Installation

De EjnTricks

Cette article présente l'installation de OpenLDAP sur un serveur Ubuntu. Celle ci a été réalisé en suivant plusieurs tutoriaux après plusieurs recherches, mais n'ayant jamais fournis une procédure valide de bout en bout.

Hand-icon.png Votre avis

Current user rating: 87/100 (16 votes)

 You need to enable JavaScript to vote


System-Install-icon.png Installation

L'installation du serveur s'effectue en une ligne de commande. Les deux paquets slapd et ldap-utils sont installés. Le deuxième apporte un ensemble d'utilitaires afin de manipuler les données dans l'annuaire LDAP.

#sudo apt-get install slapd ldap-utils

Lors de l'installation, une première intervention est nécessaire afin de saisir le mot de passe de l'administrateur.


Cette saisie doit être confirmée sur l'étape suivante.


Le serveur OpenLDAP est alors installé et disponible. Il est ensuite nécessaire de le configurer. Par défaut, les paramétrages se situent dans le répertoire /etc/ldap.


Configuration-icon.png Configuration

Fichier de configuration

Dans la documentation officielle française sur Ubuntu, la création du fichier /etc/ldap/ldap.conf est mentionnée pour les version supérieure ou égale à Intrepid Ibex. Etant dans ce cadre, le fichier est donc mis en place avec le contenu:

ldap_version 3
URI ldap://localhost:389
SIZELIMIT 0
TIMELIMIT 0
DEREF never
BASE dc=ejnserver,dc=fr

Il faut modifier la valeur de BASE pour refléter la racine de l'annuaire.

Icon-database-process.png Import de schéma

La procédure d'installation mentionne l'importation des trois schémas suivants:

  • cosine.schema
  • nis.schema
  • inetorgperson.schema

Les fichiers ldif sont mis à disposition dans le répertoire /etc/ldap/schema lors de l'installation avec apt-get, sous les noms:

  • cosine.ldif
  • nis.ldif
  • inetorgperson.ldif

Cependant leur injection, à l'aide de l'outil ldapadd, sur une installation fraîche entraîne l'affichage de message d'erreur. Par conséquent, cette étape ne doit pas être réalisée.

En effet, ceux-ci sont déjà mis en place après l'installation. Le répertoire /etc/ldap/slapd.d/cn=config/cn=schema contient déjà les fichiers ldif.

#sudo ll /etc/ldap/slapd.d/cn=config/cn=schema
total 48
drwxr-x--- 2 openldap openldap  4096 2012-04-23 00:06 ./
drwxr-x--- 4 openldap openldap  4096 2012-04-23 01:09 ../
-rw------- 1 openldap openldap 15456 2012-04-23 00:06 cn={0}core.ldif
-rw------- 1 openldap openldap 11290 2012-04-23 00:06 cn={1}cosine.ldif
-rw------- 1 openldap openldap  6420 2012-04-23 00:06 cn={2}nis.ldif
-rw------- 1 openldap openldap  2784 2012-04-23 00:06 cn={3}inetorgperson.ldif

Icon-database-delete.png Suppression base par défaut

Comme pour les schéma, une base vierge est mise à disposition. Or celle-ci risque d'entraîner des erreurs, qu'il est possible d'observer au niveau de la log système /var/log/syslog.

Apr 21 09:04:07  slapd[1096]: last message repeated 3 times
Apr 21 09:04:07 etienne-server slapd[1096]: bdb(dc=nodomain): PANIC: fatal region error detected; run recovery
Apr 21 09:09:01 etienne-server CRON[31668]: (root) CMD (  [ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find
/var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \;
-delete)

Le serveur LDAP continuera de fonctionner, mais il est toujours inquiétant de voir un message de panique dans les fichiers de log. Les fichiers pour les bases se situent dans le répertoire /etc/ldap/slapd.d/cn=config dont le contenu est initialement:

#sudo ll /etc/ldap/slapd.d/cn=config
total 36
drwxr-x--- 3 openldap openldap 4096 2012-04-21 21:55 ./
drwxr-xr-x 3 openldap openldap 4096 2012-04-21 21:55 ../
-rw------- 1 openldap openldap  365 2012-04-21 21:55 cn=module{0}.ldif
drwxr-x--- 2 openldap openldap 4096 2012-04-21 21:55 cn=schema/
-rw------- 1 openldap openldap  307 2012-04-21 21:55 cn=schema.ldif
-rw------- 1 openldap openldap  325 2012-04-21 21:55 olcBackend={0}hdb.ldif
-rw------- 1 openldap openldap  442 2012-04-21 21:55 olcDatabase={0}config.ldif
-rw------- 1 openldap openldap  586 2012-04-21 21:55 olcDatabase={-1}frontend.ldif
-rw------- 1 openldap openldap  976 2012-04-21 21:55 olcDatabase={1}hdb.ldif

Comme la base va être créée from scratch, il est préférable de supprimer le fichier de configuration de la base par défaut, après avoir arrêté le service.

#sudo service slapd stop
 * Stopping OpenLDAP slapd                                                                                         [ OK ]
#sudo rm /etc/ldap/slapd.d/cn\=config/olcDatabase\=\{1\}hdb.ldif

Attention, il faut penser à purger les fichiers de cette base par défaut. Dans le fichier olcDatabase={1}hdb.ldif, il y a la configuration du paramètre olcDbDirectory avec la valeur /var/lib/ldap.

#sudo rm /var/lib/ldap/*

Si cela n'est pas effectué, il peut se produire des erreurs lors de la mise à jour de Ubuntu, donnant le message d'erreur suivant:

Construction de l'arbre des dépendances
Lecture des informations d'état... Fait
0 mis à jour, 0 nouvellement installés, 0 à enlever et 0 non mis à jour.
1 partiellement installés ou enlevés.
Après cette opération, 0 o d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer [O/n] ? O
Paramétrage de slapd (2.4.28-1.1ubuntu4) ...
  Backing up /etc/ldap/slapd.d in /var/backups/slapd-2.4.25-1.1ubuntu4.1... done.
  Moving old database directories to /var/backups:
  Loading from /var/backups/slapd-2.4.25-1.1ubuntu4.1:
  - directory dc=ejnserver,dc=fr... failed.

Loading the database from the LDIF dump failed with the following
error while running slapadd:
    slapadd: line 1: database #1 (dc=ejnserver,dc=fr) not configured to hold "dc=nodomain"; no database configured for that naming context
dpkg : erreur de traitement de slapd (--configure) :
 le sous-processus script post-installation installé a retourné une erreur de sortie d'état 1
Des erreurs ont été rencontrées pendant l'exécution :
 slapd
E: Sub-process /usr/bin/dpkg returned an error code (1)

En effet, les fichiers n'ayant pas été supprimé, la référence sur dc=nodomain est restée active dans les fichiers. Le seul moyen pour pour restaurer l'erreur a été de refaire l'installation de OpenLDAP, ce qui est assez fastidieux lorsque la base est importante.

Icon-database-init.png Création d'un annuaire

L'étape suivante consiste à créer un nouvel annuaire en spécifiant un administrateur. Comme pour les schémas, ceci s'effectue par injection d'un fichier ldif, avec le service slapd démarré. Il faut donc s'assurer que celui-ci est up:

#sudo service slapd status
* slapd is running

Si ce n'est pas le cas, il faut le démarrer:

#sudo service slapd start
* Starting OpenLDAP slapd                      [ OK ]

Dans le cadre de cette installation, l'emplacement root souhaité est ejnserver.fr. Il est donc important de prêter une attention aux paramètres:

  • olcSuffix
  • olcRootDN
  • olcAccess

Le compte administrateur créé par ce script est:

  • cn=admin,dc=ejnserver,dc=fr

Avec le mot de passe PASSWORD_ADMIN. Il est possible de crypter ce mot de passe avec l'outil slappasswd, mais cela n'a pas été utilisé ici.

Le mot de passe de ce dernier est configuré au niveau du paramètre:

  • olcRootPW

Le contenu du fichier ldif, nommé database.ldif est donc le suivant:

# Load dynamic backend modules
dn: cn=module,cn=config
objectClass: olcModuleList
cn: module
olcModulepath: /usr/lib/ldap
olcModuleload: back_hdb.la
 
# Database settings
dn: olcDatabase=hdb,cn=configobjectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=ejnserver,dc=frolcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=ejnserver,dc=frolcRootPW: PASSWORD_ADMINolcDbConfig: set_cachesize 0 2097152 0
olcDbConfig: set_lk_max_objects 1500
olcDbConfig: set_lk_max_locks 1500
olcDbConfig: set_lk_max_lockers 1500
olcDbIndex: objectClass eq
olcLastMod: TRUE
olcDbCheckpoint: 512 30
olcAccess: to attrs=userPassword by dn="cn=admin,dc=ejnserver,dc=fr" write by anonymous auth by self write by * noneolcAccess: to attrs=shadowLastChange by self write by * read
olcAccess: to dn.base="" by * read
olcAccess: to * by dn="cn=admin,dc=ejnserver,dc=fr" write by * read

Attention: Le fichier doit se terminer par une ligne vide, et penser à remplacer la valeur PASSWORD_ADMIN. Et il ne faut absolument pas mettre des espaces entre les lignes de chacun des blocs. Lors de la première installation, cette erreur a été faite juste avant la déclaration des droits d'accès. Il était impossible de valider les informations de connexion des comptes déclarés dans l'annuaire.

Attention bis, le caractère de fin de ligne est très important. Par exemple, le fichier mentionné ci dessus a été généré à partir d'une poste en Windows, puis transféré sous le serveur Ubuntu via FTP. Cependant à la première exécution, des messages d'erreur ont été affichés:

#sudo ldapadd -Y EXTERNAL -H ldapi:/// -f database.ldif
SASL/EXTERNAL authentication started
SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
SASL SSF: 0
ldapadd: attributeDescription "dn": (possible missing newline after line 7, entry "cn=module,cn=config"?)
adding new entry "cn=module,cn=config"
ldap_add: Undefined attribute type (17)
        additional info: dn: attribute type undefined

Par contre, après avoir éditer le fichier avec VI, mis à jour les fins de ligne, l'exécution s'est déroulée correctement.


Le premier bloc permet de modifier la configuration général en ajoutant le module backend. Le second bloc concerne la création à proprement parlé de la base, disponible sous le "nom" {1}hdb, et dont les fichiers se trouveront dans le répertoire /var/lib/ldap. Il est donc nécessaire que le compte d'exécution du service ait les droits d'accès à ces fichiers.

#sudo chown -R openldap:openldap /var/lib/ldap

Les directives olcAccess permettent de mettre en place les droits d'accès aux informations dans la base.

Compte Information Droit d'accès Description
to attrs=userPassword by dn="cn=admin,dc=ejnserver,dc=fr" write by anonymous auth by self write by * none
cn=admin,dc=ejnserver,dc=fr userPassword write Permet à l'administrateur de modifier la valeur de la propriété userPassword de tous les comptes. Ce qui sera utilisé pour la gestion des comptes.
anonymous userPassword auth Non disponible, il faut être connecté.
self userPassword write Un compte peut modifier son propre mot de passe.
* userPassword none Personne ne peut visualiser la propriété userPassword. Ainsi un utilisateur, sauf le compte administrateur, ne peut visualiser le mot de passe des autres comptes.
to attrs=shadowLastChange by self write by * read
self shadowLastChange write Un compte peut modifier la propriété shadowLastChange sur lui même.
* shadowLastChange read Les comptes peuvent visualiser la propriété shadowLastChange des autres comptes.
to dn.base="" by * read
* dn.base="" read Tous les comptes peuvent visualiser la base.
to * by dn="cn=admin,dc=ejnserver,dc=fr" write by * read
cn=admin,dc=ejnserver,dc=fr * write Le compte administrateur peut modifier toutes les informations.
* * read Tous les comptes peuvent visualiser toutes les informations, à l'exception des restrictions mises en place explicitement comme sur userPassword.

La directive olcDbIndex: objectClass eq permet de créer un index sur la propriété objectClass dans la base. Cet index est assez important car les recherches sont généralement réalisées avec un filtre sur cette valeur. Des indexes pourront être ajoutés par la suite comme d'écrit dans l'article OpenLDAP Indexation.

La commande suivante est exécutée pour injecter ce script:

#sudo ldapadd -Y EXTERNAL -H ldapi:/// -f database.ldif

La trace d'exécution présente le résultat suivant:

Plugin-icon.png Installation d'overlays

L'annuaire OpenLDAP peut être étendue grâce à l'utilisation d'Overlays. Ce chapitre présente ceux déjà installés et comment les installer. De nombreux exemples, explications, sont disponibles sur internet. Mais ils se basent généralement sur la modification d'un fichier slapd.conf. Or l'installation faite sur Ubuntu ne prends pas ce mode de configuration en compte, mais celui s'appuyant sur les cn=config, dont les fichiers se trouvent sous /etc/ldap/slapd.d.

#cd /etc/ldap/slapd.d
#sudo find . | sed 's/[^/]*\//|   /g;s/| *\([^| ]\)/+--- \1/'
.
+--- cn=config.ldif
+--- cn=config
|   +--- cn=schema
|   |   +--- cn={2}nis.ldif
|   |   +--- cn={0}core.ldif
|   |   +--- cn={3}inetorgperson.ldif
|   |   +--- cn={1}cosine.ldif
|   +--- cn=module{1}.ldif
|   +--- olcDatabase={1}hdb
|   |   +--- olcOverlay={0}memberof.ldif
|   +--- olcDatabase={-1}frontend.ldif
|   +--- olcBackend={0}hdb.ldif
|   +--- cn=module{0}.ldif
|   +--- olcDatabase={2}hdb.ldif
|   +--- olcDatabase={1}hdb.ldif
|   +--- cn=schema.ldif
|   +--- olcDatabase={0}config.ldif

Overlay memberOf

Cet overlay permet de rajouter un attribut memberOf dans le quel est contenu le dn complet des groupes auquel appartient l'objet. Ceci put être très utile lors que l'on veut rechercher tous les membres d'un groupe, ou bien pour mettre en place des filtres dans les configurations LDAP des produits. La mise en place de celui est très bien détaillé, mais pour une configuration s'appuyant sur le fichier slapd.conf. Pour le mode de configuration s'appuyant sur les cn=config, cela est beaucoup plus difficile à trouver. Finalement, une explication assez simple à été trouvée à l'URL http://blog.dimaj.net/2010/07/howto-verify-that-a-member-is-part-of-a-secondary-group-in-openldap/. Cependant de nombreuses difficultés ont tout de même été rencontrées et il faut faire bien attention aux modifications apportées.

L'activation de l'overlay s'effectue par l'injection d'un fichier ldif avec la commande ldapadd. Le contenu du fichier, dans le cadre de cet article memberOfOverlayInstall.ldif, est:

dn: cn=module{1},cn=config
changetype: modify
add: olcModuleLoad
olcModuleLoad: memberof.la

L'installation s'effectue par la commande suivante:

#sudo ldapadd -Y EXTERNAL -H ldapi:/// -f memberOfOverlayInstall.ldif

A noter la valeur du dn sur lequel est appliqué l'overlay. La modification s'effectue sur cn=module{1},cn=config qui a été créé lors de la création de la base. Si cet overlay est appliqué sur cn=module{0},cn=config, la propriété sera disponible mais le déclenchement ne s'effectuera pas.

L'injection entraîne la modification du fichier /etc/ldap/slapd.d/cn=config/cn=module{1}.ldif dont le contenu devient:

dn: cn=module{1}
objectClass: olcModuleList
cn: module{1}
olcModulePath: /usr/lib/ldap
olcModuleLoad: {0}back_hdb.la
olcModuleLoad: {1}memberof.lastructuralObjectClass: olcModuleList
entryUUID: 50522852-2113-1031-8a78-870dd4356727
creatorsName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
createTimestamp: 20120422220736Z
entryCSN: 20120422220747.638684Z#000000#000#000000
modifiersName: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth
modifyTimestamp: 20120422220747Z

A ce stade, la configuration prend en compte le chargement du nouveau module. Il faut ensuite le référencer au niveau de l'annuaire à l'aide de la commande ldapadd avec un fichier, dans le cadre de cet article memberOfOverlay.ldif, dont le contenu est:

dn: olcOverlay=memberof,olcDatabase={1}hdb,cn=config
changetype: add
objectClass: olcOverlayConfig
objectClass: olcMemberOf
olcOverlay: {0}memberof

L'installation s'effectue par la commande suivante:

#sudo ldapadd -Y EXTERNAL -H ldapi:/// -f memberOfOverlay.ldif

A noter la valeur du dn qui reprend l'identifiant de la base.

Afin que cela soit pris en compte, le redémarrage du service slapd est nécessaire.

#sudo service slapd restart

Icon-database.png Peuplement

Home icon.png Création d'une organisation

Afin d'organiser l'annuaire, il faut créer une organisation "root", déclarée lors de la création de l'annuaire, avec un administrateur. L'objectif principal de cette installation était de pouvoir déclarer des comptes utilisateurs avec des groupes d'appartenance, afin de modéliser les droits d'accès aux applications utilisées.

  • La racine est créée avec le dn: dc=ejnserver,dc=fr.
  • Le compte administrateur est admin, identifié par le dn : cn=admin,dc=ejnserver,dc=fr.
  • Un noeud pour organiser les groupes d'utilisateur, identifié par le dn : ou=groups,dc=ejnserver,dc=fr
  • Un noeud pour organiser les utilisateurs, identifié par le dn : ou=people,dc=ejnserver,dc=fr

Le contenu suivant est placé dans le fichier init.ldif, peut importe le nom du fichier.

# Create top-level object in domain
dn: dc=ejnserver,dc=fr
objectClass: top
objectClass: dcObject
objectclass: organization
o: Server Organization
dc: EJNServer
description: LDAP pour le server 
 
# Admin user.
dn: cn=admin,dc=ejnserver,dc=fr
objectClass: simpleSecurityObject
objectClass: organizationalRole
cn: admin
description: LDAP administrator
userPassword: PASSWORD_ADMIN
 
# Organization for peoples
dn: ou=people,dc=ejnserver,dc=fr
objectClass: organizationalUnit
ou: people
 
# Organization for groups
dn: ou=groups,dc=ejnserver,dc=fr
objectClass: organizationalUnit
ou: groups

Attention: Le fichier doit se terminer par une ligne vide, et penser à remplacer la valeur PASSWORD_ADMIN.

L'injection s'effectue toujours avec l'utilitaire ldapadd, mais cette fois-ci en indiquant le compte administrateur via l'argument -D.

#sudo ldapadd -x -D cn=admin,dc=ejnserver,dc=fr -W -f init.ldif

Contrairement au fois précédente, l'exécution va exiger la saisie du mot de passe, car le script est injecté avec le compte cn=admin,dc=ejnserver,dc=fr.

User-group-icon.png Premiers groupes et utilisateurs

Le script suivant va permettre de rajouter un groupe wiki et un utilisateur etienne. Les classes appliquées aux objets sont:

  • Groupe
    • posixGroup : Pour interagir avec le serveur linux
  • Utilisateur
    • inetOrgPerson : Pour définir les propriétés d'une personne
    • posixAccount : Pour interagir avec le serveur linux
    • shadowAccount : Pour définir un mot de passe

Le contenu suivant est placé dans le fichier usergroup.ldif, peut importe le nom du fichier.

dn: uid=etienne,ou=people,dc=ejnserver,dc=fr
objectClass: inetOrgPerson
objectClass: posixAccount
objectClass: shadowAccount
uid: etienne
sn: Jouvin
givenName: Etienne
cn: Etienne Jouvin
displayName: Etienne Jouvin
uidNumber: 1000
gidNumber: 10000
userPassword: PASSWORD_ETIENNE
gecos: Etienne Jouvin
loginShell: /bin/bash
homeDirectory: /home/etienne
shadowExpire: -1
shadowFlag: 0
shadowWarning: 7
shadowMin: 8
shadowMax: 999999
shadowLastChange: 10877
mail: ejouvin@amexio.com
title: System Administrator
initials: EJN
 
dn: cn=wiki,ou=groups,dc=ejnserver,dc=fr
objectClass: posixGroup
cn: wiki
gidNumber: 10000

L'injection s'effectue à l'aide de la ligne de commande suivante:

#sudo ldapadd -x -D cn=admin,dc=ejnserver,dc=fr -W -f usergroup.ldif

Afin de s'assurer que l'utilisateur a bien été créé, il est possible d'effectuer une recherche dans l'annuaire à l'aide de l'outil ldapsearch

ldapsearch -xLLL -b "dc=ejnserver,dc=fr" uid=etienne sn givenName cn

Produisant le résultat suivant:

dn: uid=etienne,ou=people,dc=ejnserver,dc=fr
sn: Jouvin
givenName: Etienne
cn: Etienne Jouvin


Voir aussi

Documentation officielle: https://help.ubuntu.com/11.04/serverguide/C/openldap-server.html

http://doc.ubuntu-fr.org/slapd