Comment chiffrer les connexions OpenLDAP à l’aide de STARTTLS

introduction

OpenLDAP fournit un service d'annuaire LDAP flexible et bien pris en charge. Toutefois, le serveur lui-même communique via une connexion Web non cryptée. Dans ce guide, nous montrerons comment chiffrer les connexions à OpenLDAP à l'aide de STARTTLS pour mettre à niveau les connexions conventionnelles vers TLS. Nous utiliserons Ubuntu 14.04 comme serveur LDAP.

Conditions préalables

Avant de commencer avec ce guide, vous devez avoir un utilisateur non root avecsudo configuré sur votre serveur. Pour configurer un utilisateur de ce type, suivez nosUbuntu 14.04 initial setup guide.

Nous expliquerons comment installer OpenLDAP sur un serveur Ubuntu 14.04 dans ce guide. Si OpenLDAP est déjà installé sur votre serveur, vous pouvez ignorer les étapes d'installation et de configuration appropriées.

LDAP sur SSL vs LDAP avec STARTTLS

Il existe deux manières de chiffrer les connexions LDAP avec SSL / TLS.

Traditionnellement, les connexions LDAP qui devaient être chiffrées étaient gérées sur un port distinct, généralement636. La connexion entière serait encapsulée avec SSL / TLS. Ce processus, appelé LDAP sur SSL, utilise le protocoleldaps://. Cette méthode de cryptage est maintenant obsolète.

STARTTLS est une approche alternative qui est maintenant la méthode préférée pour chiffrer une connexion LDAP. STARTTLS "met à niveau" une connexion non chiffrée en l'enveloppant avec SSL / TLS après / pendant le processus de connexion. Cela permet aux connexions non cryptées et cryptées d'être gérées par le même port. Ce guide utilisera STARTTLS pour chiffrer les connexions.

Définition du nom d'hôte et du nom de domaine complet

Avant de commencer, nous devons configurer notre serveur afin qu’il résolve correctement son nom d’hôte et son nom de domaine complet (FQDN). Cela sera nécessaire pour que nos certificats soient validés par les clients. Nous supposerons que notre serveur LDAP sera hébergé sur une machine avec le FQDN deldap.example.com.

