Comment héberger un site web en utilisant Cloudflare et Nginx sur Ubuntu 20.04

L'auteur a choisi la Electronic Frontier Foundation comme récipiendaire d'un don dans le cadre du programme Write for DOnations.

Introduction

Cloudflare est un service qui se situe entre le visiteur et le serveur du propriétaire du site web, agissant comme un proxy inverse pour les sites web. Cloudflare fournit un Réseau de Diffusion de Contenu (CDN), ainsi que des services d'atténuation des DDoS et de serveurs de noms de domaine distribués.

Nginx est un serveur web populaire qui héberge certains des sites les plus importants et les plus fréquentés d'Internet. Il est fréquent que des entreprises exploitent des sites web avec Nginx et utilisent Cloudflare comme fournisseur de CDN et de DNS.

Dans ce tutoriel, vous allez sécuriser votre site web servi par Nginx avec un certificat Origin CA de Cloudflare et ensuite configurer Nginx pour utiliser des requêtes pull authentifiées. Les avantages de cette configuration tiennent au fait que vous bénéficiez du CDN et de la résolution DNS rapide de Cloudflare tout en vous assurant que toutes les connexions passent par Cloudflare. Cela empêche toute requête malveillante d'atteindre votre serveur.

Conditions préalables

Pour terminer ce tutoriel, vous aurez besoin des éléments suivants :

  • Un serveur Ubuntu 20.04 configuré en suivant le guide Configuration initiale de serveur Ubuntu 20.04, comprenant un non-root user avec privilèges sudo et un pare-feu.
  • Nginx installé sur votre serveur. Vous pouvez suivre notre guide sur Comment installer Nginx sur Ubuntu 20.04.
  • Un compte Cloudflare
  • Un domaine enregistré ajouté à votre compte Cloudflare, qui pointe vers votre serveur Nginx. Notre guide sur Comment atténuer les attaques DDoS contre votre site web avec Cloudflare peut vous aider à mettre en place cette solution. Notre introduction à la terminologie, aux composants et aux concepts de DNS peut également vous aider.
  • Un bloc de serveur Nginx configuré pour votre domaine, ce que vous pouvez faire en suivant l'étape 5 de Comment installer Nginx sur Ubuntu 20.04.

Étape 1 – Génération d'un certificat Origin CA TLS

L'Origin CA de Cloudflare vous permet de générer un certificat TLS gratuit signé par Cloudflare à installer sur votre serveur Nginx. En utilisant le certificat TLS généré par Cloudflare, vous pouvez sécuriser la connexion entre les serveurs de Cloudflare et votre serveur Nginx.

Pour générer un certificat avec Origin CA, connectez-vous à votre compte Cloudflare dans un navigateur web. Sélectionnez le domaine que vous souhaitez sécuriser et naviguez jusqu'à la section SSL/TLS de votre tableau de bord Cloudflare. De là, naviguez jusqu'à l'onglet Origin Server (Serveur d'origine) et cliquez sur le bouton Create Certificate (Créer un certificat) :

Option de création de certificat dans le tableau de bord de Cloudflare

Laissez l'option par défaut de Let Cloudflare generate a private key and a CSR (Laisser Cloudflare générer une clé privée et une RSE) sélectionnée.

Options de l'interface graphique d'Origin CA

