Mettez un manchot dans votre PC
Dernière modification 3 février 2017
Si on rentre dans les détails, le protocole
LDAP est du type client serveur, le serveur contient la base de
données, et le client consulte la base de données, le protocole fournit
les bases pour cette communication entre la client et le serveur
(normalisée par l'IETF par la RFC2251), et les commandes nécessaires au
client pour rechercher, créer, modifier ou effacer des données. LDAP est
bien entendu sécurisé pour le transfert et l'accès aux des données, avec
des outils de cryptage comme SSL et d'authentification.
Par ailleurs LDAP fournit des outils pour que les serveurs LDAP
puissent communiquer entre eux, on a ainsi la possibilité de créer des
serveurs miroirs qui pourront se synchroniser, ou de relier simplement les
serveurs entre eux, les serveurs redirigeant automatiquement les requêtes
qui ne les concernent pas.
Les exemples d'applications de LDAP
sont nombreux:
- bases de données d'employés,
- bases de données de produits,
- bases de données pour certaines applis, exemple :
* toutes les infos contenant
les utilisateurs de votre réseau (mot de passe, shell, homedirectory, ...)
peuvent être dans la base, on a ainsi beaucoup plus de possibilités qu'un
simple fichier /etc/passwd, l'authentification peut donc utiliser
LDAP plutôt que passwd ou shadow ou encore NIS.
Vos utilisateurs pourront ainsi changer leur mot de passe et certains de
leurs attributs à partir d'une interface web.
* les préférences d'applis ou
d'environnement (netscape, environnement graphique KDE, ...) sont
sauvegardés dans la base, ainsi l'utilisateur peut passer d'une machine à
une autre et retrouver ses préférences.
Cette page est une introduction à LDAP elle ne couvre pas certains aspects comme les liens avec d'autres bases (duplication, miroir, ...), la sécurité (access control, SSL, ...). Elle n'a seulement pour but de mettre en place un serveur LDAP simplement configuré pour que vous puissiez faie vos "premières armes" dans le domaine. Pour plus d'info reportez vous à l'excellente page de Laurent Mirtain .
Pour utiliser une base LDAP à partir de script PHP, voir ma page Apache .
Le principe est donc le même qu'en C++, on retrouve une structure arborescente, avec à la racine la classe top, toutes les autres classes d'objet dérivent de cette classe générique, chaque classe hérite des propriétés d'une classe père et possède des attributs supplémentaires par rapport à ce dernier.
rpm -qa | grep -i ldap
On supprime du système les packages contenus dans la liste avec la
commande rpm -e nom-du-package (sauf libldap2 qui
sert pour de nombreux packages).
Si pour des histoires de dépendance vous n'arrivez pas à tout supprimer ce
n'est pas bien grave car par défaut le tarball et les packages ne placent
pas les fichiers au même endroit. Lors du lancement du daemon et des
exécutables il faut juste faire attention d'appeler le bon exécutable
(servez vous de la commande which nom-exe ).
L'archive à récupérer est openldap-2.4.44.tgz qu'on décompressera en tapant :
tar xvfz openldap-2.4.44.tgz
Cela va nous créer un répertoire openldap-2.4.44. Avant d'aller
plus loin il faudra installer (commande urpmi nom-package ) les
packages suivants
lib64db5.3-devel
gnutls-devel
lib64sasl2-devel
lib64nss-devel
Puis on tape successivement :
./configure
make
On peut tester maintenant que tout marche bien en tapant :
cd tests
make
pour installer les binaires de ldap on tapera, en tant que root :
cd ..
make install
Les binaires sont installés par défaut dans /usr/local/sbin et /usr/local/libexec, les fichiers de config dans /usr/local/etc/openldap et les bases dans /usr/local/var/openldap-data. Les biblio vont se trouver sous /usr/local/lib, si ce n'est pas fait, rajouter ce chemin à la fin du fichier /etc/ld.so.conf et tapez
ldconfig
pour changer l'emplacement de tous ces fichiers taper:
configure -help
objectclass ( 2.5.6.6 NAME 'person'
DESC 'RFC2256: a person'
SUP top STRUCTURAL
MUST ( sn $ cn )
MAY ( userPassword $
telephoneNumber $ seeAlso $ description ) )
MUST correspond au attributs obligatoires et MAY à ceux
facultatifs
objectClass est le nom de la classe qui descend elle même de la
classe top
sn correspond à surname (nom)
cn correspond à common name (prénom nom)
Je vous laisse déviner la signification des autres attributs.
On voit qu'il est nécessaire de fournir les attributs sn (surname) et cn (common name), sont facultatifs le mot de passe (userPassword), le numéro de téléphone (telephoneNumber ), les liens (seeAlso) et la description.
Les attributs sont définis dans le même fichier, la syntaxe est la suivante pour telephoneNumber par exemple :
attributetype ( 2.5.4.20 NAME 'telephoneNumber'
DESC 'RFC2256: Telephone
Number'
EQUALITY
telephoneNumberMatch
SUBSTR
telephoneNumberSubstringsMatch
SYNTAX
1.3.6.1.4.1.1466.115.121.1.50{32} )
Je vous présenterai la syntaxe plus tard, on peut dans un premier temps se limiter aux attributs disponibles. Pour créer une classe d'objet breizhPerson dérivant de person, disposant de l'attribut obligatoire title en plus et des arguments facultatifs ou (groupe de travail) et l (localistation). On tapera dans le fichier core.schema juste après la définition de la classe person
objectclass ( 2.5.6.6.2 NAME 'breizhPerson' SUP person STRUCTURAL
MUST ( title )
MAY ( ou $ l ) )
# $OpenLDAP: pkg/ldap/servers/slapd/slapd.conf,v 1.8.8.4 2000/08/26
17:06:18
#
# See slapd.conf(5) for details on configuration options.
# This file should NOT be world readable.
#
include
/usr/local/etc/openldap/schema/core.schema
include
/usr/local/etc/openldap/schema/cosine.schema
include /usr/local/etc/openldap/schema/inetorgperson.schema
include /usr/local/etc/openldap/schema/nis.schema
# Define global ACLs to disable default read access.
# Do not enable referrals until AFTER you have a working directory
# service AND an understanding of referrals.
#referral ldap://root.openldap.org
# le chemin est différent avec une install avec package
pidfile /usr/local/var/slapd.pid
argsfile /usr/local/var/slapd.args
# Load dynamic backend modules:
# modulepath /usr/local/libexec/openldap
# moduleload back_ldap.la
# moduleload back_ldbm.la
# moduleload back_passwd.la
# moduleload back_shell.la
# slapd est bavard, pour le limiter aux
messages critiques on mettre none
loglevel none
# Sample security restrictions
# Require integrity protection
(prevent hijacking)
# Require 112-bit (3DES or better)
encryption for updates
# Require 63-bit encryption for
simple bind
# security ssf=1 update_ssf=112 simple_bind=64
#######################################################################
# database definitions
#######################################################################
database bdb
suffix
"dc=kervao,dc=fr"
rootdn
"cn=Manager,dc=kervao,dc=fr"
#mot de passe en clair, on verra plus loin comment le crypter
rootpw secret
# là où va se trouver la base ldap /var/lib/ldap dans le cas d'une
install par package
directory /usr/local/var/openldap-data
# Indices to maintain
index objectClass eq
Attention vous devez vous assurer que le répertoire où se trouvera la base LDAP a été créé, par défaut c'est /usr/local/var/openldap-data mais vous pouvez très bien mettre /var/lib/ldap si ça vous chante.
Le fichier ldap.conf peut être vide dans un premier temps voire inexistant.
Le mot de passe de l'administrateur est secret en clair, si ça ne vous convient pas et que vous voulez le crypter, il faudra taper
slappasswd
on saisit son mot de passe
New password:
Re-enter new password:
et voilà le résultat
{SSHA}vNCYRQthN6u3OqcTAJ4lt/9vIhjsFmI
A la place de
rootpw secret
Dans slapd.conf, vous mettrez donc:
rootpw {SSHA}vNCYRQthN6u3OqcTAJ4lt/9vIhjsFmI
pour plus de sécurité on crée maintenant un utilisateur et un groupe système ldap
groupadd ldap
useradd -g ldap -c "slapd demon" -s /sbin/nologin -d /tmp ldap
on le rend propriétaire du fichier de configuration et de la base ldap en tapant
chown ldap:ldap
/usr/local/etc/openldap/slapd.conf
chown -fR ldap:ldap /usr/local/var/openldap-data
chown -fR ldap:ldap /usr/local/var/run
maintenant sous /usr/local/var/openldap-data on tapera
cp DB_CONFIG.example DB_CONFIG
chown ldap:ldap DB_CONFIG
[Unit]
Description=OpenLDAP server daemon
[Service]
Type=forking
ExecStart=/usr/local/libexec/slapd -u
ldap -g ldap -f /usr/local/etc/openldap/slapd.conf
[Install]
WantedBy=multi-user.target
maintenant pour que le service soit lancé à chaque boot de la machine il
faudra taper
systemctl enable slapd.service
voillà le résultat
Created symlink from /etc/systemd/system/multi-user.target.wants/slapd.service to /usr/lib/systemd/system/slapd.service.
pour le lancer il suffit maintenant de taper
systemctl start slapd.service
et pour connaitre son état
systemctl status slapd.service
voilà le résultat
● slapd.service - OpenLDAP server
daemon
Loaded: loaded (/usr/lib/systemd/system/slapd.service;
enabled)
Active: active (running) since sam. 2016-12-24 11:14:52
CET; 27s ago
Process: 15515 ExecStart=/usr/local/libexec/slapd -u ldap -g ldap
-f /usr/local/etc/openldap/slapd.conf (code=exited, status=0/SUCCESS)
Main PID: 15517 (slapd)
CGroup: /system.slice/slapd.service
└─15517
/usr/local/libexec/slapd -u ldap -g ldap -f
/usr/local/etc/openldap/slapd.conf
déc. 24 11:14:41 mana.kervao.fr slapd[15515]: @(#) $OpenLDAP: slapd
2.4.44 (Dec 24 2016 11:12:03) $
olivier@mana.kervao.fr:/usr/local/linux/systeme/openldap-2.4.44/servers/slapd
ça nous évitera une erreur du genre
slapd[5803]: main: TLS init
def ctx failed: -1
maintenant
on va modifier le fichier
/usr/local/etc/openldap/slapd.conf
on rajoute les
lignes suivantes
TLSCACertificateFile /etc/ssl/CA/cacert.pem
TLSCertificateFile /etc/ssl/public/ldapcrt.pem
TLSCertificateKeyFile /etc/ssl/ldap/ldapkey.pem
# cette directive c'est
pour ne pas vérifier le certificat du client
TLSVerifyClient never
/etc/pki/tls/certs/
). Il doit avoir les droits 644
chmod 644 ldapcrt.pem
cela évite l'erreur suivante
TLS: could not load verify
locations
(file:`/etc/openldap/cacerts/ldapcrt.pem',dir:`/etc/openldap/cacerts').
TLS: error:02001002:system library:fopen:No such file or
directory bss_file.c:175
TLS: error:2006D080:BIO routines:BIO_new_file:no such file
bss_file.c:182
TLS: error:0B084002:x509 certificate
routines:X509_load_cert_crl_file:system lib by_file.c:256
On édite le fichier
/usr/local/etc/openldap/ldapd.conf
et on modifie ainsi
# SSL/TSL configuration.
With CA-signed certs, TLS_REQCERT should be
# "demand", with the CA certificate accessible
#TLS_REQCERT ([demand],never,allow,try)
# We ship with allow by default as some LDAP clients (e.g.
evolution) have
# no interactive SSL configuration
# on doit mettre allow si le certificat a été signé de manière
maison, sinon ça sera demand
TLS_REQCERT allow
# CA Certificate locations
# Use the default self-signed cert generated by
openldap-server postinstall
# by default
TLS_CACERT
/etc/pki/tls/certs/ldapcrt.pem
on
relance
slapd
systemctl stop sladp
systemctl start slapd
Voir
par ici pour tester la config.
La syntaxe du format LDIF est la suivante:
dn: description du distinguished name
objetclass: classe d'objet d'origine
...
objetclass: classe d'objet dérivée
type attribut: valeur
...
On va par exemple utiliser la classe breizPerson définie plus
haut pour décrire une nouvelle personne Veronique Hoarau qu'on va
rajouter dans l'annuaire. Elle appartient au service (organizationalUnit)
staff, ce même service appartenant à l'organisation kervao.fr
Soit le fichier entree.ldif
dn: dc=kervao, dc=fr
objectClass: dcObject
objectClass: organization
dc: kervao
o: kervao.fr
dn: ou=staff, dc=kervao, dc=fr
objectclass: organizationalUnit
ou: staff
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
objectclass: person
objectclass: breizhPerson
cn: Veronique Hoarau
sn: Hoarau
title: madame
dc=fr
|
dc=kervao
|
------------------------------------------------------------------------------------------------------------
|
|
|
|
ou=staff
ou=informatique
ou=production
ou=achat
|
------------------------------------------------------------------
|
|-b 'dc=kervao, dc=fr' '(objectclass=*)'
cn=Veronique
Hoarau
cn=Olivier
Hoarau
Au niveau de la définition de la personne:
objetclass: person définit la classe père de la classe breizPerson,
objetclass: breizPerson classe décrivant la personne,
cn et sn sont des attributs à renseigner obligatoirement,
title est un attribut obligatoire
On rajoutera l'enregistrement en utilisant la syntaxe suivante (en tant que simple utilisateur):
ldapadd -x -D "description du dn de l'administrateur" -W -f nom-du-fichier-ldif
Exemple concret:
ldapadd -x -D "cn=Manager, dc=kervao, dc=fr" -W -f
entree.ldif
Enter LDAP Password: secret
adding new entry "dc=kervao, dc=fr"
adding new entry "ou=staff, dc=kervao, dc=fr"
adding new entry "cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr"
Pour rajouter par la suite un autre enregistement dans le groupe staff, il sera plus nécessaire de rajouter la définition du groupe et de l'organisation. Soit le fichier entree.ldif
dn: cn=Olivier Hoarau, ou=staff, dc=kervao, dc=fr
objectclass: person
objectclass: breizhPerson
cn: Olivier Hoarau
sn: Hoarau
title: monsieur
On tape ensuite la commande:
ldapadd -x -D "cn=Manager, dc=kervao, dc=fr" -W -f entree.ldif
Enter LDAP Password:
adding new entry "cn=Olivier Hoarau, ou=staff, dc=kervao, dc=fr"
ldapsearch -x -b 'dc=kervao, dc=fr' '(objectclass=*)'
Voilà le résultat
# extended LDIF
#
# LDAPv3
# filter: (objectclass=*)
# requesting: ALL
#
# kervao, fr
dn: dc=kervao, dc=fr
objectClass: dcObject
objectClass: organization
dc: kervao
o: kervao.fr
# staff, kervao, fr
dn: ou=staff, dc=kervao, dc=fr
objectClass: organizationalUnit
ou: staff
# Veronique Hoarau, staff, kervao, fr
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
objectClass: person
objectClass: breizhPerson
cn: Veronique Hoarau
sn: Hoarau
title: madame
# Olivier Hoarau, staff, kervao, fr
dn: cn=Olivier Hoarau, ou=staff, dc=kervao, dc=fr
objectClass: person
objectClass: breizhPerson
cn: Olivier Hoarau
sn: Hoarau
title: monsieur
# search result
search: 2
result: 0 Success
# numResponses: 5
# numEntries: 4
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
add: l
title: bureau36
On tape ensuite
ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
modifying entry "cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr"
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
changetype: modify
replace: title
title: mademoiselle
On tape ensuite
ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
modifying entry "cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr"
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
delete: l
On tape ensuite
ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
modifying entry cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
dn: cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
changetype: delete
On tape ensuite:
ldapmodify -x -D "cn=Manager, dc=kervao, dc=fr" -W -f modif.ldif
Enter LDAP Password:secret
deleting entry cn=Veronique Hoarau, ou=staff, dc=kervao, dc=fr
ATTENTION Vous ne pouvez pas supprimer un attribut obligatoire comme title pour la classe breizhPerson.
Il suffit de rajouter l'option -Z pour passer en connexion chiffrée, avec le mode debug en plus (-d 1), on doit obtenir ce genre de message
TLS trace: SSL_connect:before/connect
initialization
TLS trace: SSL_connect:SSLv2/v3 write client hello A
TLS trace: SSL_connect:SSLv3 read server hello A
TLS certificate verification: depth: 1, err: 19, subject:
/C=FR/ST=Bretagne/O=none/OU=none/CN=mana.kervao.fr/emailAddress=olivier.hoarau@funix.org,
issuer:
/C=FR/ST=Bretagne/O=none/OU=none/CN=mana.kervao.fr/emailAddress=olivier.hoarau@funix.org
TLS
certificate verification: Error, self signed certificate in certificate
chain
TLS certificate verification: depth: 1, err: 19, subject:
/C=FR/ST=Bretagne/O=none/OU=none/CN=mana.kervao.fr/emailAddress=olivier.hoarau@funix.org,
issuer:
/C=FR/ST=Bretagne/O=none/OU=none/CN=mana.kervao.fr/emailAddress=olivier.hoarau@funix.org
TLS
certificate verification: depth: 0, err: 19, subject:
/C=FR/ST=Bretagne/L=Brest/O=none/OU=none/CN=mana.kervao.fr/emailAddress=olivier.hoarau@funix.org,
issuer:
/C=FR/ST=Bretagne/O=none/OU=none/CN=mana.kervao.fr/emailAddress=olivier.hoarau@funix.org
TLS
trace: SSL_connect:SSLv3 read server certificate A
TLS trace: SSL_connect:SSLv3 read server done A
TLS trace: SSL_connect:SSLv3 write client key exchange A
TLS trace: SSL_connect:SSLv3 write change cipher spec A
TLS trace: SSL_connect:SSLv3 write finished A
TLS trace: SSL_connect:SSLv3 flush data
TLS trace: SSL_connect:SSLv3 read server session ticket A
TLS trace: SSL_connect:SSLv3 read finished A
ldap_sasl_bind
ldap_send_initial_request
ldap_send_server_request
(...)
# numResponses: 9
# numEntries: 8
ldap_free_connection 1 1
ldap_send_unbind
ber_flush2: 7 bytes to sd 3
TLS trace: SSL3 alert write:warning:close notify
ldap_free_connection: actually freed
il y a une erreur avec le certificat qui est auto signé mais comme on a
mis TLS_REQCERT allow dans le
fichier ldap.conf ce n'est pas
bloquant
[Retour page d'accueil FUNIX] |