Aller, on prend une grande respiration, un mug de thé / café, et c'est parti !


étape 1 : Avant d’installer les packages spécifiques à open ldap, nous allons mettre à jour les dépots apt et les packages deja installés sur la machine.

Pour cela 2 commandes : 

sudo apt-get update

et

sudo apt-get upgrade

Ceci étant fait, nous pouvons entrer dans le vif du sujet.

étape 2 : installation de slapd

Installons les packages slapd, ldap-utils et la base de données berkeley db utilisé par slapd.

slapd est OpenLDAP (c’est le nom du démon qui réalise la mise en oeuvre de l’annuaire ldap, ldap-utils contient comme son nom l’indique des tas d’utilitaire pour attaquer un annuaire ldap en ligne de commande ;p)

sudo apt-get install slapd ldap-utils

Nous allons maintenant créer un utilisateur et un group pour notre annuaire ldap :


étape 3 : création d’un utilisateur et d’un groupe pour le processus du serveur ldap

sudo addgroup --system slapd


sudo adduser slapd --home /var/lib/ldap -shell /bin/false --no-create-home -ingroup slapd --system


étape 4 : Configuration

Ceci étant fait, il faut maintenant mettre à jour le fichier /etc/default/slapd.

Ce fichier est utilisé par le script de démarrage du service slapd situé dans /etc/init.d/

# Default location of the slapd.conf file

SLAPD_CONF=/etc/ldap/slapd.conf

# System account to run the slapd server under. If empty the server

# will run as root.

SLAPD_USER="slapd"

# System group to run the slapd server under. If empty the server will

# run in the primary group of its user.

SLAPD_GROUP="slapd"

# Path to the pid file of the slapd server. If not set the init.d script

# will try to figure it out from $SLAPD_CONF (/etc/ldap/slapd.conf)

SLAPD_PIDFILE=

# Configure if the slurpd daemon should be started. Possible values:

# - yes:   Always start slurpd

# - no:    Never start slurpd

# - auto:  Start slurpd if a replica option is found in slapd.conf (default)

SLURPD_START=auto

# slapd normally serves ldap only on all TCP-ports 389. slapd can also

# service requests on TCP-port 636 (ldaps) and requests via unix

# sockets.

SLAPD_SERVICES="ldap://ldap.davidrobin.net:389/ ldaps://ldap.davidrobin.net:636/"

# Additional options to pass to slapd and slurpd

SLAPD_OPTIONS=""

SLURPD_OPTIONS=""

Bref un fichier pas vraiment compliqué qui permettra à slapd de s’executer sous les user / group créés précédemment.


Ensuite nous allons générer un mot de passe chiffré à mettre dans le fichier de conf qui va suivre (l’installeur lors de l’étape 2 l’insère directement dans le ldap, ce qui n’est pas pratique en cas de drop puis recreate de la base de l’annuaire).

La commande à utiliser est slappaswd

sudo slappasswd

qui donne un résultat du type 

$ sudo slappasswd

New password:

Re-enter password:

{SSHA}d2BamRTgBuhC6SxC0vFGWol31ki8iq5m

Nous pouvons maintenant éditer /etc/ldap/slapd.conf : 

# Global Directives:

# Features to permit

#allow bind_v2

# Schema and objectClass definitions

include         /etc/ldap/schema/core.schema

include         /etc/ldap/schema/cosine.schema

include         /etc/ldap/schema/nis.schema

include         /etc/ldap/schema/inetorgperson.schema

include         /etc/ldap/schema/misc.schema

include         /etc/ldap/schema/corba.schema

include         /etc/ldap/schema/openldap.schema

include         /etc/ldap/schema/java.schema

include         /etc/ldap/schema/ppolicy.schema

# Where the pid file is put. The init.d script

# will not stop the server if you change this.

pidfile         /var/run/slapd/slapd.pid

# List of arguments that were passed to the server

argsfile        /var/run/slapd/slapd.args

# Read slapd.conf(5) for possible values

loglevel        0

# Where the dynamically loaded modules are stored

modulepath      /usr/lib/ldap

moduleload      back_bdb

# The maximum number of entries that is returned for a search operation

sizelimit 500

# The tool-threads parameter sets the actual amount of cpu's that is used

# for indexing.

tool-threads 1

backend         bdb

checkpoint 512 30

#backend                <other>

database        bdb

# The base of your directory in database #1

suffix          "dc=davidrobin,dc=net"

# rootdn directive for specifying a superuser on the database. This is needed

# for syncrepl.

rootdn          "cn=admin,dc=davidrobin,dc=net"

rootpw          {SSHA}UT307hSsFU++B3UvefzqFVzVp3UlzkwJ

# Where the database file are physically stored for database #1

directory       "/var/lib/ldap"

# For the Debian package we use 2MB as default but be sure to update this

# value if you have plenty of RAM

dbconfig set_cachesize 0 2097152 0

# Sven Hartge reported that he had to set this value incredibly high

# to get slapd running at all. See http://bugs.debian.org/303057

# for more information.

# Number of objects that can be locked at the same time.

dbconfig set_lk_max_objects 1500

# Number of locks (both requested and granted)

dbconfig set_lk_max_locks 1500

# Number of lockers

dbconfig set_lk_max_lockers 1500

# Indexing options for database #1

index           objectClass eq

# Save the time that the entry gets modified, for database #1

lastmod         on

# Where to store the replica logs for database #1

# replogfile    /var/lib/ldap/replog

access to attrs=userPassword,shadowLastChange

        by dn="cn=admin,dc=davidrobin,dc=net" write

        by anonymous auth

        by self write

        by * none

