GNU/Linux >> Tutoriels Linux >  >> Linux

Comment sécuriser Nginx avec le certificat SSL Let's Encrypt

Let's Encrypt est une autorité de certification gratuite, open source et automatisée lancée par Internet Security Research Group (ISRG) et propose des certificats SSL/TLS pour chiffrer les communications impliquant deux parties.

Un certificat SSL sur votre site Web augmentera non seulement la sécurité de votre site Web grâce au cryptage, mais améliorera également le classement SEO de votre site puisque Google a rendu obligatoire l'inclusion d'un certificat SSL pour un meilleur classement SEO.

Dans cet article, nous verrons comment sécuriser un serveur NGINX avec le certificat SSL Let's Encrypt dans Ubuntu 18.04.

Prérequis

  • Vous avez les privilèges d'ouvrir une session SSH sur le serveur Ubuntu 18.04 soit en utilisant un utilisateur root, soit en utilisant un utilisateur activé sudo.
  • Vous avez déjà installé NGINX en suivant notre tutoriel à partir d'ici.
  • Un nom de domaine enregistré.
  • DNS Un enregistrement qui pointe vers l'adresse IP de votre serveur en fonction du nom de domaine que vous souhaitez utiliser.
Ce tutoriel nécessite l'utilisation de noms de domaine. Chaque fois que vous voyez les variables SUBDOMAIN, DOMAIN ou TLD, remplacez-les par vos propres valeurs.

Installer la bibliothèque Let's Encrypt Client

La toute première étape que vous devez accomplir est d'installer la bibliothèque cliente Let's Encrypt qui, à son tour, sera utilisée pour demander des certificats à l'autorité LE. Pour ce faire, vous pouvez notamment cloner la bibliothèque client Let's Encrypt à partir de son référentiel officiel sur votre serveur.

Il est également possible d'installer le même à partir du référentiel officiel d'Ubuntu. Dans le référentiel d'Ubuntu, la bibliothèque cliente est connue sous le nom de certbot fourni par les développeurs de Let's Encrypt. Mais nous choisirons la première méthode d'installation, c'est-à-dire en clonant le dépôt Github de Let's Encrypt.

Pour ce faire, accédez au dossier d'installation de votre choix et clonez le référentiel. J'ai choisi le dossier d'installation comme /usr/local , vous pouvez choisir un autre dossier en fonction de votre environnement.


# apt-get install git
# cd /usr/local
# git clone https://github.com/letsencrypt/letsencrypt

Allez dans le dossier Letsencrypt, vous trouverez tous les dossiers et fichiers clonés, y compris le certbot, nécessaires à Let's encrypt pour récupérer les certificats pour vous.

Liste Lets Encrypt Folder

Configurez Let's Encrypt pour vérifier votre domaine

Lors du processus de récupération d'un certificat, le client Let's Encrypt crée un fichier temporaire dans .well-known/acme-challenge dossier. Ce fichier contient un jeton pour valider le fait que vous possédez réellement le domaine pour lequel vous essayez de récupérer les certificats. N'oubliez pas que ledit dossier relève de la racine Web du domaine.

Par conséquent, il est impératif que Let's Encrypt puisse accéder au fichier temporaire pour vérifier le domaine. Pour accorder l'accès, vous devez configurer NGINX puisqu'il est le propriétaire de la racine Web du domaine. Ajoutez un bloc d'emplacement spécifiquement pour le dossier /.well-known/acme-challenge cela permettra à Let's Encrypt de placer un jeton pour la vérification de domaine. Pour ce faire, modifiez le fichier de configuration NGINX pour votre hôte virtuel. N'oubliez pas d'ajuster le dossier racine en fonction de votre environnement.



    server {
            listen 80;
            server_name SUBDOMAIN.DOMAIN.TLD;
            root /var/www/html/wordpress;
            ...
            ...
            ...
            location /.well-known/acme-challenge {
               allow all; 
               default_type "text/plain";
            }
           ...
           ...
    }

Vérifiez que la syntaxe du fichier de configuration est correcte et redémarrez NGINX :


# nginx -t 
# systemctl restart nginx

Configurer le pare-feu UFW

Ubuntu 18.04 est livré avec un gestionnaire de pare-feu par défaut UFW et si vous l'avez déjà activé et qu'il s'exécute sur votre serveur, aucune connexion HTTP ou HTTPS ne sera autorisée à atteindre le serveur NGINX.

