GNU/Linux >> Tutoriels Linux >  >> Ubuntu

Sécurisez Nginx avec Lets Encrypt sur Ubuntu 16.04

Let's Encrypt est une autorité de certification gratuite et ouverte développée par l'Internet Security Research Group (ISRG). Les certificats émis par Let's Encrypt sont aujourd'hui approuvés par presque tous les navigateurs.

Dans ce didacticiel, nous vous fournirons des instructions étape par étape sur la façon de sécuriser votre Nginx avec Let's Encrypt à l'aide de l'outil certbot sur Ubuntu 16.04.

Prérequis #

Assurez-vous que vous avez satisfait aux prérequis suivants avant de poursuivre ce didacticiel :

  • Vous avez un nom de domaine pointant vers l'IP de votre serveur public. Dans ce tutoriel, nous utiliserons example.com .
  • Vous avez installé Nginx en suivant Comment installer Nginx sur Ubuntu 16.04.

Installer Certbot #

Certbot est un utilitaire écrit en python qui permet d'automatiser les tâches d'obtention et de renouvellement des certificats SSL Let's Encrypt et de configuration des serveurs Web.

Installez d'abord le software-properties-common package qui fournit le add-apt-repository outil nécessaire pour ajouter des PPA supplémentaires.

Mettez à jour l'index des packages et installez software-properties-common avec :

sudo apt updatesudo apt install software-properties-common

Une fois l'installation terminée, ajoutez le référentiel certbot PPA à votre système à l'aide de la commande suivante :

sudo add-apt-repository ppa:certbot/certbot

Mettez à jour la liste des packages et installez le package certbot :

sudo apt updatesudo apt install certbot

Générer le numéro de groupe Strong Dh (Diffie-Hellman)

L'échange de clés Diffie-Hellman (DH) est une méthode d'échange sécurisé de clés cryptographiques sur un canal de communication non sécurisé. Générez un nouveau jeu de paramètres DH 2048 bits pour renforcer la sécurité :

sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Si vous le souhaitez, vous pouvez modifier la taille jusqu'à 4096 bits, mais dans ce cas, la génération peut prendre plus de 30 minutes en fonction de l'entropie du système.

Obtention d'un certificat SSL Let's Encrypt #

Pour obtenir un certificat SSL pour notre domaine, nous allons utiliser le plugin Webroot qui fonctionne en créant un fichier temporaire pour valider le domaine demandé dans le ${webroot-path}/.well-known/acme-challenge annuaire. Le serveur Let's Encrypt envoie des requêtes HTTP au fichier temporaire pour valider que le domaine demandé correspond au serveur sur lequel le certbot s'exécute.

Pour simplifier, nous allons mapper toutes les requêtes HTTP pour .well-known/acme-challenge dans un seul répertoire, /var/lib/letsencrypt .

Les commandes suivantes créeront le répertoire et le rendront accessible en écriture pour le serveur Nginx.

sudo mkdir -p /var/lib/letsencrypt/.well-knownsudo chgrp www-data /var/lib/letsencryptsudo chmod g+s /var/lib/letsencrypt

Pour éviter la duplication de code, créez les deux extraits suivants que nous allons inclure dans tous nos fichiers de blocage de serveur Nginx.

/etc/nginx/snippets/letsencrypt.conf
location ^~ /.well-known/acme-challenge/ {
  allow all;
  root /var/lib/letsencrypt/;
  default_type "text/plain";
  try_files $uri =404;
}
/etc/nginx/snippets/ssl.conf
ssl_dhparam /etc/ssl/certs/dhparam.pem;

ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';
ssl_prefer_server_ciphers on;

ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 30s;

add_header Strict-Transport-Security "max-age=15768000; includeSubdomains; preload";
add_header X-Frame-Options SAMEORIGIN;
add_header X-Content-Type-Options nosniff;

