Comment sécuriser HAProxy avec Let’s Encrypt sur CentOS 7

introduction

Let’s Encrypt est une nouvelle autorité de certification qui fournit un moyen simple d’obtenir et d’installer des certificats TLS / SSL gratuits, permettant ainsi le cryptage HTTPS sur des serveurs Web. Il simplifie le processus en fournissant un logiciel client, Certbot, qui tente d’automatiser la plupart des étapes requises. Actuellement, l’ensemble du processus d’obtention et d’installation d’un certificat est entièrement automatisé uniquement sur les serveurs Web Apache. Toutefois, Certbot peut être utilisé pour obtenir facilement un certificat SSL gratuit, qui peut être installé manuellement, quel que soit le logiciel de serveur Web choisi.

Dans ce didacticiel, nous allons vous montrer comment utiliser Let’s Encrypt pour obtenir un certificat SSL gratuit et l’utiliser avec HAProxy sur CentOS 7. Nous vous montrerons également comment renouveler automatiquement votre certificat SSL.

image: https: //assets.digitalocean.com/articles/letsencrypt/haproxy-letsencrypt.png [HAProxy avec le certificat Let’s Encrypt TLS / SSL et le renouvellement automatique]

Conditions préalables

Avant de suivre ce tutoriel, vous aurez besoin de quelques choses.

Vous devriez avoir un serveur CentOS 7 avec un utilisateur non root qui a les privilèges sudo +. Vous pouvez apprendre à configurer un tel compte utilisateur en suivant les étapes 1 à 3 de notre initial initial server server for CentOS. 7 tutoriel.

Vous devez posséder ou contrôler le nom de domaine enregistré avec lequel vous souhaitez utiliser le certificat. Si vous ne possédez pas déjà un nom de domaine enregistré, vous pouvez en enregistrer un auprès d’un des nombreux bureaux d’enregistrement de noms de domaine (par exemple, Namecheap, GoDaddy, etc.).

Si ce n’est déjà fait, veillez à créer un * enregistrement A * qui pointe votre domaine vers l’adresse IP publique de votre serveur. Cela est nécessaire en raison de la façon dont Let’s Encrypt a confirmé que vous êtes propriétaire du domaine pour lequel il émet un certificat. Par exemple, si vous souhaitez obtenir un certificat pour + example.com +, ce domaine doit être résolu sur votre serveur pour que le processus de validation fonctionne. Notre configuration utilisera + example.com + et + www.example.com + comme noms de domaine, donc * les deux enregistrements DNS sont requis *.

Une fois toutes les conditions préalables remplies, passons à l’installation de Certbot, le logiciel client Let’s Encrypt.

Étape 1 - Installation de Certbot, le client Let’s Encrypt

La première étape pour utiliser Let’s Encrypt pour obtenir un certificat SSL consiste à installer le logiciel + certbot + sur votre serveur. Actuellement, le meilleur moyen de l’installer consiste à utiliser le référentiel EPEL.

Activez l’accès au référentiel EPEL sur votre serveur en tapant:

sudo yum install epel-release

Une fois le référentiel activé, vous pouvez obtenir le package + certbot + en tapant:

sudo yum install certbot

Le client + certbot + Let’s Encrypt doit maintenant être installé et prêt à être utilisé.

Étape 2 - Obtention d’un certificat

Let’s Encrypt propose différentes méthodes pour obtenir des certificats SSL, par le biais de divers plug-ins. Contrairement au plugin Apache, qui est couvert dans un autre tutoriel , la plupart des plugins ne vous aideront qu’à obtenir un certificat que vous devez configurer manuellement pour votre serveur Web. Les plug-ins qui obtiennent uniquement des certificats et ne les installent pas sont appelés «authentificateurs» car ils permettent d’authentifier si un serveur doit recevoir un certificat.

Nous allons vous montrer comment utiliser le plugin * Standalone * pour obtenir un certificat SSL.

Vérifiez que le port 80 est ouvert

