Comment sécuriser Apache avec Let’s Encrypt sur Debian 8

introduction

Ce tutoriel vous montrera comment configurer un certificat TLS / SSL à partir de Let’s Encrypt sur un serveur Debian 8 exécutant Apache en tant que serveur Web. Nous verrons également comment automatiser le processus de renouvellement des certificats à l’aide d’un travail cron.

Les certificats SSL sont utilisés dans les serveurs Web pour chiffrer le trafic entre le serveur et le client, offrant ainsi une sécurité supplémentaire aux utilisateurs accédant à votre application. Let Encrypt offre un moyen simple d’obtenir et d’installer des certificats de confiance gratuitement.

Conditions préalables

Pour compléter ce guide, vous aurez besoin d’un serveur Debian 8 avec un utilisateur non root + sudo + pour les tâches administratives. Vous pouvez configurer un utilisateur avec les autorisations appropriées en suivant notre Debian 8 Guide de configuration du serveur.

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 vous ne l’avez pas déjà fait, veillez à créer un * A Record * qui pointe votre domaine vers l’adresse IP publique de votre serveur (si vous utilisez le DNS de DigitalOcean, vous pouvez suivre https://www.digitalocean.com/community / tutorials / comment-configurer-un-nom-hôte-avec-digitalocean [ce guide]). 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 *.

Lorsque vous êtes prêt à passer à autre chose, connectez-vous à votre serveur en utilisant votre compte sudo.

Étape 1: Installez Certbot, le client Let’s Encrypt

La première étape pour utiliser Let’s Encrypt pour obtenir un certificat SSL consiste à installer le client + certbot + Let’s Encrypt sur votre serveur.

Le paquet + certbot + n’était pas disponible lors de la publication de Debian 8. Pour accéder au paquetage + certbot +, nous devrons activer le référentiel de backports Jessie sur notre serveur. Ce référentiel peut être utilisé pour installer des versions de logiciel plus récentes que celles incluses dans les référentiels stables.

Ajoutez le référentiel de backports sur votre serveur en tapant:

echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list

Après avoir ajouté le nouveau référentiel, mettez à jour l’index de paquetage + apt + pour télécharger les informations sur les nouveaux paquetages:

sudo apt-get update

Une fois le référentiel mis à jour, vous pouvez installer le paquetage + python-certbot-apache +, qui récupère + certbot +, en ciblant le référentiel de backports:

sudo apt-get install python-certbot-apache -t jessie-backports

Le client + certbot + devrait maintenant être prêt à être utilisé.

Étape 2: Configurer Apache ServerName et ServerAlias

Il est possible de passer en arguments les domaines que nous souhaitons sécuriser lors de l’appel de l’utilitaire + certbot +. Cependant, + certbot + peut aussi les lire depuis la configuration Apache elle-même. Comme il est judicieux de toujours être explicite sur les domaines auxquels votre serveur doit répondre, nous allons définir directement + NomServeur + et + ServerAlias ​​+ dans la configuration Apache.

Lorsque nous avons installé le serveur + python-certbot-apache, Apache est installé s’il n’était pas déjà présent sur le système. Ouvrez le fichier d’hôte virtuel Apache par défaut afin que nous puissions définir explicitement nos noms de domaine:

sudo nano /etc/apache2/sites-available/000-default.conf

À l’intérieur, dans le bloc Hôte virtuel, ajoutez ou supprimez la mise en commentaire de la directive + NomServeur + et définissez-la sur votre nom de domaine principal. Tout autre nom de domaine auquel ce serveur doit également répondre peut être ajouté à l’aide d’une directive + ServerAlias ​​+.

Pour notre exemple, nous utilisons + example.com + comme nom canonique et + www.example.com + comme alias. Lorsque nous définirons ces directives, cela ressemblera à ceci:

/etc/apache2/sites-available/000-default.conf

<VirtualHost *:80>
   . . .
   ServerName
   ServerAlias
   . . .
</VirtualHost>

Lorsque vous avez terminé, enregistrez et fermez le fichier en maintenant * CTRL * et en appuyant sur * X *. Tapez * Y * et appuyez sur * Entrée * pour enregistrer le fichier.

Consultez le fichier de configuration pour détecter les erreurs de syntaxe éventuellement introduites par vos modifications:

sudo apache2ctl configtest

Recherchez cette ligne dans la sortie:

OutputSyntax OK

Si le fichier a réussi le test de syntaxe, redémarrez votre service Apache pour implémenter vos modifications:

sudo systemctl restart apache2

Maintenant que Apache est configuré avec vos noms de domaine, nous pouvons utiliser + certbot + pour obtenir nos certificats SSL.

Étape 3: Réglage du pare-feu

Si un pare-feu est activé, vous devez ajuster les paramètres pour autoriser le trafic SSL. La procédure requise dépend du logiciel de pare-feu que vous utilisez. Si vous n’avez pas de pare-feu configuré actuellement, n’hésitez pas à passer au suivant.

UFW

Si vous utilisez * ufw *, vous pouvez voir le paramètre actuel en tapant:

sudo ufw status

Cela peut ressembler à ceci, ce qui signifie que seul le trafic SSH est autorisé sur le serveur Web:

OutputStatus: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)

Pour ajouter en plus le trafic HTTP et HTTPS, nous pouvons autoriser le profil d’application «WWW Full»:

sudo ufw allow 'WWW Full'

Votre statut devrait ressembler à ceci maintenant:

sudo ufw status
OutputStatus: active

