Comment héberger un site Web en utilisant Cloudflare et Nginx sur Ubuntu 22.04

L’auteur a sélectionné l’Electronic Frontier Foundation pour recevoir une donation dans le cadre du programme Write for Donations.

Introduction

Cloudflare est un service qui se place 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 attaques par déni de service distribué (DDoS) et de serveur de noms de domaine distribué.

Nginx est un serveur web populaire responsable de l’hébergement de certains des sites les plus grands et les plus fréquentés sur Internet. Il est courant que les organisations servent des sites web avec Nginx et utilisent Cloudflare comme CDN et fournisseur DNS.

Dans ce tutoriel, vous sécuriserez votre site web servi par Nginx avec un certificat Origin CA de Cloudflare puis configurerez Nginx pour utiliser des demandes de tirage authentifiées. Les avantages de l’utilisation de cette configuration sont que vous bénéficiez du CDN de Cloudflare et d’une résolution DNS rapide tout en vous assurant que toutes les connexions passent par Cloudflare. Cela empêche toute demande malveillante d’atteindre votre serveur.

Prérequis

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

Étape 1 — Génération d’un certificat TLS Cloudflare CA d’origine

Le certificat Cloudflare Origin CA 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 accédez à la section SSL/TLS de votre tableau de bord Cloudflare. De là, accédez à l’onglet Serveur d’origine et cliquez sur le bouton Créer un certificat :

Laissez l’option par défaut Générer une clé privée et un CSR avec Cloudflare sélectionnée.

Cliquez sur Créer et vous verrez une boîte de dialogue avec le Certificat d’origine et la 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 de la Clé privée ne seront pas affichées à nouveau, donc copiez la clé sur votre serveur avant de cliquer sur Ok.

Vous utiliserez le répertoire /etc/ssl sur le serveur pour stocker les fichiers de certificat d’origine et de 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é :

  1. sudo nano /etc/ssl/cert.pem

Collez le contenu du certificat dans le fichier. Enregistrez ensuite et quittez l’éditeur. Si vous utilisez nano, appuyez sur Ctrl+X, puis lorsque vous y êtes invité, sur Y puis sur Entrée.

Ensuite, retournez dans votre navigateur et copiez le contenu de la Clé privée. Ouvrez le fichier /etc/ssl/key.pem pour l’éditer :

  1. 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é depuis le tableau de bord de Cloudflare et que vous les collez dans les fichiers pertinents sur le serveur, des lignes vides sont insérées. Nginx considérera de tels certificats et clés comme invalides, alors assurez-vous qu’il n’y a pas de lignes vides dans vos fichiers.

Avertissement: Le certificat Origin CA de Cloudflare est uniquement approuvé par Cloudflare et ne doit donc être utilisé que par des 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 générera une erreur de certificat non approuvé.

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

Étape 2 — Installation du certificat Origin CA 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 enregistré les fichiers sur votre serveur. Maintenant, vous allez 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, ce qui ouvrira à la fois le port 80 (HTTP) et le port 443 (HTTPS) :

  1. sudo ufw allow 'Nginx Full'

Maintenant, rechargez UFW :

  1. sudo ufw reload

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

  1. sudo ufw status

Vous verrez une sortie comme ceci:

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

Maintenant, vous êtes 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 serveur personnalisé pour votre domaine:

  1. sudo rm /etc/nginx/sites-enabled/default

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

  1. sudo nano /etc/nginx/sites-available/your_domain

Le fichier 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 modifierez le fichier de configuration Nginx pour faire ce qui suit:

  • Écouter sur le port 80 et rediriger toutes les demandes pour utiliser https.
  • Écouter sur le port 443 et utiliser le certificat d’origine et la clé privée ajoutés dans la section précédente.