Le plugin autonome fournit un moyen très simple d’obtenir des certificats SSL. Il fonctionne en exécutant temporairement sur votre serveur un petit serveur Web, sur le port + 80 +, auquel l’autorité de certification Let’s Encrypt peut se connecter et valider l’identité de votre serveur avant de délivrer un certificat. En tant que telle, cette méthode nécessite que le port + 80 + ne soit pas utilisé. En d’autres termes, veillez à arrêter votre serveur Web normal, s’il utilise le port + 80 + (c.-à-d. + http +), avant d’essayer d’utiliser ce plugin.

Par exemple, si vous utilisez HAProxy, vous pouvez l’arrêter en exécutant la commande suivante:

sudo systemctl stop haproxy

Si vous n’êtes pas sûr que le port + 80 + soit utilisé, vous pouvez exécuter cette commande:

netstat -na | grep ':80.*LISTEN'

S’il n’y a pas de sortie lorsque vous exécutez cette commande, vous pouvez utiliser le plug-in Standalone.

Exécuter Certbot

Maintenant, utilisez le plugin autonome en lançant cette commande:

sudo certbot certonly --standalone --preferred-challenges http --http-01-port 80 -d  -d

Vous serez invité à entrer votre adresse e-mail et à accepter les conditions d’utilisation de Let’s Encrypt. Ensuite, le défi + http + sera lancé. Si tout réussit, + certbot + affichera un message de sortie comme ceci:

Output:IMPORTANT NOTES:
- Congratulations! Your certificate and chain have been saved at
  /fullchain.pem. Your cert
  will expire on . To obtain a new or tweaked version of
  this certificate in the future, simply run certbot again. To
  non-interactively renew *all* of your certificates, run "certbot
  renew"
- Your account credentials have been saved in your Certbot
  configuration directory at /etc/letsencrypt. You should make a
  secure backup of this folder now. This configuration directory will
  also contain certificates and private keys obtained by Certbot so
  making regular backups of this folder is ideal.
- If you like Certbot, please consider supporting our work by:

  Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
  Donating to EFF:                    https://eff.org/donate-le

Vous voudrez noter le chemin et la date d’expiration de votre certificat, qui ont été mis en évidence dans l’exemple ci-dessus.

Fichiers de certificat

Après avoir obtenu le certificat, vous aurez les fichiers suivants codés PEM:

  • * cert.pem: * Le certificat de votre domaine

  • * chain.pem: * Le certificat de chaîne Let’S Encrypt

  • * fullchain.pem: * + cert.pem + et + chain.pem + combinés

  • * privkey.pem: * la clé privée de votre certificat

Il est important que vous connaissiez l’emplacement des fichiers de certificat que vous venez de créer afin de pouvoir les utiliser dans la configuration de votre serveur Web. Les fichiers eux-mêmes sont placés dans un sous-répertoire dans + / etc / letsencrypt / archive +. Cependant, Certbot crée des liens symboliques vers les fichiers de certificat les plus récents dans le répertoire + / etc / letsencrypt / live / +.

Vous pouvez vérifier que les fichiers existent en lançant cette commande (en remplaçant votre nom de domaine):

sudo ls /etc/letsencrypt/live/

Le résultat devrait être les quatre fichiers de certificat mentionnés précédemment.

Combinez fullchain.pem et privkey.pem

Lors de la configuration de HAProxy pour effectuer une terminaison SSL, afin de chiffrer le trafic entre lui-même et l’utilisateur final, vous devez combiner + fullchain.pem + et + privkey.pem + dans un seul fichier.

Commencez par créer le répertoire dans lequel le fichier combiné sera placé, + / etc / haproxy / certs +:

sudo mkdir -p /etc/haproxy/certs

Créez ensuite le fichier combiné avec cette commande + cat + (remplacez le nom en surbrillance + exemple.com + par votre nom de domaine):

DOMAIN='' sudo -E bash -c 'cat /etc/letsencrypt/live/$DOMAIN/fullchain.pem /etc/letsencrypt/live/$DOMAIN/privkey.pem > /etc/haproxy/certs/$DOMAIN.pem'

Sécurisez l’accès au fichier combiné, qui contient la clé privée, avec cette commande:

sudo chmod -R go-rwx /etc/haproxy/certs

