OpenLDAP Installation
Cet 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.
Votre avis
Current user rating: 85/100 (25 votes)
|
|
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
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.
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.
#sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/cosine.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=cosine,cn=schema,cn=config" ldap_add: Other (e.g., implementation specific) error (80) additional info: olcAttributeTypes: Duplicate attributeType: "0.9.2342.19200300.100.1.2" #sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/nis.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=nis,cn=schema,cn=config" ldap_add: Other (e.g., implementation specific) error (80) additional info: olcAttributeTypes: Duplicate attributeType: "1.3.6.1.1.1.1.2" #sudo ldapadd -Y EXTERNAL -H ldapi:/// -f /etc/ldap/schema/inetorgperson.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "cn=inetorgperson,cn=schema,cn=config" ldap_add: Other (e.g., implementation specific) error (80) additional info: olcAttributeTypes: Duplicate attributeType: "2.16.840.1.113730.3.1.1"
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
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.
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=config
objectClass: olcDatabaseConfig
objectClass: olcHdbConfig
olcDatabase: {1}hdb
olcSuffix: dc=ejnserver,dc=fr
olcDbDirectory: /var/lib/ldap
olcRootDN: cn=admin,dc=ejnserver,dc=fr
olcRootPW: PASSWORD_ADMIN
olcDbConfig: 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 * none
olcAccess: 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:
#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 adding new entry "cn=module,cn=config" adding new entry "olcDatabase=hdb,cn=config"
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 lequel est contenu le dn
complet des groupes auquel appartient l'objet. Ceci peut ê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
#sudo ldapadd -Y EXTERNAL -H ldapi:/// -f memberOfOverlayInstall.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 modifying entry "cn=module{1},cn=config"
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.la
structuralObjectClass: 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.
#sudo ldapadd -Y EXTERNAL -H ldapi:/// -f memberOfOverlay.ldif SASL/EXTERNAL authentication started SASL username: gidNumber=0+uidNumber=0,cn=peercred,cn=external,cn=auth SASL SSF: 0 adding new entry "olcOverlay=memberof,olcDatabase={1}hdb,cn=config"
Afin que cela soit pris en compte, le redémarrage du service slapd
est nécessaire.
#sudo service slapd restart
Peuplement
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
, peu 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 aux fois précédentes, 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
.
#sudo ldapadd -x -D cn=admin,dc=ejnserver,dc=fr -W -f init.ldif Enter LDAP Password: adding new entry "dc=ejnserver,dc=fr" adding new entry "cn=admin,dc=ejnserver,dc=fr" adding new entry "ou=people,dc=ejnserver,dc=fr" adding new entry "ou=groups,dc=ejnserver,dc=fr"
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
#sudo ldapadd -x -D cn=admin,dc=ejnserver,dc=fr -W -f usergroup.ldif Enter LDAP Password: adding new entry "uid=etienne,ou=people,dc=ejnserver,dc=fr" adding new entry "cn=wiki,ou=groups,dc=ejnserver,dc=fr"
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