access to dn.base="" by * read

# The admin dn has full write access, everyone else

# can read everything.

access to *

        by dn="cn=admin,dc=davidrobin,dc=net" write

        by * read

Les choses à repérer et modifier dans le fichier ci-dessus 

les inclusions de schema : pour tirer au maximum partie de votre annuaire ldap, il faut ajouter des schema,càd des fichiers qui en quelque sorte enrichissent ce que le serveur ldap peut stocker comme type d’information.

include         /etc/ldap/schema/core.schema

include         /etc/ldap/schema/cosine.schema

include         /etc/ldap/schema/nis.schema

include         /etc/ldap/schema/inetorgperson.schema

include         /etc/ldap/schema/misc.schema

include         /etc/ldap/schema/corba.schema

include         /etc/ldap/schema/openldap.schema

include         /etc/ldap/schema/java.schema

include         /etc/ldap/schema/ppolicy.schema

au lieu de 

include         /etc/ldap/schema/core.schema

include         /etc/ldap/schema/cosine.schema

include         /etc/ldap/schema/nis.schema

include         /etc/ldap/schema/inetorgperson.schema

L’autre passage de la conf à modifier est celui ou figure ces lignes : 

suffix          "dc=davidrobin,dc=net"

# rootdn directive for specifying a superuser on the database. This is needed

# for syncrepl.

rootdn          "cn=admin,dc=davidrobin,dc=net"

rootpw          {SSHA}UT307hSsFU++B3UvefzqFVzVp3UlzkwJ

Il faut décommenter rootdn et modifier le domaine (l’installeur de paquets en a sûrement mis un par défaut qui ne correspond pas à ce que vous voulez).

et ajouter la ligne rootpw avec le mot de passe issu de la commande slappasswd exécuté précédemment.

Le reste n’est pas très compliqué, il suffit de remplacer par votre domaine toutes les lignes du style

dc=davidrobin,dc=net

Après l’édition de ce fichier il faut donner les droits adéquats à l’utilisateur et au groupe slapd (à chaque fois que vous manipulerez en root des fichiers sous les répertoires listés dans la commande qui va suivre, penser à remettre les droits pour l’utilisateur slapd).

sudo chown -R slapd.slapd /etc/ldap /var/lib/ldap /var/lib/slapd /var/run/slapd /usr/sbin/slapd

et pour les droits 

sudo chmod -v 644 /etc/ldap/ldap.conf 


sudo chmod -v 600 /etc/ldap/slapd.conf


Nous allons initialiser proprement l’annuaire ldap avec une branche pour les personnes et une branche pour les groupes par exemple.

Tout d’abord, il faut stopper l’annuaire :

sudo /etc/init.d/slapd stop

Et purger la base créé par l’installeur des paquets slapd

sudo rm -rf /var/lib/ldap/*

Pour initialiser l’annuaire nous allons utiliser la commande slapadd et un fichier ldiff.

Pour en savoir plus sur le format de fichier ldiff et sur les termes de ce tutorial que vous auriez trouvés un peu barbares, je vous suggère vivement le livre sur ldap chez O’Reilly ;)

En attendant voici donc le fichier ldiff utilisé : 

## Build the root node.

dn: dc=davidrobin,dc=net

dc: davidrobin

objectClass: dcObject

objectClass: organizationalUnit

ou: davidrobin.net

## Build the people ou.

dn: ou=people,dc=davidrobin,dc=net

objectClass: organizationalUnit

ou: people

## Build the groups ou.

dn: ou=groups,dc=davidrobin,dc=net

objectClass: organizationalUnit

ou: groups


On l’ajoute avec :

sudo slapadd -v -l initAnnuaire.ldiff

Ce qui produit  :

/etc/ldap/slapd.conf: line 100: rootdn is always granted unlimited privileges.

/etc/ldap/slapd.conf: line 117: rootdn is always granted unlimited privileges.

added: "dc=davidrobin,dc=net" (00000001)

added: "ou=people,dc=davidrobin,dc=net" (00000002)

added: "ou=groups,dc=davidrobin,dc=net" (00000003)

Ne pas oubliez de bien repositionner les permissions pour l’utilisateur slapd :

sudo chown -R slapd.slapd /var/lib/ldap

Et enfin on y est, il ne reste plus qu’à démarrer le serveur avec :

sudo /etc/init.d/slapd start

Pour tester l’accès au serveur ldap, en supposant que votre domaine est bien configuré chez votre registrar (cf un de mes posts précédent) depuis un terminal vous pouvez taper : 


ldapsearch -H ldap://ldap.davidrobin.net:389 -x -b "dc=davidrobin,dc=net" "(objectclass=*)"


Et cela devrait vous produire un résultat du type :


# extended LDIF

#

# LDAPv3

# base <dc=davidrobin,dc=net> with scope subtree

# filter: (objectclass=*)

# requesting: ALL

#

# davidrobin.net

dn: dc=davidrobin,dc=net

dc: davidrobin

objectClass: dcObject

objectClass: organizationalUnit

ou: davidrobin.net

# people, davidrobin.net

dn: ou=people,dc=davidrobin,dc=net

objectClass: organizationalUnit

ou: people

# groups, davidrobin.net

dn: ou=groups,dc=davidrobin,dc=net

objectClass: organizationalUnit

ou: groups

# search result

search: 2

result: 0 Success

# numResponses: 4

# numEntries: 3



Dans un prochain post nous verrons comment compléter cette configuration pour attaquer le ldap de façon sécurisée avec openssl ;)