Nous sommes maintenant prêts à utiliser le certificat SSL et la clé privée avec HAProxy.

Étape 3 - Installation de HAProxy

Cette étape couvre l’installation de HAProxy. S’il est déjà installé sur votre serveur, ignorez cette étape.

Installez HAProxy avec yum:

sudo yum install haproxy

HAProxy est maintenant installé mais doit être configuré.

Étape 4 - Configuration de HAProxy

Cette section vous montrera comment configurer HAProxy avec une configuration SSL de base. Il explique également comment configurer HAProxy pour nous permettre de renouveler automatiquement notre certificat Let’s Encrypt.

Ouvrez + haproxy.cfg + dans un éditeur de texte:

sudo vi /etc/haproxy/haproxy.cfg

Laissez ce fichier ouvert pendant que nous l’éditions dans les sections suivantes.

Section globale

Ajoutez cette ligne à la section * global * pour configurer la taille maximale des clés DHE temporaires générées:

haproxy.cfg - 1 sur 5

  tune.ssl.default-dh-param 2048

Sections Frontend

Nous sommes maintenant prêts à définir nos sections + frontend +.

La première chose que nous souhaitons ajouter est une interface permettant de gérer les connexions HTTP entrantes et de les envoyer à un serveur par défaut (que nous définirons ultérieurement). A la fin du fichier, ajoutons une interface appelée * www-http *. Assurez-vous de remplacer + haproxy_public_IP + par l’adresse IP publique de votre serveur HAProxy:

haproxy.cfg - 2 sur 5

frontend www-http
  bind :80
  reqadd X-Forwarded-Proto:\ http
  default_backend www-backend

Ensuite, nous allons ajouter une interface pour gérer les connexions HTTPS entrantes. A la fin du fichier, ajoutez une interface appelée * www-https *. Assurez-vous de remplacer + haproxy_www_public_IP + par l’adresse IP publique de votre serveur HAProxy. De plus, vous devrez remplacer + example.com + par votre nom de domaine (qui devrait correspondre au fichier de certificat que vous avez créé précédemment):

haproxy.cfg - 3 sur 5

frontend www-https
  bind :443 ssl crt /etc/haproxy/certs/.pem
  reqadd X-Forwarded-Proto:\ https
  acl letsencrypt-acl path_beg /.well-known/acme-challenge/
  use_backend letsencrypt-backend if letsencrypt-acl
  default_backend www-backend

Cette interface utilise une liste de contrôle d’accès (+ letsencrypt-acl +) pour envoyer les demandes de validation Let’s Encrypt (pour + /. Well-not not / acme-challenge +) au backend + letsencrypt-backend +, ce qui nous permettra de renouveler le certificat sans arrêter le service HAProxy. Toutes les autres demandes seront envoyées au + www-backend +, qui est le backend qui servira notre application Web ou notre site.

Sections Backend

Une fois que vous avez fini de configurer les interfaces, ajoutez les éléments + www-backend + en ajoutant les lignes suivantes. Assurez-vous de remplacer les mots surlignés par les adresses IP privées respectives de vos serveurs Web (ajustez le nombre de lignes + serveur + pour correspondre au nombre de serveurs principaux que vous avez):

haproxy.cfg - 4 sur 5

backend www-backend
  redirect scheme https if !{ ssl_fc }
  server www-1 :80 check
  server www-2 :80 check

Tout le trafic que ce serveur reçoit sera équilibré entre ses entrées + serveur +, via HTTP (port 80).

Enfin, ajoutez le backend + letsencrypt-backend +, en ajoutant ces lignes

haproxy.cfg - 5 sur 5

backend letsencrypt-backend
  server letsencrypt 127.0.0.1:54321

Ce serveur, qui gère uniquement les défis Let Encryption ACME utilisés pour les demandes de certificat et les renouvellements, envoie le trafic à l’hôte local sur le port + 54321 +. Nous utiliserons ce port au lieu de "+ 80 " et " 443 +" lorsque nous renouvellerons notre certificat SSL Let’s Encrypt.

Nous sommes maintenant prêts à démarrer HAProxy:

sudo systemctl start haproxy