Cliquez sur Next (Suivant) et vous verrez un dialogue avec le Origin Certificate (certificat d'origine) et la Private key (clé privée). Vous devez transférer à la fois le certificat d'origine et la clé privée de Cloudflare vers votre serveur. Pour des raisons de sécurité, les informations relatives à la clé privée ne s'afficheront plus. Copiez donc la clé sur votre serveur avant de cliquer sur Ok.

Dialogue montrant le certificat d'origine et la clé privée

Vous utiliserez le répertoire /etc/ssl du serveur pour conserver les fichiers de certificat d'origine et la clé privée. Le dossier existe déjà sur le serveur.

Tout d'abord, copiez le contenu du certificat d'origine affiché dans la boîte de dialogue de votre navigateur.

Ensuite, sur votre serveur, ouvrez /etc/ssl/cert.pem dans votre éditeur de texte préféré :

  • sudo nano /etc/ssl/cert.pem

Ajoutez le contenu du certificat dans le fichier. Ensuite, sauvegardez et quittez l'éditeur.

Retournez ensuite à votre navigateur et copiez le contenu de la clé privée. Ouvrez le fichier /etc/ssl/key.pem pour le modifier :

  • sudo nano /etc/ssl/key.pem

Collez la clé privée dans le fichier, enregistrez le fichier et quittez l'éditeur.

Note : parfois, lorsque vous copiez le certificat et la clé à partir du tableau de bord Cloudflare et que vous les collez dans les fichiers correspondants sur le serveur, des lignes vierges sont insérées. Nginx considérera ces certificats et ces clés comme non valides. Par conséquent, veillez à ce qu'il n'y ait pas de lignes blanches dans vos fichiers.

Attention : le certificat Origin CA de Cloudflare n'est fiable que sur Cloudflare et ne doit donc être utilisé que par les serveurs d'origine qui sont activement connectés à Cloudflare. Si, à un moment donné, vous mettez en pause ou désactivez Cloudflare, votre certificat Origin CA affichera une erreur de certificat non fiable.

Maintenant que vous avez copié les fichiers de clés et de certificats sur votre serveur, vous devez mettre à jour la configuration de Nginx pour les utiliser.

Étape 2 – Installation du certificat d'origine AC dans Nginx

Dans la section précédente, vous avez généré un certificat d'origine et une clé privée en utilisant le tableau de bord de Cloudflare et avez enregistré les fichiers sur votre serveur. Vous allez maintenant mettre à jour la configuration de Nginx pour votre site afin d'utiliser le certificat d'origine et la clé privée pour sécuriser la connexion entre les serveurs de Cloudflare et votre serveur.

Tout d'abord, assurez-vous que UFW autorisera le trafic HTTPS. Activez Nginx Full, qui ouvrira à la fois le port 80 (HTTP) et le port 443 (HTTPS) :

  • sudo ufw allow 'Nginx Full'

Relancez maintenant UFW :

  • sudo ufw reload

Enfin, vérifiez que vos nouvelles règles sont autorisées et que UFW est actif :

  • sudo ufw status

Vous verrez un résultat similaire à ce qui suit :

OutputStatus: active  To                         Action      From --                         ------      ---- OpenSSH                    ALLOW       Anywhere Nginx Full                ALLOW       Anywhere OpenSSH (v6)               ALLOW       Anywhere (v6) Nginx Full (v6)           ALLOW       Anywhere (v6) 

Vous êtes maintenant prêt à ajuster votre bloc serveur Nginx. Nginx crée un bloc serveur par défaut lors de l'installation. Supprimez-le s'il existe encore, car vous avez déjà configuré un bloc de serveur personnalisé pour votre domaine :

  • sudo rm /etc/nginx/sites-enabled/default

Ensuite, ouvrez le fichier de configuration Nginx pour votre domaine :

  • sudo nano /etc/nginx/sites-available/your_domain

Le dossier devrait ressembler à ceci :

/etc/nginx/sites-available/your_domain

server {         listen 80;         listen [::]:80;          root /var/www/your_domain/html;         index index.html index.htm index.nginx-debian.html;          server_name your_domain www.your_domain;          location / {                 try_files $uri $uri/ =404;         } }  

Vous allez modifier le fichier de configuration de Nginx pour faire ce qui suit :

  • Ecoutez sur le port 80 et redirigez toutes les requêtes pour utiliser le https.
  • Écoutez sur le port 443 et utilisez le certificat d'origine ainsi que la clé privée ajoutés dans la section précédente.

Modifiez le fichier de manière à ce qu'il ressemble à ce qui suit :

/etc/nginx/sites-available/your_domain

server {     listen 80;     listen [::]:80;     server_name your_domain www.your_domain;     return 302 https://$server_name$request_uri; }  server {      # SSL configuration      listen 443 ssl http2;     listen [::]:443 ssl http2;     ssl_certificate         /etc/ssl/cert.pem;     ssl_certificate_key     /etc/ssl/key.pem;      server_name your_domain www.your_domain;      root /var/www/your_domain/html;     index index.html index.htm index.nginx-debian.html;       location / {             try_files $uri $uri/ =404;     } } 

Enregistrez le fichier et quittez l'éditeur.

Ensuite, vérifiez qu'il n'y a aucune erreur de syntaxe dans vos fichiers de configuration Nginx :

  • sudo nginx -t

Si vous ne trouvez aucun problème, redémarrez Nginx pour permettre vos modifications :

  • sudo systemctl restart nginx

Allez maintenant dans la section SSL/TLS du tableau de bord Cloudflare, naviguez jusqu'à l'onglet Overview (Vue d'ensemble), et changez le mode de cryptage SSL/TLS en mode Full (strict). Ceci informe Cloudflare de toujours crypter la connexion entre Cloudflare et votre serveur Nginx d'origine.

Activez le mode SSL Full(strict) dans le tableau de bord de Cloudflare

Visitez maintenant votre site web à l'adresse https://your_domain pour vérifier qu'il est correctement configuré. Vous verrez votre page d'accueil s'afficher et le navigateur vous indiquera que le site est sécurisé.

Dans la section suivante, vous allez mettre en place des Authenticated Origin Pulls (Extractions à l'Origine Authentifiée) pour vérifier que votre serveur d'origine parle bien à Cloudflare et non à un autre serveur. Ce faisant, Nginx sera configuré pour n'accepter que les requêtes qui utilisent un certificat client valide de Cloudflare ; toutes les requêtes qui ne sont pas passées par Cloudflare seront abandonnées.

Étape 3 – Configuration des Extractions à l'Origine Authentifiée

Le certificat Origin CA aidera Cloudflare à vérifier qu'il parle au bon serveur d'origine. Cette étape utilisera l'authentification du client TLS pour vérifier que votre serveur Nginx d'origine parle à Cloudflare.

Dans une poignée de main TLS authentifiée par le client, les deux parties fournissent un certificat à vérifier. Le serveur d'origine est configuré pour n'accepter que les requêtes qui utilisent un certificat client valide de Cloudflare. Les requêtes qui ne sont pas passées par Cloudflare seront abandonnées car elles n'auront pas le certificat de Cloudflare. Cela signifie que les attaquants ne peuvent pas contourner les mesures de sécurité de Cloudflare et se connecter directement à votre serveur Nginx.

Cloudflare présente des certificats signés par une autorité de certification (AC) avec le certificat suivant :

-----BEGIN CERTIFICATE----- MIIGCjCCA/KgAwIBAgIIV5G6lVbCLmEwDQYJKoZIhvcNAQENBQAwgZAxCzAJBgNV BAYTAlVTMRkwFwYDVQQKExBDbG91ZEZsYXJlLCBJbmMuMRQwEgYDVQQLEwtPcmln aW4gUHVsbDEWMBQGA1UEBxMNU2FuIEZyYW5jaXNjbzETMBEGA1UECBMKQ2FsaWZv cm5pYTEjMCEGA1UEAxMab3JpZ2luLXB1bGwuY2xvdWRmbGFyZS5uZXQwHhcNMTkx MDEwMTg0NTAwWhcNMjkxMTAxMTcwMDAwWjCBkDELMAkGA1UEBhMCVVMxGTAXBgNV BAoTEENsb3VkRmxhcmUsIEluYy4xFDASBgNVBAsTC09yaWdpbiBQdWxsMRYwFAYD VQQHEw1TYW4gRnJhbmNpc2NvMRMwEQYDVQQIEwpDYWxpZm9ybmlhMSMwIQYDVQQD ExpvcmlnaW4tcHVsbC5jbG91ZGZsYXJlLm5ldDCCAiIwDQYJKoZIhvcNAQEBBQAD ggIPADCCAgoCggIBAN2y2zojYfl0bKfhp0AJBFeV+jQqbCw3sHmvEPwLmqDLqynI 42tZXR5y914ZB9ZrwbL/K5O46exd/LujJnV2b3dzcx5rtiQzso0xzljqbnbQT20e ihx/WrF4OkZKydZzsdaJsWAPuplDH5P7J82q3re88jQdgE5hqjqFZ3clCG7lxoBw hLaazm3NJJlUfzdk97ouRvnFGAuXd5cQVx8jYOOeU60sWqmMe4QHdOvpqB91bJoY QSKVFjUgHeTpN8tNpKJfb9LIn3pun3bC9NKNHtRKMNX3Kl/sAPq7q/AlndvA2Kw3 Dkum2mHQUGdzVHqcOgea9BGjLK2h7SuX93zTWL02u799dr6Xkrad/WShHchfjjRn aL35niJUDr02YJtPgxWObsrfOU63B8juLUphW/4BOjjJyAG5l9j1//aUGEi/sEe5 lqVv0P78QrxoxR+MMXiJwQab5FB8TG/ac6mRHgF9CmkX90uaRh+OC07XjTdfSKGR PpM9hB2ZhLol/nf8qmoLdoD5HvODZuKu2+muKeVHXgw2/A6wM7OwrinxZiyBk5Hh CvaADH7PZpU6z/zv5NU5HSvXiKtCzFuDu4/Zfi34RfHXeCUfHAb4KfNRXJwMsxUa +4ZpSAX2G6RnGU5meuXpU5/V+DQJp/e69XyyY6RXDoMywaEFlIlXBqjRRA2pAgMB AAGjZjBkMA4GA1UdDwEB/wQEAwIBBjASBgNVHRMBAf8ECDAGAQH/AgECMB0GA1Ud DgQWBBRDWUsraYuA4REzalfNVzjann3F6zAfBgNVHSMEGDAWgBRDWUsraYuA4REz alfNVzjann3F6zANBgkqhkiG9w0BAQ0FAAOCAgEAkQ+T9nqcSlAuW/90DeYmQOW1 QhqOor5psBEGvxbNGV2hdLJY8h6QUq48BCevcMChg/L1CkznBNI40i3/6heDn3IS zVEwXKf34pPFCACWVMZxbQjkNRTiH8iRur9EsaNQ5oXCPJkhwg2+IFyoPAAYURoX VcI9SCDUa45clmYHJ/XYwV1icGVI8/9b2JUqklnOTa5tugwIUi5sTfipNcJXHhgz 6BKYDl0/UP0lLKbsUETXeTGDiDpxZYIgbcFrRDDkHC6BSvdWVEiH5b9mH2BON60z 0O0j8EEKTwi9jnafVtZQXP/D8yoVowdFDjXcKkOPF/1gIh9qrFR6GdoPVgB3SkLc 5ulBqZaCHm563jsvWb/kXJnlFxW+1bsO9BDD6DweBcGdNurgmH625wBXksSdD7y/ fakk8DagjbjKShYlPEFOAqEcliwjF45eabL0t27MJV61O/jHzHL3dknXeE4BDa2j bA+JbyJeUMtU7KMsxvx82RmhqBEJJDBCJ3scVptvhDMRrtqDBW5JShxoAOcpFQGm iYWicn46nPDjgTU0bX1ZPpTpryXbvciVL5RkVBuyX2ntcOLDPlZWgxZCBp96x07F AnOzKgZk4RzZPNAxCXERVxajn/FLcOhglVAKo5H0ac+AitlQ0ip55D2/mf8o72tM fVQ6VpyjEXdiIXWUq/o= -----END CERTIFICATE----- 

Vous pouvez également télécharger le certificat directement sur le site de Cloudflare ici.

Copiez ce certificat.

Puis, créez le fichier /etc/ssl/cloudflare.crt pour contenir le certificat de Cloudflare :

  • sudo nano /etc/ssl/cloudflare.crt

Ajoutez le certificat au fichier. Ensuite, enregistrez le fichier et quittez l'éditeur.

Mettez maintenant à jour votre configuration Nginx pour utiliser les Extractions d'Origine Authentifiée TLS. Ouvrez le fichier de configuration de votre domaine :

  • sudo nano /etc/nginx/sites-available/your_domain

Ajoutez les directives ssl_client_certificate et ssl_verify_client, comme indiqué dans l'exemple suivant :

/etc/nginx/sites-available/your_domain

. . .  server {      # SSL configuration      listen 443 ssl http2;     listen [::]:443 ssl http2;     ssl_certificate         /etc/ssl/cert.pem;     ssl_certificate_key     /etc/ssl/key.pem;     ssl_client_certificate /etc/ssl/cloudflare.crt;     ssl_verify_client on;      . . . 

Enregistrez le fichier et quittez l'éditeur.

Ensuite, testez Nginx pour vous assurer qu'il n'y a pas d'erreurs de syntaxe dans votre configuration Nginx :

  • sudo nginx -t

Si aucun problème n'a été trouvé, redémarrez Nginx pour que vos modifications soient prises en compte :

  • sudo systemctl restart nginx

Enfin, pour activer les Extractions Authentifiées, ouvrez la section SSL/TLS dans le tableau de bord Cloudflare, naviguez jusqu'à l'onglet Origin Server (Serveur d'Origine) et cochez l'option Authenticated Origin Pulls.

Activez les Extractions d'Origine Authentifiée

Visitez maintenant votre site web à l'adresse https://your_domain pour vérifier qu'il est correctement configuré. Comme auparavant, vous verrez s'afficher votre page d'accueil.

Pour vérifier que votre serveur n'accepte que les demandes signées par l'AC de Cloudflare, basculez l'option Authenticated Origin Pulls pour la désactiver, puis rechargez votre site web. Le message d'erreur suivant devrait apparaître :

Message d'erreur

Votre serveur d'origine génère une erreur si l'AC de Cloudflare ne signe pas une requête.

Remarque : la plupart des navigateurs mettent les requêtes en cache. Pour voir le changement ci-dessus, vous pouvez donc utiliser le mode de navigation Incognito/Privé dans votre navigateur. Pour éviter que Cloudflare ne mette les requêtes en cache pendant que vous configurez votre site web, naviguez jusqu'à l'aperçu dans le tableau de bord Cloudflare et basculez en Development Mode (Mode Développement).

Maintenant que vous savez qu'il fonctionne correctement, retournez à la section SSL/TLS du tableau de bord Cloudflare, naviguez jusqu'à l'onglet Origin Server (Serveur d'origine) et activez à nouveau l'option Authenticated Origin Pulls pour l'activer.

Conclusion

Dans ce tutoriel, vous avez sécurisé votre site web alimenté par Nginx en cryptant le trafic entre Cloudflare et le serveur Nginx à l'aide d'un certificat Origin CA de Cloudflare. Vous avez ensuite configuré des Authenticated Origin Pulls (Extractions d'Origine Authentifiée) sur le serveur Nginx pour vous assurer qu'il n'accepte que les requêtes des serveurs Cloudflare, empêchant ainsi toute autre personne de se connecter directement au serveur Nginx.