Hoe een website te hosten met Cloudflare en Nginx op Ubuntu 22.04

De auteur koos de Electronic Frontier Foundation om een donatie te ontvangen als onderdeel van het Write for Donations-programma.

Introductie

Cloudflare is een dienst die zich tussen de bezoeker en de server van de eigenaar van de website bevindt en fungeert als een omgekeerde proxy voor websites. Cloudflare biedt een Content Delivery Network (CDN), evenals DDoS-mitigatie en gedistribueerde domeinnaamserverservices.

Nginx is een populaire webserver die verantwoordelijk is voor het hosten van enkele van de grootste en meest bezochte sites op het internet. Het is gebruikelijk dat organisaties websites hosten met Nginx en Cloudflare gebruiken als een CDN en DNS-provider.

In deze tutorial beveilig je je website die wordt gehost door Nginx met een Origin CA-certificaat van Cloudflare en configureer je vervolgens Nginx om geauthenticeerde pull-verzoeken te gebruiken. De voordelen van het gebruik van deze setup zijn dat je profiteert van Cloudflare’s CDN en snelle DNS-resolutie terwijl ervoor wordt gezorgd dat alle verbindingen via Cloudflare verlopen. Dit voorkomt dat kwaadaardige verzoeken je server bereiken.

Vereisten

Om deze handleiding te voltooien, heb je het volgende nodig:

Stap 1 — Genereren van een Origin CA TLS-certificaat

De Cloudflare Origin CA stelt je in staat een gratis TLS-certificaat te genereren dat is ondertekend door Cloudflare om te installeren op je Nginx-server. Door het Cloudflare gegenereerde TLS-certificaat te gebruiken, kun je de verbinding tussen de servers van Cloudflare en je Nginx-server beveiligen.

Om een certificaat te genereren met Origin CA, logt u in op uw Cloudflare-account in een webbrowser. Selecteer het domein dat u wilt beveiligen en ga naar het SSL/TLS-gedeelte van uw Cloudflare-dashboard. Navigeer vervolgens naar het Origin Server-tabblad en klik op de Certificaat maken-knop:

Laat de standaardoptie Privésleutel en CSR genereren met Cloudflare geselecteerd.

Klik op Maken en u ziet een dialoogvenster met het Origin-certificaat en de Privésleutel. U moet zowel het origin-certificaat als de privésleutel van Cloudflare naar uw server overbrengen. Om veiligheidsredenen wordt de Privésleutel-informatie niet opnieuw weergegeven, dus kopieer de sleutel naar uw server voordat u op Ok klikt.

U gebruikt de /etc/ssl-map op de server om de origin-certificaat- en privésleutelbestanden te bewaren. De map bestaat al op de server.

Kopieer eerst de inhoud van het Origin-certificaat dat wordt weergegeven in het dialoogvenster in uw browser.

Vervolgens opent u op uw server /etc/ssl/cert.pem in uw favoriete teksteditor:

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

Plak de certificaatinhoud in het bestand. Sla vervolgens op en sluit de editor af. Als u nano gebruikt, drukt u op Ctrl+X, typ dan wanneer daarom wordt gevraagd Y en druk op Enter.

Keer vervolgens terug naar uw browser en kopieer de inhoud van de Privésleutel. Open het bestand /etc/ssl/key.pem om te bewerken:

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

Plak de privésleutel in het bestand, sla het bestand op en sluit de editor af.

Opmerking: Soms worden er bij het kopiëren van het certificaat en de sleutel vanuit het Cloudflare-dashboard en het plakken ervan in de relevante bestanden op de server lege regels ingevoegd. Nginx zal dergelijke certificaten en sleutels als ongeldig beschouwen, dus zorg ervoor dat er geen lege regels in uw bestanden staan.

Waarschuwing: Het Origin CA-certificaat van Cloudflare wordt alleen vertrouwd door Cloudflare en moet daarom alleen worden gebruikt door oorspronkelijke servers die actief verbonden zijn met Cloudflare. Als u op enig moment Cloudflare pauzeert of uitschakelt, zal uw Origin CA-certificaat een foutmelding voor een niet-vertrouwd certificaat genereren.