Modifiez le fichier pour 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 {

    # Configuration SSL

    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, testez pour vous assurer qu’il n’y a pas d’erreurs de syntaxe dans aucun de vos fichiers de configuration Nginx:

  1. sudo nginx -t

Si vous n’avez trouvé aucun problème, redémarrez Nginx pour activer vos modifications:

  1. sudo systemctl restart nginx

Maintenant, allez dans la section SSL/TLS du tableau de bord de Cloudflare, accédez à l’onglet Vue d’ensemble et changez le mode de chiffrement SSL/TLS en Complet (strict). Cela informe Cloudflare de toujours chiffrer la connexion entre Cloudflare et votre serveur Nginx d’origine.

Visitez maintenant votre site Web à l’adresse https://votre_domaine pour vérifier qu’il est correctement configuré. Vous verrez votre page d’accueil affichée et le navigateur signalera que le site est sécurisé.

Pour consulter les détails de votre certificat, accédez aux Outils de développement de votre navigateur, sélectionnez l’onglet Sécurité, puis Afficher le certificat.

Remarque : Vous pouvez remarquer que votre certificat ne répertorie pas Cloudflare comme l’émetteur. Cela est dû au fait que Cloudflare peut utiliser d’autres autorités de certification, telles que Let’s Encrypt. Pour une liste complète, consultez la documentation produit de Cloudflare pour les autorités de certification.

Dans la prochaine section, vous configurerez les Tirages d’origine authentifiés pour vérifier que votre serveur d’origine communique effectivement avec Cloudflare et non avec un autre serveur. Ce faisant, Nginx sera configuré pour n’accepter que les demandes utilisant un certificat client valide provenant de Cloudflare ; toutes les demandes qui n’ont pas transité par Cloudflare seront rejetées.

Étape 3 — Configuration des Tirages d’origine authentifiés

Le certificat Origin CA aidera Cloudflare à vérifier qu’il communique avec le bon serveur d’origine. Cette étape utilisera l’authentification client TLS pour vérifier que votre serveur Nginx d’origine communique avec 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 demandes utilisant un certificat client valide provenant de Cloudflare. Les demandes qui ne sont pas passées par Cloudflare seront rejeté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 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 depuis la documentation de Cloudflare.

Copiez ce certificat.

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

  1. sudo nano /etc/ssl/cloudflare.crt

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

Maintenant, mettez à jour votre configuration Nginx pour utiliser les tirages d’origine authentifiés TLS. Ouvrez le fichier de configuration pour votre domaine :

  1. 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 {

    # Configuration SSL

    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 :

  1. sudo nginx -t

Si aucun problème n’a été trouvé, redémarrez Nginx pour activer vos modifications :

  1. sudo systemctl restart nginx

Enfin, pour activer les Tirages Authentifiés, ouvrez la section SSL/TLS dans le tableau de bord Cloudflare, accédez à l’onglet Serveur d’origine et basculez l’option Tirages d’origine authentifiés.

Visitez maintenant votre site Web à https://your_domain pour vérifier qu’il a été configuré correctement. Comme précédemment, vous verrez votre page d’accueil affichée.

Pour vérifier que votre serveur n’acceptera que les demandes signées par le CA de Cloudflare, basculez l’option Tirages d’origine authentifiés pour la désactiver, puis rechargez votre site Web. Vous devriez obtenir le message d’erreur suivant :

Votre serveur d’origine génère une erreur si le CA de Cloudflare ne signe pas une demande.

Remarque : La plupart des navigateurs mettront en cache les demandes, donc pour voir le changement ci-dessus, vous pouvez utiliser le mode Incognito/Privé dans votre navigateur. Pour empêcher Cloudflare de mettre en cache les demandes pendant que vous configurez votre site Web, accédez à Vue d’ensemble dans le tableau de bord Cloudflare et basculez Mode développement.

Maintenant que vous savez que cela fonctionne correctement, retournez à la section SSL/TLS dans le tableau de bord Cloudflare, accédez à l’onglet Serveur d’origine et basculez à nouveau l’option Tirages d’origine authentifiés pour l’activer.

Conclusion

Dans ce tutoriel, vous avez sécurisé votre site web alimenté par Nginx en chiffrant 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 sur le serveur Nginx pour vous assurer qu’il n’accepte que les demandes des serveurs Cloudflare, empêchant ainsi toute autre personne de se connecter directement au serveur Nginx.

Source:
https://www.digitalocean.com/community/tutorials/how-to-host-a-website-using-cloudflare-and-nginx-on-ubuntu-22-04