30

Par Julien Lavesque, Consultant Cloud et expert Sécurité @ Objectif Libre

 

La trêve des confiseurs est l’occasion de s’occuper des mille et une petites choses qu’on n’a pas le temps d’aborder le reste de l’année.

 

L’activité du jour : la mise en place d’un certificat Let’s Encrypt sur notre serveur de mail BlueMind en version 3.5.

L’intérêt

Let’s Encrypt permet de disposer d’un certificat gratuit et reconnu par les navigateurs. L’intérêt principal (dans l’esprit DevOps) est d’automatiser le processus de gestion des certificats parfois complexe.

 

Tout est automatique : la création, l’installation et surtout le renouvellement du certificat. Une fois mis en place, on peut l’oublier et le laisser se débrouiller tout seul.

 

Préparation du serveur web

Avant de générer un certificat, le serveur Let’s Encrypt va vérifier que le nom DNS du certificat vous appartient bien.

Le serveur va demander au client Let’s Encrypt de positionner une ressource à l’URL /.well-known/acme-challenge/ de votre serveur BlueMind. Il faut donc adapter la configuration du serveur nginx BlueMind pour permettre cet échange.

Pour plus d’informations sur le fonctionnement du protocole, vous pouvez consulter la page https://letsencrypt.org/how-it-works/

 

Le serveur web nginx BlueMind permet d’ajouter des fichiers de configuration qui ne seront pas écrasés lors de mises à jour dans le répertoire /etc/nginx/bm-local.d/. Le contenu des échanges avec le serveur Let’s Encrypt sera contenu dans le répertoire /var/www/letsencrypt sur le serveur :

  •  Le fichier /etc/nginx/bm-local.d/letsencrypt-acme-challenge.conf est ajouté avec le contenu suivant :
location ^~ /.well-known/acme-challenge/ {
    default_type "text/plain";
    root /var/www/letsencrypt;
}
  •  Enfin le serveur NGINX doit être redémarré (exemple sur Ubuntu 16.04) :
systemctl reload bm-nginx

Génération du certificat

La 1ère étape est d’installer le client Let’s Encrypt certbot-auto :

sudo curl https://dl.eff.org/certbot-auto > /opt/letsencrypt/certbot-auto
sudo chmod +x /opt/letsencrypt/certbot-auto

 

La génération du certificat nécessite de fournir quelques informations :

  • L’acceptation des conditions d’utilisation
  • Le chemin pour déposer les ressources du challenge ACME
  • Le nom de domaine pour lequel le certificat est généré (potentiellement plusieurs)
  • L’adresse e-mail pour recevoir les notifications d’expiration et autres

 

 

Dans un souci d’automatisation, ces informations sont passées directement en ligne de commande et sans interactions (-n). Au 1er lancement, certbot-auto va installer automatiquement ses dépendances.

sudo ./certbot-auto certonly -n -a webroot --webroot-path=/var/www/letsencrypt -d <FQDN du serveur BM> -m <votre e-mail> --agree-tos

Si tout se passe bien, le certificat et les clés sont générés dans le repertoire /etc/letsencrypt/live/<FQDN du serveur BM>/

 

 

Installation du certificat dans l’environnement BlueMind

Maintenant que le certificat est généré, il faut configurer NGINX pour l’utiliser. Pour rester le plus transparent possible au niveau de BlueMind et éviter de tout casser lors des mises à jour, l’option choisie consiste à ré-écrire le certificat utilisé par BlueMind. Attention : pensez à sauver son ancien certificat si besoin.

 

Le script suivant va permettre de faire cette modification (il sera également utilisé pour le renouvellement) :

#!/bin/bash
cat /etc/letsencrypt/live/fqdn/privkey.pem /etc/letsencrypt/live/fqdn/fullchain.pem > /etc/ssl/certs/bm_cert.pem
systemctl reload postfix
systemctl reload bm-nginx

Ça y est, le serveur BlueMind est à présent sécurisé par un certificat reconnu !

 

Automatisation du renouvellement

Les certificats Let’s Encrypt ont une faible durée de vie (3 mois) mais tout est prévu dans le client pour leur renouvellement. De plus, certbot-auto permet de lancer une commande en cas de renouvellement réussi, ce qui va permettre d’appeler automatiquement le script précédent.

 

Une entrée crontab est ajoutée pour automatiser tout le processus :

0 0 * * 0 /opt/letsencrypt/certbot-auto renew --renew-hook "bash letsencrypt_posthook.sh" >> /var/log/letsencrypt/renew.log

 

Voilà, vous pouvez tranquillement passer à autre chose.

Bonnes fêtes de fin d’année !