Mise en place d’un serveur OpenLdap sécurisé avec TLS

Prérequis à cet article, vous devez avoir installé OpenLdap. N’ayez crainte, l’installation prend 5 minutes et l’ensemble des actions à réaliser est disponible dans mon article Installation de OpenLDAP sous Linux en 5 minutes. Comme vous vous en doutez, lors de l'authentification à un serveur OpenLDAP, il est préférable de le faire en utilisant une session cryptée, l’objectif étant de ne plus faire « voyager » les mots de passe en clair entre les serveurs mais de chiffrer les échanges.  Ce petit miracle peut être accompli en utilisant TLS (Transport Layer Security). Le protocole TLS se charge de mettre en oeuvre la confidentialité des communications sur Internet. Le protocole permet aux applications client / serveur de communiquer de  manière à empêcher l'espionnage ou a falsification des messages échangés. Je vous propose un petit schéma "maison" pour vous expliquer le processus de connexion et les différents étapes. Avec ça, vous n'aurez plus d'excuse pour dire que vous ne comprenez pas :) Mise-en-place-d-un-serveur-OpenLdap-sécurisé-avec-TLS Petite "explication de texte" :
Message
Signification
StartTLS Request Demande de création d'une connexion chiffrée par une couche TLS émanant du client.
StartTLS Response  Réponse de la demande de création d'une connexion par couche TLS
Handshake TLS L'échange de clés : Le client vérifie la validité du certificat serveur. Si le certificat est valide, génère une clé maître , la chiffre à l’aide de la clé publique du serveur et la lui envoie. Les données échangées par la suite entre le client et le serveur sont chiffrées et authentifiées à l’aide de clés dérivées de la clé maître.
bindRequest  Demande la connexion à un annuaire
bindResponse  Réponse à la demande d'authentification
searchRequest  Demande à effectuer une recherche en fonction d'un filtre donné
searchResDone  Message indiquant la fin des réponses à une recherche
unbindRequest  Demande de déconnexion/fin de session
Maintenant que les présentations sont faites, nous pouvons attaquer la sécurisation de notre serveur Ldap !

Etape 1 : Création des clés et  certificats

Pour les besoins de cet article, nous allons nous transformer en autorité de certification pour crée et signer le certificat serveur qui sera déployer sur notre OpenLdap. Pour ça nous allons utiliser l’outil certtool. Première étape, installer GnuTLS. Le paquet GnuTLS contient des bibliothèques et des outils pour gérer TLS :
apt-get install gnutls-bin ssl-cert
Nous avons les outils, nous pouvons créer une clé privée :
certtool --generate-privkey > /etc/ssl/private/cakey.pem
Puis créons le template utilisé pour renseigner de façon automatique les champs nécessaires à la création du CA . Pour cela, créez un fichier ca.info dans /etc/ssl/ (ou à l’endroit de votre choix) et ajoutez les 3 lignes suivantes :
cn=CA Nicolas HOUSSET Trust
ca
cert_signing_key
Et maintenant nous pouvons créer notre certificate CA en se basant sur notre clé et les informations du fichier /etc/ssl/ca.info. Ce certificat sera utilisé pour signer le certificat serveur. Pour cela nous utilisons l’instruction --generate-self-signed et les paramètres idoines :
certtool --generate-self-signed --load-privkey /etc/ssl/private/cakey.pem --template /etc/ssl/ca.info 
--outfile /etc/ssl/certs/cacert.pem
Ensuite, nous générons une clé privé nih_slapd_key.pem pour notre serveur openldap, en utilisant generate-privkey :
certtool --generate-privkey -bits 1024 --outfile /etc/ssl/private/nih_slapd_key.pem
Puis, nous pouvons créer le certificat serveur : Comme pour notre CA nous partons d'un fichier template /etc/ssl/nih.info contenant les informations suivantes :
organization = Nicolas Housset LDAP Server france
cn = ldap-france.nicolas-housset.fr
tls_www_server
encryption_key
signing_key
expiration_days = 360
 Veillez à ce que la propriété cn soit bien le nom de votre serveur  Maintenant, on génère notre certificat serveur via la commande generate-certificate :
certtool --generate-certificate --load-privkey /etc/ssl/private/nih_slapd_key.pem --load-ca-certificate /etc/ssl/certs/cacert.pem --load-ca-privkey /etc/ssl/private/cakey.pem --template /etc/ssl/nih.info --outfile /etc/ssl/certs/nih_slapd_cert.pem

 Etape 2 : Configuration de OpenLdap

Nous devons maintenant activer l'option LDAPS dans la configuration de l'annuaire OpenLDAP afin que e daemon slapd puisse écouter et servir ses requêtes sur le port 636 dédié à LDAP : Dans le fichier /etc/default/slapd, localisez  la ligne suivante
SLAPD_SERVICES="ldap:/// ldapi:///"
et remplacez par :
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///"
Maintenant, créez le fichier certinfo.ldif avec le contenu suivant (Ajustez les valeurs en conséquence) :
dn: cn=config
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/cacert.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/nih_slapd_cert.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/nih_slapd_key.pem
Et "injectez" le tout dans votre configuration ldap :
ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ssl/certinfo.ldif
Dernière étape, donnez les droits qui vont bien aux fichiers :
adduser openldap ssl-cert

chgrp ssl-cert /etc/ssl/private/nih_slapd_key.pem
chmod g+r /etc/ssl/private/nih_slapd_key.pem
chmod o-r /etc/ssl/private/nih_slapd_key.pem
Pour terminer, relancer le serveur Openldap :
/etc/init.d/slapd restart
Dernier petit détail, vérifiez que le process est en écoute sur le port ldaps :
 netstat –a
ce qui vous donne en sortie (si tout va bien )
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State
tcp        0      0 *:12320                 *:*                     LISTEN
tcp        0      0 *:12321                 *:*                     LISTEN
tcp        0      0 *:ldap                  *:*                     LISTEN
tcp        0      0 *:ssh                   *:*                     LISTEN
tcp        0      0 *:ldaps                 *:*                     LISTEN
Enfin, si vous voulez être "ceinture/bretelles", vous pouvez jetez un coup d’œil aux logs afin de s'assurer qu'il n'y pas a de gros pépin :  
tail /var/log/sldap.log
  Tout va bien :
Jun 7 15:21:42 ldap slapd[24247]: @(#) $OpenLDAP: slapd (Sep 11 2015 15:18:47) $#012#011buildd@x86-csail-01:/build/openldap-e51fz0/openldap-2.4.31/debian/build/servers/slapd
Jun 7 15:21:43 ldap slapd[24248]: slapd starting
Maintenant j'espère que cet article vous aura aidé à  comprendre le fonctionnent de OpenLdap dans un contexte sécurisé et comment mettre en oeuvre cette sécurisation.  Oui ? N'hésitez pas à publier un petit commentaire et à partager sur les réseaux sociaux.  

Nicolas Housset

Passionné d'informatique, je suis Consultant et expert technique SAS VIYA, également co-fondateur de la société Flexcelite. Spécialisé dans les technologies SAS (Viya, 9.4) et les infrastructures associées (Linux, Hadoop, Azure), ce blog est mon espace pour partager mes mémos techniques et retours d'expérience.