Nu u de sleutel- en certificaatbestanden naar uw server hebt gekopieerd, moet u de Nginx-configuratie bijwerken om ze te gebruiken.

Stap 2 — Het Origin CA-certificaat installeren in Nginx

In de vorige sectie heeft u een origineel certificaat en een privésleutel gegenereerd met behulp van het Cloudflare-dashboard en de bestanden op uw server opgeslagen. Nu gaat u de Nginx-configuratie voor uw site bijwerken om het originele certificaat en de privésleutel te gebruiken om de verbinding tussen de servers van Cloudflare en uw server te beveiligen.

Zorg er eerst voor dat UFW HTTPS-verkeer toestaat. Activeer Nginx Full, wat zowel poort 80 (HTTP) als poort 443 (HTTPS) zal openen:

  1. sudo ufw allow 'Nginx Full'

Vernieuw nu UFW:

  1. sudo ufw reload

Controleer tot slot of uw nieuwe regels zijn toegestaan en of UFW actief is:

  1. sudo ufw status

Je zult een uitvoer zien zoals dit:

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

Nu ben je klaar om je Nginx serverblok aan te passen. Nginx maakt een standaard serverblok aan tijdens de installatie. Verwijder het als het nog bestaat, aangezien je al een aangepast serverblok hebt geconfigureerd voor je domein:

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

Vervolgens, open het Nginx configuratiebestand voor je domein:

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

Het bestand zou er zo uit moeten zien:

/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;
        }
}

Je zult het Nginx configuratiebestand aanpassen om het volgende te doen:

  • Luister op poort 80 en stuur alle verzoeken door om https te gebruiken.
  • Luister op poort 443 en gebruik het oorspronkelijke certificaat en de privésleutel die zijn toegevoegd in de vorige sectie.

Pas het bestand aan zodat het er als volgt uitziet:

/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 configuratie

    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;
    }
}

Sla het bestand op en verlaat de editor.

Vervolgens, test om ervoor te zorgen dat er geen syntaxisfouten zijn in een van je Nginx configuratiebestanden:

  1. sudo nginx -t

Als je geen problemen hebt gevonden, herstart dan Nginx om je wijzigingen in te schakelen:

  1. sudo systemctl restart nginx

Ga nu naar het SSL/TLS gedeelte van het Cloudflare dashboard, navigeer naar het Overzicht tabblad, en verander SSL/TLS versleutelingsmodus naar Volledig (strikt). Dit informeert Cloudflare om altijd de verbinding tussen Cloudflare en je oorspronkelijke Nginx server te versleutelen.

Bezoek nu je website op https://jouw_domein om te controleren of alles correct is ingesteld. Je zult je startpagina zien en de browser zal melden dat de site beveiligd is.

Om de details van uw certificaat te bekijken, gaat u naar de Ontwikkelaarshulpmiddelen van uw browser, selecteert u het tabblad Beveiliging en vervolgens Certificaat weergeven.

Opmerking: U kunt opmerken dat uw certificaat Cloudflare niet als uitgever vermeldt. Dit komt doordat Cloudflare mogelijk andere certificaatautoriteiten gebruikt, zoals Let’s Encrypt. Voor een volledige lijst kunt u de productsdocumentatie van Cloudflare over certificaatautoriteiten raadplegen.

In de volgende sectie zult u Geauthenticeerde Oorsprong Trekt instellen om te controleren of uw oorsprongsserver daadwerkelijk met Cloudflare praat en niet met een andere server. Hierdoor zal Nginx geconfigureerd worden om alleen verzoeken te accepteren die een geldig clientcertificaat van Cloudflare gebruiken; alle verzoeken die niet via Cloudflare zijn gegaan, zullen worden verworpen.

Stap 3 — Geauthenticeerde Oorsprong Trekt instellen