Pour définir le nom d'hôte à tous les emplacements appropriés sur votre serveur, utilisez la commandehostnamectl avec l'optionset-hostname. Définissez le nom d'hôte sur le nom d'hôte abrégé (n'incluez pas le composant du nom de domaine):

sudo hostnamectl set-hostname ldap

Ensuite, nous devons définir le FQDN de notre serveur en nous assurant que notre fichier/etc/hosts contient les informations correctes:

sudo nano /etc/hosts

Trouvez la ligne qui mappe l'adresse IP de127.0.1.1. Remplacez le premier champ après l'adresse IP par le nom de domaine complet du serveur et le second par le nom d'hôte abrégé. Pour notre exemple, cela ressemblerait à quelque chose comme ceci:

/etc/hosts

. . .

127.0.1.1 ldap.example.com ldap
127.0.0.1 localhost

. . .

Enregistrez et fermez le fichier lorsque vous avez terminé.

Vous pouvez vérifier que vous avez correctement configuré ces valeurs en tapant:

hostname

Cela devrait retourner votre nom d'hôte court:

nom d'hôte abrégé

ldap

Vérifiez le nom de domaine complet en tapant:

hostname -f

Cela devrait renvoyer le nom de domaine complet:

Paramètre FQDN

ldap.example.com

Installation du serveur LDAP et du logiciel GnuTLS

Après avoir vérifié que votre nom d’hôte est correctement défini, nous pouvons installer le logiciel dont nous avons besoin. Si vous avez déjà installé et configuré OpenLDAP, vous pouvez ignorer la première sous-section.

Installer le serveur OpenLDAP

Si vous n'avez pas déjà installé OpenLDAP, il est temps de résoudre ce problème. Mettez à jour l’index de paquet local de votre serveur et installez le logiciel en tapant:

sudo apt-get update
sudo apt-get install slapd ldap-utils

Vous serez invité à fournir un mot de passe administratif LDAP. N'hésitez pas à ignorer l'invite, car nous procéderons à la reconfiguration immédiatement après.

Afin d’accéder à certaines invites supplémentaires dont nous avons besoin, nous reconfigurerons le paquet après l’installation. Pour ce faire, tapez:

sudo dpkg-reconfigure slapd

Répondez correctement aux invites en utilisant les informations ci-dessous comme point de départ:

  • Omettre la configuration du serveur OpenLDAP? No (nous voulons une base de données et une configuration initiales)

  • Nom de domaine DNS:example.com (utilisez le nom de domaine du serveur, moins le nom d'hôte. Ceci sera utilisé pour créer l'entrée de base pour l'arborescence d'informations)

  • Nom de l'organisation:Example Inc (Ceci sera simplement ajouté à l'entrée de base en tant que nom de votre organisation)

  • Mot de passe administrateur: [comme vous le souhaitez]

  • Confirmer le mot de passe: [doit correspondre à ce qui précède]

  • Backend de base de données à utiliser:HDB (sur les deux choix, celui-ci a le plus de fonctionnalités)

  • Voulez-vous que la base de données soit supprimée lorsque slapd est purgé? (votre choix. Choisissez «Oui» pour permettre une suppression totalement propre, choisissez «Non» pour enregistrer vos données même lorsque le logiciel est supprimé.

  • Déplacer l'ancienne base de données? Yes

  • Autoriser le protocole LDAPv2? No

Installer les composants SSL

Une fois votre serveur OpenLDAP configuré, nous pouvons installer les packages que nous utiliserons pour chiffrer notre connexion. Le paquet Ubuntu OpenLDAP est compilé avec les bibliothèques SSL de GnuTLS. Nous allons donc utiliser GnuTLS pour générer nos informations d'identification SSL:

sudo apt-get install gnutls-bin ssl-cert

Avec tous nos outils installés, nous pouvons commencer à créer les certificats et les clés nécessaires pour chiffrer nos connexions.

Créer les modèles de certificat

Pour chiffrer nos connexions, nous devons configurer une autorité de certification et l'utiliser pour signer les clés du ou des serveurs LDAP de notre infrastructure. Ainsi, pour la configuration de notre serveur unique, nous aurons besoin de deux jeux de paires clé / certificat: un pour l'autorité de certification elle-même et un autre associé au service LDAP.

Pour créer les certificats nécessaires à la représentation de ces entités, nous allons créer des fichiers de modèle. Ceux-ci contiendront les informations dont l'utilitairecerttool a besoin pour créer des certificats avec les propriétés appropriées.

Commencez par créer un répertoire pour stocker les fichiers de modèle:

sudo mkdir /etc/ssl/templates

Créer le modèle de CA

Créez d'abord le modèle pour l'autorité de certification. Nous appellerons le fichierca_server.conf. Créez et ouvrez le fichier dans votre éditeur de texte:

sudo nano /etc/ssl/templates/ca_server.conf

Il suffit de fournir quelques informations pour créer avec succès une autorité de certification. Nous devons spécifier que le certificat sera destiné à une CA (autorité de certification) en ajoutant l'optionca. Nous avons également besoin de l'optioncert_signing_key pour donner au certificat généré la possibilité de signer des certificats supplémentaires. Nous pouvons définir lescn sur le nom descriptif que nous souhaitons pour notre autorité de certification:

caserver.conf

cn = LDAP Server CA
ca
cert_signing_key

Enregistrez et fermez le fichier.

Créer le modèle de service LDAP

Ensuite, nous pouvons créer un modèle pour notre certificat de serveur LDAP appeléldap_server.conf. Créez et ouvrez le fichier dans votre éditeur de texte avec les privilègessudo:

sudo nano /etc/ssl/templates/ldap_server.conf

Ici, nous allons fournir quelques informations différentes. Nous fournirons le nom de notre organisation et définirons les optionstls_www_server,encryption_key etsigning_key afin que notre certificat dispose des fonctionnalités de base dont il a besoin.

Lescn dans ce modèlemust correspondent au FQDN du serveur LDAP. Si cette valeur ne correspond pas, le client rejettera le certificat du serveur. Nous définirons également la date d'expiration du certificat. Nous allons créer un certificat de 10 ans pour éviter de devoir gérer des renouvellements fréquents:

ldapserver.conf

organization = "Example Inc"
cn = ldap.example.com
tls_www_server
encryption_key
signing_key
expiration_days = 3652

Enregistrez et fermez le fichier lorsque vous avez terminé.

Créer une clé et un certificat CA

Maintenant que nous avons nos modèles, nous pouvons créer nos deux paires clé / certificat. Nous devons d'abord créer l'ensemble de l'autorité de certification.

Utilisez l'utilitairecerttool pour générer une clé privée. Le répertoire/etc/ssl/private est protégé des utilisateurs non root et est l'emplacement approprié pour placer les clés privées que nous allons générer. Nous pouvons générer une clé privée et l'écrire dans un fichier appeléca_server.key dans ce répertoire en tapant:

sudo certtool -p --outfile /etc/ssl/private/ca_server.key

Nous pouvons maintenant utiliser la clé privée que nous venons de générer et le fichier modèle créé dans la dernière section pour créer le certificat d'autorité de certification. Nous écrirons ceci dans un fichier du répertoire/etc/ssl/certs appeléca_server.pem:

sudo certtool -s --load-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ca_server.conf --outfile /etc/ssl/certs/ca_server.pem

Nous avons maintenant la paire clé privée / certificat pour notre autorité de certification. Nous pouvons l'utiliser pour signer la clé qui sera utilisée pour chiffrer la session LDAP.

Créer une clé de service LDAP et un certificat

Ensuite, nous devons générer une clé privée pour notre serveur LDAP. Nous mettrons à nouveau la clé générée dans le répertoire/etc/ssl/private pour des raisons de sécurité et appellerons le fichierldap_server.key pour plus de clarté.

Nous pouvons générer la clé appropriée en tapant:

sudo certtool -p --sec-param high --outfile /etc/ssl/private/ldap_server.key

Une fois que nous avons la clé privée du serveur LDAP, nous avons tout ce dont nous avons besoin pour générer un certificat pour le serveur. Nous devrons importer presque tous les composants que nous avons créés jusqu’à présent (le certificat et la clé de l’autorité de certification, la clé du serveur LDAP et le modèle de serveur LDAP).

Nous allons mettre le certificat dans le répertoire/etc/ssl/certs et le nommerldap_server.pem. La commande dont nous avons besoin est:

sudo certtool -c --load-privkey /etc/ssl/private/ldap_server.key --load-ca-certificate /etc/ssl/certs/ca_server.pem --load-ca-privkey /etc/ssl/private/ca_server.key --template /etc/ssl/templates/ldap_server.conf --outfile /etc/ssl/certs/ldap_server.pem

Autoriser OpenLDAP à accéder à la clé de serveur LDAP

Nous avons maintenant tous les certificats et les clés dont nous avons besoin. Cependant, actuellement, notre processus OpenLDAP ne pourra pas accéder à sa propre clé.

Un groupe appeléssl-cert existe déjà en tant que propriétaire du groupe du répertoire/etc/ssl/private. Nous pouvons ajouter l'utilisateur sous lequel notre processus OpenLDAP s'exécute (openldap) à ce groupe:

sudo usermod -aG ssl-cert openldap

Maintenant, notre utilisateur OpenLDAP a accès à l’annuaire. Nous devons encore donner à ce groupe la propriété du fichierldap_server.key afin que nous puissions autoriser l'accès en lecture. Donnez au groupessl-cert la propriété de ce fichier en tapant:

sudo chown :ssl-cert /etc/ssl/private/ldap_server.key

Maintenant, donnez au groupessl-cert un accès en lecture au fichier:

sudo chmod 640 /etc/ssl/private/ldap_server.key

Notre processus OpenSSL peut maintenant accéder au fichier de clé correctement.

Configurer OpenLDAP pour utiliser le certificat et les clés

Nous avons nos fichiers et avons correctement configuré l'accès aux composants. Maintenant, nous devons modifier notre configuration OpenLDAP pour utiliser les fichiers que nous avons créés. Pour ce faire, nous allons créer un fichier LDIF avec nos modifications de configuration et le charger dans notre instance LDAP.

Accédez à votre répertoire personnel et ouvrez un fichier appeléaddcerts.ldif. Nous allons mettre nos changements de configuration dans ce fichier:

cd ~
nano addcerts.ldif

Pour effectuer des modifications de configuration, nous devons cibler l'entréecn=config du DIT de configuration. Nous devons spécifier que nous souhaitons modifier les attributs de l'entrée. Ensuite, nous devons ajouter les attributsolcTLSCACertificateFile,olcCertificateFile etolcCertificateKeyFile et les définir aux emplacements de fichier corrects.

Le résultat final ressemblera à ceci:

addcerts.ldif

dn: cn=config
changetype: modify
add: olcTLSCACertificateFile
olcTLSCACertificateFile: /etc/ssl/certs/ca_server.pem
-
add: olcTLSCertificateFile
olcTLSCertificateFile: /etc/ssl/certs/ldap_server.pem
-
add: olcTLSCertificateKeyFile
olcTLSCertificateKeyFile: /etc/ssl/private/ldap_server.key

Enregistrez et fermez le fichier lorsque vous avez terminé. Appliquez les modifications à votre système OpenLDAP à l'aide de la commandeldapmodify:

sudo ldapmodify -H ldapi:// -Y EXTERNAL -f addcerts.ldif

Nous pouvons recharger OpenLDAP pour appliquer les modifications:

sudo service slapd force-reload

Nos clients peuvent désormais crypter leurs connexions au serveur via le port classiqueldap:// en utilisant STARTTLS.

Configuration des ordinateurs clients

Pour se connecter au serveur LDAP et lancer une mise à niveau STARTTLS, les clients doivent avoir accès au certificat de l'autorité de certification et demander la mise à niveau.

Sur le serveur OpenLDAP

Si vous interagissez avec le serveur OpenLDAP à partir du serveur lui-même, vous pouvez configurer les utilitaires client en copiant le certificat de l'autorité de certification et en ajustant le fichier de configuration du client.

Copiez tout d'abord le certificat CA du répertoire/etc/ssl/certs dans un fichier du répertoire/etc/ldap. Nous appellerons ce fichierca_certs.pem. Ce fichier peut être utilisé pour stocker tous les certificats d’autorité de certification auxquels les clients de cette machine peuvent souhaiter accéder. Pour nos besoins, cela ne contiendra qu'un seul certificat:

sudo cp /etc/ssl/certs/ca_server.pem /etc/ldap/ca_certs.pem

Nous pouvons maintenant ajuster le fichier de configuration système pour les utilitaires OpenLDAP. Ouvrez le fichier de configuration dans votre éditeur de texte avec les privilègessudo:

sudo nano /etc/ldap/ldap.conf

Ajustez la valeur de l'optionTLS_CACERT pour pointer vers le fichier que nous venons de créer:

/etc/ldap/ldap.conf

. . .

TLS_CACERT /etc/ldap/ca_certs.pem

. . .

Enregistrez et fermez le fichier.

Vous devriez maintenant pouvoir mettre à jour vos connexions pour utiliser STARTTLS en passant l'option-Z lors de l'utilisation des utilitaires OpenLDAP. Vous pouvez forcer la mise à niveau de STARTTLS en la transmettant deux fois. Testez ceci en tapant:

ldapwhoami -H ldap:// -x -ZZ

Cela force une mise à niveau STARTTLS. Si cela réussit, vous devriez voir:

STARTTLS succès

anonymous

Si vous avez mal configuré quelque chose, vous verrez probablement une erreur comme celle-ci:

Échec STARTTLS

ldap_start_tls: Connect error (-11)
    additional info: (unknown error code)

Configuration des clients distants

Si vous vous connectez à votre serveur OpenLDAP à partir de serveurs distants, vous devrez effectuer un processus similaire. Tout d'abord, vous devez copier le certificat de l'autorité de certification sur l'ordinateur client. Vous pouvez le faire facilement avec l'utilitairescp.

Transfert de clés SSH au client

Si vous vous connectez à votre serveur OpenLDAP à l'aide de clés SSH et que votre ordinateur client est également distant, vous devrez les ajouter à un agent et les transférer lors de la connexion à votre ordinateur client.

Pour ce faire, sur votre ordinateur local, démarrez l'agent SSH en tapant:

eval $(ssh-agent)

Ajoutez votre clé SSH à l'agent en tapant:

ssh-add

Maintenant, vous pouvez transférer vos clés SSH lorsque vous vous connectez à votre machine client LDAP en ajoutant l'indicateur-A:

ssh -A user@ldap_client

Copier le certificat de l'autorité de certification

Une fois que vous êtes connecté au client OpenLDAP, vous pouvez copier le certificat de l'autorité de certification en tapant:

scp [email protected]:/etc/ssl/certs/ca_server.pem ~/

Maintenant, ajoutez le certificat copié à la liste des certificats d’AC connus du client. Ceci ajoutera le certificat au fichier s’il existe déjà et le créera s’il ne le fait pas:

cat ~/ca_server.pem | sudo tee -a /etc/ldap/ca_certs.pem

Ajuster la configuration du client

Ensuite, nous pouvons ajuster le fichier de configuration globale pour les utilitaires LDAP pour qu'il pointe vers notre fichierca_certs.pem. Ouvrez le fichier avec les privilègessudo:

sudo nano /etc/ldap/ldap.conf

Recherchez l'optionTLS_CACERT et définissez-la sur le fichierca_certs.pem:

/etc/ldap/ldap.conf

. . .

TLS_CACERT /etc/ldap/ca_certs.pem

. . .

Enregistrez et fermez le fichier lorsque vous avez terminé.

Testez la mise à niveau de STARTTLS en tapant ceci:

ldapwhoami -H ldap://ldap.example.com -x -ZZ

Si la mise à niveau de STARTTLS est réussie, vous devriez voir:

STARTTLS succès

anonymous

Forcer les connexions à utiliser TLS (facultatif)

Nous avons correctement configuré notre serveur OpenLDAP afin qu’il puisse mettre à niveau de manière transparente les connexions LDAP normales vers TLS via le processus STARTTLS. Toutefois, cela autorise toujours les sessions non chiffrées, ce qui peut ne pas être ce que vous voulez.

Si vous souhaitez forcer les mises à niveau STARTTLS pour chaque connexion, vous pouvez ajuster les paramètres de votre serveur. Nous n'appliquerons cette exigence qu'au DIT normal, pas au DIT de configuration accessible sous l'entréecn=config.

Tout d'abord, vous devez trouver l'entrée appropriée à modifier. Nous allons imprimer une liste de tous les DIT (arborescences d’annuaire: les hiérarchies d’entrées gérées par un serveur LDAP) sur lesquelles le serveur OpenLDAP a des informations, ainsi que l’entrée configurant chaque DIT.

Sur votre serveur OpenLDAP, tapez:

sudo ldapsearch -H ldapi:// -Y EXTERNAL -b "cn=config" -LLL -Q "(olcSuffix=*)" dn olcSuffix

La réponse devrait ressembler à ceci:

DIT servis par OpenLDAP

dn: olcDatabase={1}hdb,cn=config
olcSuffix: dc=example,dc=com

Vous pouvez avoir plus de paires DIT et base de données si votre serveur est configuré pour gérer plusieurs DIT. Ici, nous avons un seul DIT avec l'entrée de base dedc=example,dc=com, qui serait l'entrée créée pour un domaine deexample.com. La configuration de ce DIT est gérée par l’entréeolcDatabase={1}hdb,cn=config. Notez les DN des DOT sur lesquels vous souhaitez forcer le cryptage.

Nous allons utiliser un fichier LDIF pour apporter les modifications. Créez le fichier LDIF dans votre répertoire personnel. Nous l'appelleronsforcetls.ldif:

nano ~/forcetls.ldif

À l'intérieur, ciblez le DN que vous voulez forcer sur TLS. Dans notre cas, ce seradn: olcDatabase={1}hdb,cn=config. Nous allons définir lechangetype sur «modifier» et ajouter l'attributolcSecurity. Définissez la valeur de l'attribut sur «tls = 1» pour forcer TLS pour ce DIT:

forcetls.ldif

dn: olcDatabase={1}hdb,cn=config
changetype: modify
add: olcSecurity
olcSecurity: tls=1

Enregistrez et fermez le fichier lorsque vous avez terminé.

Pour appliquer le changement, tapez:

sudo ldapmodify -H ldapi:// -Y EXTERNAL -f forcetls.ldif

Rechargez le service OpenLDAP en tapant:

sudo service slapd force-reload

Maintenant, si vous recherchez le DITdc=example,dc=com, vous serez refusé si vous n'utilisez pas l'option-Z pour lancer une mise à niveau STARTTLS:

ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL dn

Échec TLS requis

Confidentiality required (13)
Additional information: TLS confidentiality required

Nous pouvons démontrer que les connexions STARTTLS fonctionnent toujours correctement:

ldapsearch -H ldap:// -x -b "dc=example,dc=com" -LLL -Z dn

TLS requis succès

dn: dc=example,dc=com

dn: cn=admin,dc=example,dc=com

Conclusion

Vous devriez maintenant avoir un serveur OpenLDAP configuré avec le cryptage STARTTLS. Le chiffrement de votre connexion au serveur OpenLDAP avec TLS vous permet de vérifier l’identité du serveur avec lequel vous vous connectez. Il protège également votre trafic des tiers. Lors de la connexion sur un réseau ouvert, le cryptage de votre trafic est essentiel.