Le certificat Let’s Encrypt TLS / SSL est maintenant en place et nous sommes prêts à configurer le script de renouvellement automatique. À ce stade, vous devez vérifier que le certificat TLS / SSL fonctionne en visitant votre domaine dans un navigateur Web.

Étape 5 - Configuration du renouvellement automatique

Les certificats de Let Encrypt n’ont une validité que de 90 jours. Il est donc important d’automatiser le processus de renouvellement.

Un moyen pratique de vous assurer que vos certificats ne seront pas périmés est de créer un travail cron qui gérera automatiquement le processus de renouvellement pour vous. La tâche cron sera exécutée tous les jours + certbot + et renouvellera les certificats s’ils sont dans les trente jours suivant leur expiration. + certbot + exécutera également un script spécial + renew-hook + après tout renouvellement réussi. Nous allons utiliser ce script de renouvellement pour mettre à jour notre fichier + .pem + combiné et recharger haproxy.

Créons ce script maintenant, puis testons-le.

Créer un script de renouvellement

Ouvrez un nouveau fichier dans + / usr / local / bin + en tant que * racine *:

sudo vi /usr/local/bin/renew.sh

Ce sera un nouveau fichier texte vierge. Collez le court script suivant, en veillant à mettre à jour le nom de domaine en surbrillance avec le vôtre:

#!/bin/sh

SITE=

# move to the correct let's encrypt directory
cd /etc/letsencrypt/live/$SITE

# cat files to make combined .pem for haproxy
cat fullchain.pem privkey.pem > /etc/haproxy/certs/$SITE.pem

# reload haproxy
systemctl reload haproxy

Enregistrez et fermez le fichier. Ce script se déplace dans le bon répertoire Let’s Encrypt, exécute la commande + cat + pour concaténer les deux fichiers + .pem + en un, puis recharge haproxy.

Ensuite, rendez le script exécutable:

sudo chmod u+x /usr/local/bin/renew.sh

Ensuite, lancez le script:

sudo /usr/local/bin/renew.sh

Il devrait fonctionner sans erreur. Nous allons ensuite mettre à jour Certbot et le configurer pour exécuter ce script de renouvellement.

Mettre à jour les configurations de certbot

La commande + certbot renew + que nous utiliserons pour renouveler nos certificats lit un fichier de configuration qui a été créé la première fois que nous avons exécuté + certbot +. Nous devons ouvrir ce fichier et mettre à jour le port que + certbot + utilise pour exécuter son serveur http autonome afin qu’il n’entre pas en conflit avec haproxy (qui écoute déjà sur les ports 80 et 443). Ouvrez le fichier de configuration dans un éditeur de texte:

sudo vi /etc/letsencrypt/renewal/.conf

Nous devons changer la ligne + http01_port +, donc elle se lit comme suit:

exemple.com.conf

http01_port =

Enregistrez et fermez le fichier. Maintenant, testez le processus de renouvellement en spécifiant + - dry-run pour ne rien renouveler:

sudo certbot renew --dry-run

Certbot écoutera le défi de renouvellement sur le port 54321 et haproxy transmettra la demande du port 80 au port 54321.

Créer une tâche cron

Ensuite, nous éditerons la crontab pour créer un nouveau travail qui exécutera la commande + certbot renew + tous les jours. Pour éditer la crontab pour l’utilisateur root, exécutez:

sudo crontab -e

Ajoutez ce qui suit au bas du fichier:

entrée crontab

30 2 * * * /usr/bin/certbot renew --renew-hook "/usr/local/bin/renew.sh" >> /var/log/le-renewal.log

Sauvegarder et quitter. Cela créera un nouveau travail cron qui exécutera la commande + certbot renew + tous les jours à 2 h 30. La sortie générée par la commande sera dirigée vers un fichier journal situé dans + / var / log / le-renouvellement.log +. Si le certificat est réellement renouvelé, le script + - renew-hook + sera exécuté pour créer le fichier PEM combiné et recharger + + haproxy +.

Conclusion

C’est ça! HAProxy utilise maintenant un certificat gratuit Let’s Encrypt TLS / SSL pour desservir de manière sécurisée le trafic HTTPS.

Related