Il est également possible que vous essayiez d'installer des certificats sur un serveur précédemment configuré et que les règles de pare-feu soient déjà présentes. Bien sûr, vous pouvez lister les règles de pare-feu en utilisant ufw status sur votre serveur avant de procéder à l'activation des connexions HTTP et HTTPS sur votre serveur Ubuntu 18.04.

Exécutez l'ensemble de commandes suivant dans le terminal pour autoriser les connexions HTTP et HTTPS sur votre serveur.


# ufw status
# ufw allow http
# ufw allow https
# ufw reload

Demander un certificat SSL Let's Encrypt

Demandons un certificat SSL pour le domaine choisi en utilisant le client Let's Encrypt que nous avons cloné précédemment. Bien qu'il existe de nombreuses options de configuration disponibles que l'on peut utiliser avec le script Let's Encrypt lors de la demande d'un certificat, nous n'utiliserons que les options suivantes.

  1. certainement :Cette option indique au script letsencrypt d'obtenir uniquement le certificat SSL. Nous ferons la configuration de NGINX manuellement plus tard.
  2. racine Web  :Cette option spécifie le plug-in Webroot à utiliser dans le processus de validation du nom de domaine.
  3. chemin racine Web  :Cette option définit la racine du domaine et doit pointer vers l'emplacement du site Web que vous avez configuré dans la configuration NGINX.
  4. acceptez  :signifie accepter les conditions d'utilisation de Let's Encrypt.
  5. courriel  :L'e-mail est utilisé pour recevoir un avis d'expiration de Let's Encrypt, mais peut également être utilisé pour récupérer la clé perdue.
  6. d :Cette option spécifie le nom de domaine pour lequel le certificat sera demandé.

En combinant maintenant les options ci-dessus avec le script client Letsencrypt, demandez un certificat à l'aide des commandes suivantes :


# cd /usr/local/letsencrypt
# ./letsencrypt-auto certonly --agree-tos --email [email protected] --webroot --webroot-path /var/www/html/wordpress -d SUBDOMAIN.DOMAIN.TLD

Récupération Lets Encrypt Certificate avec succès

Le script Let's Encrypt vous montrera une petite note une fois que les certificats SSL ont été récupérés avec succès et les certificats seront stockés dans le /etc/letsencrypt/live dossier.

Configurer NGINX pour le certificat SSL Let's Encrypt

À ce stade, la chaîne de certificats Let's Encrypt a été enregistrée avec succès sur votre serveur. Passez maintenant à la configuration du fichier d'hôte virtuel pour un serveur Web NGINX sécurisé compatible SSL.

Générer une clé Diffie-Hellman

Bien que l'utilisation de la clé Diffie-Hellman soit facultative lors de la configuration des certificats Let's Encrypt avec NGINX, elle est principalement utilisée comme méthode d'échange sécurisé de clés de chiffrement à utiliser dans le certificat Let's encrypt.


# mkdir -p /etc/nginx/ssl
# cd /etc/nginx/ssl
# openssl dhparam -out /etc/nginx/ssl/dhparam.pem 4096

J'ai placé le fichier de paramètres DH dans le /etc/nginx/ssl répertoire simplement pour plus de commodité. Vous pouvez placer le fichier à un autre emplacement.

Configurer les paramètres SSL

Ensuite, ajoutez des paramètres pour la connexion SSL comme les versions de protocole, les suites de chiffrement, la session, les en-têtes que votre serveur doit prendre en charge dans un fichier séparé.

Cela mettra en place une suite de chiffrement forte qui activera le Forward Secrecy dans la mesure du possible. De plus, nous allons également activer HSTS et HPKP pour renforcer le serveur NGINX pour les connexions SSL. Cela permettra à une configuration SSL solide et à l'épreuve du temps d'obtenir une note A+ au test SSL de Qualys Labs .


# vi /etc/nginx/conf.d/ssl.conf
ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
server_tokens off;
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:50m;
#Online Certificate Status Protocol Stapling
ssl_stapling on;
ssl_stapling_verify on;
ssl_session_tickets off;
#HTTP Strict Transport Security
add_header Strict-Transport-Security "max-age=63072000; includeSubdomains; preload";
ssl_trusted_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/chain.pem;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
add_header X-Frame-Options DENY;
add_header X-XSS-Protection "1; mode=block";
add_header X-Content-Type-Options nosniff;
add_header X-Robots-Tag none;

Modifier l'hôte virtuel NGINX

