Comment sécuriser Nginx avec Let's Encrypt sur FreeBSD

De Get Docs
Aller à :navigation, rechercher

Introduction

Let's Encrypt est une autorité de certification (AC) qui permet d'obtenir et d'installer facilement des certificats TLS/SSL gratuits, permettant ainsi le chiffrement HTTPS sur les serveurs Web. Il simplifie le processus en fournissant un client logiciel, Certbot, qui automatise la plupart des étapes.

Dans ce tutoriel, nous allons vous montrer comment utiliser Certbot pour obtenir un certificat SSL gratuit et l'utiliser sur un serveur FreeBSD exécutant Nginx. Nous vous montrerons également comment renouveler automatiquement votre certificat SSL.

Nous utiliserons le fichier de configuration Nginx par défaut dans ce didacticiel au lieu d'un fichier de bloc de serveur séparé. Nous recommandons généralement de créer de nouveaux fichiers de bloc de serveur Nginx pour chaque domaine, car cela permet d'éviter certaines erreurs courantes et de conserver les fichiers par défaut comme configuration de secours, comme prévu.

Conditions préalables

Pour terminer ce tutoriel, vous aurez besoin de :

  • Un serveur FreeBSD. Si vous débutez avec FreeBSD 11, vous pouvez suivre ce guide pour vous aider à démarrer.
  • Nginx installé et configuré sur votre serveur. Pour savoir comment le configurer, consultez notre guide sur Comment installer Nginx sur FreeBSD 11.2.
  • Un nom de domaine enregistré que vous possédez et contrôlez. Si vous n'avez pas encore de nom de domaine enregistré, vous pouvez en enregistrer un auprès de l'un des nombreux bureaux d'enregistrement de noms de domaine (par exemple Namecheap, GoDaddy, etc.).
  • Un DNS A Record qui pointe votre domaine vers l'adresse IP publique de votre serveur. Vous pouvez suivre ce didacticiel sur les noms d'hôtes pour plus de détails sur la façon de les ajouter. Ceci est nécessaire en raison de la façon dont Let's Encrypt valide que vous possédez le 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 ces prérequis remplis, passons à l'installation de Certbot, le logiciel client Let's Encrypt.

Étape 1 - Installation de Certbot

La première étape pour utiliser Let's Encrypt pour obtenir un certificat SSL consiste à installer le logiciel client certbot sur votre serveur. La dernière version de Certbot peut être installée à partir de la source à l'aide du système de ports de FreeBSD .

Pour commencer, récupérez un instantané compressé de l'arborescence des ports :

sudo portsnap fetch

L'exécution de cette commande peut prendre quelques minutes. Une fois terminé, extrayez l'instantané :

sudo portsnap extract

Cela peut prendre un certain temps pour que cette commande se termine également. Une fois que c'est fait, accédez au répertoire py-certbot dans l'arborescence des ports :

cd /usr/ports/security/py-certbot

Utilisez ensuite la commande make avec les privilèges sudo pour télécharger et compiler le code source du Certbot :

sudo make install clean

Ensuite, accédez au répertoire py-certbot-nginx dans l'arborescence des ports :

cd /usr/ports/security/py-certbot-nginx

Exécutez à nouveau la commande make à partir de ce répertoire. Cela installera le plugin nginx pour Certbot que nous utiliserons pour obtenir les certificats SSL :

sudo make install clean

Lors de l'installation de ce plugin, vous verrez apparaître quelques fenêtres de dialogue bleues qui ressemblent à ceci :

Ceux-ci vous donnent la possibilité d'installer la documentation du plugin et de ses dépendances. Pour les besoins de ce tutoriel, vous pouvez simplement appuyer sur ENTER pour accepter les options par défaut dans ces fenêtres qui installeront cette documentation.

Le client certbot Let's Encrypt est maintenant prêt à être utilisé. Avant d'obtenir vos certificats, cependant, il est important de configurer un pare-feu et d'autoriser le trafic HTTPS à le traverser, si vous ne l'avez pas déjà fait.

Étape 2 - Configurer un pare-feu et autoriser l'accès HTTPS

Si vous avez déjà configuré un pare-feu sur votre serveur, vous devez vous assurer qu'il autorise l'accès HTTPS (via le port 443). Si vous n'avez pas encore configuré de pare-feu, vous pouvez le faire en suivant les instructions décrites dans cette étape.

Ouvrez votre fichier rc.conf, qui se trouve dans le répertoire /etc/, avec votre éditeur préféré. Ici, nous utiliserons ee :

sudo ee /etc/rc.conf

Ce fichier est utilisé pour informer FreeBSD des services qui doivent être lancés à chaque démarrage de la machine. En haut du fichier, ajoutez les lignes suivantes en surbrillance :

/etc/rc.conf

. . .
nginx_enable="YES"
firewall_enable="YES"
firewall_type="workstation"
firewall_myservices="22/tcp 80/tcp 443/tcp"
firewall_allowservices="any"

Voici ce que font chacune de ces directives et leurs paramètres :

  • firewall_enable="YES" — Cela permet au pare-feu de démarrer à chaque démarrage du serveur.
  • firewall_type="workstation" — FreeBSD fournit plusieurs types de pare-feu par défaut, chacun ayant des configurations légèrement différentes. En déclarant le type workstation, le pare-feu ne protégera ce serveur qu'à l'aide de règles avec état.
  • firewall_myservices="22/tcp 80/tcp 443/tcp" — La directive firewall_myservices vous permet de répertorier les ports TCP que vous souhaitez autoriser via le pare-feu. Dans cet exemple, nous spécifions les ports 22, 80 et 443 pour autoriser l'accès SSH, HTTP et HTTPS au serveur, respectivement.
  • firewall_allowservices="any" — Cela permet à une machine de n'importe quelle adresse IP de communiquer sur les ports spécifiés dans la directive firewall_myservices.

