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 🙂
Petite "explication de texte" :
Maintenant que les présentations sont faites, nous pouvons attaquer la sécurisation de notre serveur Ldap !
Nous avons les outils, nous pouvons créer une clé privée :
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 :
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 :
Ensuite, nous générons une clé privé nih_slapd_key.pem pour notre serveur openldap, en utilisant generate-privkey :
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 :
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 :
et remplacez par :
Maintenant, créez le fichier certinfo.ldif avec le contenu suivant (Ajustez les valeurs en conséquence) :
Et "injectez" le tout dans votre configuration ldap :
Dernière étape, donnez les droits qui vont bien aux fichiers :
Pour terminer, relancer le serveur Openldap :
Dernier petit détail, vérifiez que le process est en écoute sur le port ldaps :
ce qui vous donne en sortie (si tout va bien )
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 :
Tout va bien :
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.
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 |
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 :
1 |
apt-get install gnutls-bin ssl-cert |
1 |
certtool --generate-privkey > /etc/ssl/private/cakey.pem |
1 2 3 |
cn=CA Nicolas HOUSSET Trust ca cert_signing_key |
1 2 |
certtool --generate-self-signed --load-privkey /etc/ssl/private/cakey.pem --template /etc/ssl/ca.info --outfile /etc/ssl/certs/cacert.pem |
1 |
certtool --generate-privkey -bits 1024 --outfile /etc/ssl/private/nih_slapd_key.pem |
1 2 3 4 5 6 |
organization = Nicolas Housset LDAP Server france cn = ldap-france.nicolas-housset.fr tls_www_server encryption_key signing_key expiration_days = 360 |
1 |
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
1 |
SLAPD_SERVICES="ldap:/// ldapi:///" |
1 |
SLAPD_SERVICES="ldap:/// ldaps:/// ldapi:///" |
1 2 3 4 5 6 7 8 9 |
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 |
1 |
ldapmodify -Y EXTERNAL -H ldapi:/// -f /etc/ssl/certinfo.ldif |
1 2 3 4 5 |
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 |
1 |
/etc/init.d/slapd restart |
1 |
netstat –a |
1 2 3 4 5 6 7 |
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 |
1 |
tail /var/log/sldap.log |
1 2 |
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 |