To                         Action      From
--                         ------      ----
SSH                        ALLOW       Anywhere
WWW Full                   ALLOW       Anywhere
SSH (v6)                   ALLOW       Anywhere (v6)
WWW Full (v6)              ALLOW       Anywhere (v6)

Les requêtes HTTP et HTTPS doivent maintenant être acceptées par votre serveur.

IPTables

Si vous utilisez + iptables +, vous pouvez voir les règles actuelles en tapant:

sudo iptables -S

Si des règles sont activées, elles seront affichées. Un exemple de configuration pourrait ressembler à ceci:

Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Les commandes nécessaires pour ouvrir le trafic SSL dépendent de vos règles actuelles. Pour un ensemble de règles de base comme celui ci-dessus, vous pouvez ajouter un accès SSL en tapant:

sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT

Si nous regardons à nouveau les règles du pare-feu, nous devrions voir la nouvelle règle:

sudo iptables -S
Output-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT

-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT

Si vous utilisez un programme pour appliquer automatiquement les règles + iptables + au démarrage, assurez-vous de mettre à jour votre configuration avec la nouvelle règle.

Étape 4: Configurer le certificat SSL

La génération du certificat SSL pour Apache à l’aide du client Let’s Encrypt est assez simple. Le client obtiendra et installera automatiquement un nouveau certificat SSL valide pour les domaines de notre configuration Apache.

Pour exécuter l’installation interactive et obtenir un certificat pour tous les domaines définis dans votre configuration Apache, tapez:

sudo certbot --apache

L’utilitaire + certbot + évaluera votre configuration Apache pour rechercher les domaines devant être couverts par le certificat demandé. Vous pourrez désélectionner les domaines définis que vous ne souhaitez pas voir couverts par le certificat.

Un guide détaillé vous aidera à personnaliser les options de votre certificat. Il vous sera demandé de fournir une adresse e-mail pour la récupération de clés perdues et les notifications, et vous pourrez choisir d’activer les accès + http + et + https + ou de forcer toutes les demandes à être redirigées vers + https +. Il est généralement plus sûr d’exiger + https +, sauf si vous avez un besoin spécifique de trafic non chiffré + http +.

Une fois l’installation terminée, vous devriez pouvoir trouver les fichiers de certificat générés dans + / etc / letsencrypt / live +. Vous pouvez vérifier l’état de votre certificat SSL avec le lien suivant (n’oubliez pas de le remplacer par votre domaine):

https://www.ssllabs.com/ssltest/analyze.html?d=&latest

Le test peut prendre quelques minutes à compléter. Vous devriez maintenant pouvoir accéder à votre site Web en utilisant un préfixe + https +.

Étape 5: Configuration du renouvellement automatique

Les certificats Let Encrypt sont valides pendant 90 jours, mais il est recommandé de les renouveler tous les 60 jours pour laisser une marge d’erreur. Le client + certbot + a une commande + renew + qui vérifie automatiquement les certificats actuellement installés et tente de les renouveler s’ils sont à moins de 30 jours de la date d’expiration.

Pour déclencher le processus de renouvellement pour tous les domaines installés, vous devez exécuter:

sudo certbot renew

Comme nous avons récemment installé le certificat, la commande vérifie uniquement la date d’expiration et affiche un message l’informant que le certificat n’est pas encore en cours de renouvellement. La sortie devrait ressembler à ceci:

OutputSaving debug log to /var/log/letsencrypt/letsencrypt.log

-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal

The following certs are not due for renewal yet:
 /etc/letsencrypt/live//fullchain.pem (skipped)
No renewals were attempted.

Notez que si vous avez créé un certificat groupé avec plusieurs domaines, seul le nom du domaine de base sera affiché dans la sortie, mais le renouvellement devrait être valide pour tous les domaines inclus dans ce certificat.

Un moyen pratique de vous assurer que vos certificats ne seront pas périmés est de créer un travail cron qui exécutera périodiquement la commande de renouvellement automatique pour vous. Comme le renouvellement vérifie d’abord la date d’expiration et ne l’exécute que si le certificat a moins de 30 jours d’expiration, il est prudent de créer un travail cron qui s’exécute chaque semaine ou même tous les jours, par exemple.

Modifions la crontab pour créer un nouveau travail qui exécutera la commande de renouvellement chaque semaine. Pour éditer la crontab pour l’utilisateur root, exécutez:

sudo crontab -e

Vous pouvez être invité à sélectionner un éditeur:

Outputno crontab for root - using an empty one

Select an editor.  To change later, run 'select-editor'.
 1. /bin/nano        <---- easiest
 2. /usr/bin/vim.basic
 3. /usr/bin/vim.tiny

Choose 1-3 [1]:

Sauf si vous êtes plus à l’aise avec + vim +, appuyez sur * Entrée * pour utiliser + nano +, la valeur par défaut.

Incluez le contenu suivant à la fin de la crontab, le tout dans une ligne:

crontab. . .
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log

Sauvegarder et quitter. Cela créera un nouveau travail cron qui exécutera la commande + letsencrypt-auto renew + tous les lundis à 2h30. La sortie générée par la commande sera dirigée vers un fichier journal situé dans + / var / log / le-renouvellement.log +.

Conclusion

Dans ce guide, nous avons vu comment installer un certificat SSL gratuit de Let’s Encrypt afin de sécuriser un site Web hébergé avec Apache. Nous vous recommandons de consulter le site officiel Let’s Encrypt pour des mises à jour importantes de temps à autre.