Het Oorsprong CA-certificaat zal Cloudflare helpen verifiëren dat het met de juiste oorsprongsserver communiceert. In deze stap zal TLS-clientauthenticatie worden gebruikt om te controleren of uw oorsprongsserver Nginx met Cloudflare communiceert.

In een TLS-handshake met client-authenticatie verstrekken beide partijen een certificaat om te worden geverifieerd. De oorspronkelijke server is geconfigureerd om alleen verzoeken te accepteren die een geldig clientcertificaat van Cloudflare gebruiken. Verzoeken die niet via Cloudflare zijn gegaan, worden afgewezen omdat ze geen certificaat van Cloudflare hebben. Dit betekent dat aanvallers de beveiligingsmaatregelen van Cloudflare niet kunnen omzeilen en rechtstreeks verbinding kunnen maken met uw Nginx-server.

Cloudflare presenteert certificaten die zijn ondertekend door een CA met het volgende certificaat:

-----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-----

U kunt het certificaat ook rechtstreeks downloaden vanuit de documentatie van Cloudflare.

Kopieer dit certificaat.

Maak vervolgens het bestand /etc/ssl/cloudflare.crt aan om het certificaat van Cloudflare vast te houden:

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

Voeg het certificaat toe aan het bestand. Sla het bestand vervolgens op en sluit de editor af.

Update nu uw Nginx-configuratie om TLS Authenticated Origin Pulls te gebruiken. Open het configuratiebestand voor uw domein:

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

Voeg de richtlijnen ssl_client_certificate en ssl_verify_client toe zoals weergegeven in het volgende voorbeeld:

/etc/nginx/sites-available/your_domain
. . .

server {

    # SSL configuratie

    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;

    . . .

Sla het bestand op en sluit de editor af.

Test vervolgens Nginx om ervoor te zorgen dat er geen syntaxisfouten zijn in uw Nginx-configuratie:

  1. sudo nginx -t

Als er geen problemen zijn gevonden, herstart u Nginx om uw wijzigingen in te schakelen:

  1. sudo systemctl restart nginx

Tenslotte, om Authenticated Pulls in te schakelen, opent u de SSL/TLS sectie in het Cloudflare-dashboard, gaat u naar het Oorspronkelijke Server tabblad en schakelt u de Geverifieerde Oorsprong Pulls optie in.

Bezoek nu uw website op https://uw_domein om te controleren of het correct is ingesteld. Zoals eerder, ziet u uw startpagina weergegeven.

Om te controleren of uw server alleen verzoeken accepteert die zijn ondertekend door Cloudflare’s CA, schakelt u de Geverifieerde Oorsprong Pulls optie uit en laadt u vervolgens uw website opnieuw. U zou de volgende foutmelding moeten krijgen:

Uw oorspronkelijke server genereert een fout als Cloudflare’s CA geen verzoek ondertekent.

Opmerking: De meeste browsers zullen verzoeken in cache opslaan, dus om de bovenstaande wijziging te zien kunt u de Incognito/Privé-browsing modus in uw browser gebruiken. Om te voorkomen dat Cloudflare verzoeken in de cache opslaat terwijl u uw website instelt, gaat u naar Overzicht in het Cloudflare-dashboard en schakelt u Ontwikkelingsmodus in.

Nu u weet dat het goed werkt, keert u terug naar de SSL/TLS sectie in het Cloudflare-dashboard, gaat u naar het Oorspronkelijke Server tabblad en schakelt u de Geverifieerde Oorsprong Pulls optie opnieuw in om deze te activeren.

Conclusie

In deze tutorial heb je je door Cloudflare aangedreven Nginx-website beveiligd door het verkeer tussen Cloudflare en de Nginx-server te versleutelen met behulp van een Origin CA-certificaat van Cloudflare. Vervolgens heb je Geauthenticeerde Origin Pulls ingesteld op de Nginx-server om ervoor te zorgen dat deze alleen verzoeken van Cloudflare-servers accepteert, waardoor wordt voorkomen dat anderen rechtstreeks verbinding maken met de Nginx-server.

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