L'extrait ci-dessus inclut les chippers recommandés par Mozilla, active l'agrafage OCSP, HTTP Strict Transport Security (HSTS) et applique quelques en-têtes HTTP axés sur la sécurité.

Une fois les extraits créés, ouvrez le bloc du serveur de domaine et incluez le letsencrypt.conf extrait comme indiqué ci-dessous :

/etc/nginx/sites-available/example.com.conf
server {
  listen 80;
  server_name example.com www.example.com;

  include snippets/letsencrypt.conf;
}

Activez le bloc serveur en créant un lien symbolique depuis sites-available à sites-enabled :

sudo ln -s /etc/nginx/sites-available/example.com.conf /etc/nginx/sites-enabled/example.com.conf

Rechargez la configuration Nginx pour que les modifications prennent effet :

sudo systemctl reload nginx

Exécutez le script certbot avec le plugin webroot et obtenez les fichiers de certificat SSL :

sudo certbot certonly --agree-tos --email [email protected] --webroot -w /var/lib/letsencrypt/ -d example.com -d www.example.com

Si le certificat SSL est obtenu avec succès, certbot imprimera le message suivant :

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

Maintenant que nous avons les fichiers de certificat, modifiez le bloc du serveur de domaine comme suit :

/etc/nginx/sites-available/example.com.conf
server {
    listen 80;
    server_name www.example.com example.com;

    include snippets/letsencrypt.conf;
    return 301 https://$host$request_uri;
}

server {
    listen 443 ssl http2;
    server_name www.example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    return 301 https://example.com$request_uri;
}

server {
    listen 443 ssl http2;
    server_name example.com;

    ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    include snippets/ssl.conf;
    include snippets/letsencrypt.conf;

    # . . . other code
}

Avec la configuration ci-dessus, nous forçons HTTPS et redirigeons le www version du domaine en non www version.

Rechargez le service Nginx pour que les modifications prennent effet :

sudo systemctl reload nginx

Numéro de renouvellement automatique du certificat SSL

Les certificats de Let’s Encrypt sont valides pendant 90 jours. Pour renouveler automatiquement les certificats avant leur expiration, le package certbot crée une tâche cron qui s'exécutera deux fois par jour et renouvellera automatiquement tout certificat 30 jours avant son expiration.

Comme nous utilisons le plug-in certbot webroot une fois le certificat renouvelé, nous devons également recharger le service nginx. Pour ce faire, ajoutez --renew-hook "systemctl reload nginx" au /etc/cron.d/certbot fichier pour qu'il ressemble à ceci :

/etc/cron.d/certbot
0 */12 * * * root test -x /usr/bin/certbot -a \! -d /run/systemd/system && perl -e 'sleep int(rand(3600))' && certbot -q renew --renew-hook "systemctl reload nginx"

Pour tester le processus de renouvellement, utilisez le certbot --dry-run commutateur :

sudo certbot renew --dry-run

S'il n'y a pas d'erreurs, cela signifie que le processus de renouvellement a réussi.


Ubuntu
  1. Comment sécuriser Nginx avec Lets Encrypt sur Ubuntu 20.04 / 18.04

  2. Sécurisez Nginx avec Lets Encrypt sur Ubuntu 18.04

  3. Sécuriser Nginx avec Let's Encrypt sur Ubuntu 18.04 - Comment faire ?

  4. Comment sécuriser Nginx avec Letsencrypt sur Ubuntu 20.04

  5. Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 20.04

Sécurisez Nginx avec Lets Encrypt sur Debian 10 Linux

Sécurisez Apache avec Lets Encrypt sur Debian 10

Comment installer NodeBB Forum avec Nginx et Lets Encrypt SSL sur Ubuntu 20.04 LTS

Comment installer SonarQube avec Lets Encrypt sur Ubuntu 20.04

Comment sécuriser Nginx avec Let's Encrypt sur Ubuntu 20.04

Comment sécuriser Apache avec Let's Encrypt sur Ubuntu 20.04