Enfin, modifiez les blocs de serveur NGINX pour le domaine que vous avez choisi. Accédez à l'emplacement par défaut des blocs de serveur NGINX qui est /etc/nginx/sites-available et modifiez le fichier d'hôte virtuel NGINX.


# vi /etc/nginx/sites-available/your_nginx_file.conf

server {
         listen 80;
         listen [::]:80;
         server_name SUBDOMAIN.DOMAIN.TLD;
         return 301 https://$host$request_uri;
}
...
...

Le bloc de serveur ci-dessus demande à NGINX d'écouter toute demande entrante dans le port 80 pour le domaine SUBDOMAIN.DOMAIN.TLD et redirigez-le vers la section https, dont la configuration est donnée ci-dessous.


...
...
server {
        listen 443 ssl http2;
        listen [::]:443 ssl http2;

        root   /var/www/html/wordpress;
        index index.html index.php index.htm;

        server_name  SUBDOMAIN.DOMAIN.TLD;
        error_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-error.log debug;
        access_log /var/log/nginx/SUBDOMAIN.DOMAIN.TLD-access.log;

        ssl_certificate /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/SUBDOMAIN.DOMAIN.TLD/privkey.pem;

        include /etc/nginx/conf.d/ssl.conf;

        location /.well-known/acme-challenge {
               allow all;
               default_type "text/plain";
        }

        location / {
            try_files $uri $uri/ =404;
        }

        location = /favicon.ico {
                log_not_found off;
                access_log off;
        }

        location = /robots.txt {
                allow all;
                log_not_found off;
                access_log off;
        }

        location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
                expires max;
                log_not_found off;
        }
}

Vérifiez le fichier de configuration pour toute erreur syntaxique :


# nginx -t 

Pour activer le bloc serveur, créez un lien symbolique du fichier de configuration de l'hôte virtuel ci-dessus dans /etc/nginx/sites-enabled dossier.


# cd /etc/nginx/sites-enabled
# ln -s ../sites-available/your_nginx_file.conf .

Rechargez NGINX pour appliquer les nouveaux paramètres :


# systemctl reload nginx

Pour analyser la configuration des paramètres SSL ci-dessus, pointez votre navigateur vers SSL Labs Test et saisissez votre nom de domaine et cliquez sur "Soumettre". Attendez une minute pour voir le résumé du test. Une note A+ signifie que nous avons inclus la plupart des options SSL dans le processus de sécurisation du serveur NGINX.

Renouvellement automatique du certificat Let's Encrypt

Les certificats Let's Encrypt sont valables 90 jours. L'objectif est de limiter les dommages causés par la compromission des clés et d'encourager l'automatisation.

Pour automatiser le processus de renouvellement des certificats, créez une tâche cron à l'aide de crontab et ajoutez une ligne de script qui s'exécutera une fois par semaine pour renouveler les certificats lorsqu'ils sont sur le point d'expirer.


# crontab -e
45 4 * * 6 cd /usr/local/letsencrypt/ && ./certbot-auto renew && systemctl restart nginx

Le script d'une seule ligne ci-dessus s'exécutera tous les samedis pour vérifier si les certificats doivent être renouvelés et, le cas échéant, il renouvellera les certificats suivi du redémarrage du serveur NGINX.

Notez qu'il n'est pas entièrement optimisé car le serveur NGINX sera redémarré même si le certificat n'est pas renouvelé. La meilleure option serait d'écrire un script personnalisé pour renouveler le certificat SSL et redémarrer le serveur NGINX si les certificats sont effectivement renouvelés.

Conclusion

Dans cet article, nous avons appris comment installer la bibliothèque client Let’s Encrypt, demander un certificat pour votre domaine et comment configurer les certificats SSL Let’s Encrypt avec NGINX. De plus, un exemple de cronjob vous montre également comment gérer régulièrement le processus de renouvellement du certificat.


Linux
  1. Comment sécuriser un compte compatible cPanel avec un certificat SSL Lets Encrypt

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

  3. Comment configurer WSO2 avec le certificat Let's Encrypt

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

  5. Comment installer Let's Encrypt SSL avec Apache sur Debian 11

Comment installer Let's Encrypt SSL avec Nginx sur Ubuntu 16.04 LTS

Comment sécuriser un nom d'hôte Plesk avec SSL

Sécurisez Nginx avec le certificat SSL Let's Encrypt sur Ubuntu 18.04

Comment sécuriser le serveur LEMP avec Let's Encrypt Free SSL sur Ubuntu 18.04 VPS

Comment sécuriser Nginx avec Let's Encrypt sur CentOS 8

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