Après avoir ajouté ces lignes, enregistrez le fichier et fermez l'éditeur en appuyant sur CTRL + C, en tapant exit, puis en appuyant sur ENTER.

Ensuite, démarrez le service de pare-feu ipfw. Étant donné que c'est la première fois que vous démarrez le pare-feu sur ce serveur, il est possible que cela provoque le blocage de votre serveur, le rendant inaccessible via SSH. La commande nohup suivante — qui signifie « pas de raccrochage » — démarrera le pare-feu tout en empêchant le blocage et redirigera également la sortie standard et l'erreur vers un fichier journal temporaire :

sudo nohup service ipfw start >/tmp/ipfw.log 2>&1

Si vous utilisez csh ou tcsh, cependant, cette redirection fera apparaître Ambiguous output redirect. dans votre sortie. Dans ce cas, exécutez plutôt ce qui suit pour démarrer ipfw :

sudo nohup service ipfw start >&/tmp/ipfw.log

À l'avenir, vous pourrez gérer le pare-feu ipfw comme vous le feriez pour tout autre service. Par exemple, pour arrêter, démarrer, puis redémarrer le service, exécutez les commandes suivantes :

sudo service ipfw stop
sudo service ipfw start
sudo service ipfw restart

Avec un pare-feu configuré, vous êtes maintenant prêt à exécuter Certbot et à récupérer vos certificats.

Étape 3 — Obtention d'un certificat SSL

Certbot offre une variété de façons d'obtenir des certificats SSL via divers plugins. Le plugin nginx se chargera de reconfigurer Nginx et de recharger le fichier de configuration :

sudo certbot --nginx -d example.com -d www.example.com

Si c'est la première fois que vous exécutez certbot sur ce serveur, le client vous demandera d'entrer une adresse e-mail et d'accepter les conditions d'utilisation de Let's Encrypt. Après cela, certbot communiquera avec le serveur Let's Encrypt, puis exécutera un défi pour vérifier que vous contrôlez le domaine pour lequel vous demandez un certificat.

Si le défi réussit, Certbot vous demandera comment vous souhaitez configurer vos paramètres HTTPS :

Output. . .
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel): 2

Sélectionnez votre choix puis appuyez sur ENTER. Cela mettra à jour la configuration et rechargera Nginx pour récupérer les nouveaux paramètres. certbot se terminera par un message vous indiquant que le processus a réussi et où vos certificats sont stockés :

OutputIMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /usr/local/etc/letsencrypt/live/example.com/fullchain.pem
   Your key file has been saved at:
   /usr/local/etc/letsencrypt/live/example.com/privkey.pem
   Your cert will expire on 2018-09-24. 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 /usr/local/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

Vos certificats sont maintenant téléchargés, installés et configurés. Essayez de recharger votre site Web en utilisant https:// et remarquez l'indicateur de sécurité de votre navigateur. Il doit indiquer que le site est correctement sécurisé, généralement avec une icône de cadenas vert. Si vous testez votre serveur à l'aide du SSL Labs Server Test, il obtiendra une note A.

Après avoir confirmé que vous pouvez accéder à votre site via HTTPS, vous pouvez passer à la dernière étape de ce didacticiel dans laquelle vous confirmerez que vous pouvez renouveler vos certificats, puis configurer un processus pour les renouveler automatiquement.

Étape 4 - Vérification du renouvellement automatique de Certbot

Les certificats de Let's Encrypt ne sont valables que pendant quatre-vingt-dix jours. Il s'agit d'encourager les utilisateurs à automatiser leur processus de renouvellement de certificat. Cette étape décrit comment automatiser le renouvellement du certificat en configurant une tâche cron. Avant de mettre en place ce renouvellement automatique, il est important de tester que vous êtes en mesure de renouveler correctement les certificats.

Pour tester le processus de renouvellement, vous pouvez faire un essai avec certbot :

sudo certbot renew --dry-run

Si vous ne voyez aucune erreur, vous êtes prêt à créer une nouvelle crontab :

sudo crontab -e 

Cela ouvrira un nouveau fichier crontab. Ajoutez le contenu suivant au nouveau fichier, qui indiquera à cron d'exécuter la commande certbot renew deux fois par jour à midi et minuit. certbot renew vérifie si des certificats du système sont sur le point d'expirer et tentera de les renouveler si nécessaire :

0 0,12 * * * /usr/local/bin/certbot renew

Notez que parce que vous avez précédé la commande crontab -e avec sudo, cette opération sera exécutée en tant que root, ce qui est nécessaire car certbot nécessite des privilèges de superutilisateur pour s'exécuter.

Si le processus de renouvellement automatisé échoue, Let's Encrypt enverra un message à l'e-mail que vous avez spécifié, vous avertissant lorsque votre certificat est sur le point d'expirer.

Conclusion

Dans ce didacticiel, nous avons installé le client Let's Encrypt certbot, téléchargé des certificats SSL pour notre domaine, configuré Nginx pour utiliser ces certificats et configuré le renouvellement automatique des certificats. Si vous avez d'autres questions sur l'utilisation de Certbot, leur documentation est un bon point de départ.