Tutorial

Hosten einer Website mit Cloudflare und Nginx unter Ubuntu 20.04

NginxSecurityDNSUbuntu 20.04

Der Autor wählte die Electronic Frontier Foundation, um eine Spende im Rahmen des Programms Write for DOnations zu erhalten.

Einführung

Cloudflare ist ein Dienst, der sich zwischen dem Besucher und dem Server des Website-Eigentümers befindet und als Reverse-Proxy für Websites fungiert. Cloudflare bietet ein Content Delivery Network (CDN) sowie DDoS-Minderungs- und verteilte Domänennamen-Serverdienste.

Nginx ist ein beliebter Webserver, der für das Hosting einiger der größten und am stärksten frequentierten Websites im Internet verantwortlich ist. Es ist üblich, dass Unternehmen Websites mit Nginx bereitstellen und Cloudflare als CDN- und DNS-Anbieter verwenden.

In diesem Tutorial sichern Sie Ihre von Nginx bereitgestellte Website mit einem Origin CA-Zertifikat von Cloudflare und konfigurieren Nginx anschließend für die Verwendung authentifizierter Pull-Anforderungen. Die Verwendung dieses Setups bietet den Vorteil, dass Sie vom CDN und der schnellen DNS-Auflösung von Cloudflare profitieren und gleichzeitig sicherstellen, dass alle Verbindungen über Cloudflare erfolgen. Dadurch wird verhindert, dass böswillige Anforderungen Ihren Server erreichen.

Voraussetzungen

Bevor Sie mit diesem Tutorial beginnen, benötigen Sie Folgendes:

Schritt 1 — Generieren eines Origin CA TLS-Zertifikats

Mit der Cloudflare Origin-Zertifizierungsstelle können Sie ein kostenloses TLS-Zertifikat generieren, das von Cloudflare signiert wurde, um es auf Ihrem Nginx-Server zu installieren. Mit dem von Cloudflare generierten TLS-Zertifikat können Sie die Verbindung zwischen den Cloudflare-Servern und Ihrem Nginx-Server sichern.

Um ein Zertifikat mit Origin CA zu generieren, melden Sie sich in einem Webbrowser bei Ihrem Cloudflare-Konto an. Wählen Sie die Domäne aus, die Sie sichern möchten, und navigieren Sie zum Abschnitt SSL/TLS Ihres Cloudflare-Dashboards. Navigieren Sie von dort zur Registerkarte Origin Server und klicken Sie auf die Schaltfläche Zertifikat erstellen:

Erstellen einer Zertifikatoption im Cloudflare-Dashboard

Lassen Sie die Standardoption Cloudflare einen privaten Schlüssel und einen CSR generieren lassen ausgewählt.

Origin CA GUI-Optionen

Klicken Sie auf Weiter und Sie sehen einen Dialog mit dem Origin Certificate und dem privaten Schlüssel. Sie müssen sowohl das Ursprungszertifikat als auch den privaten Schlüssel von Cloudflare auf Ihren Server übertragen. Aus Sicherheitsgründen werden die Informationen zum privaten Schlüssel nicht mehr angezeigt. Kopieren Sie den Schlüssel daher auf Ihren Server, bevor Sie auf OK klicken.

Dialog, der das Ursprungszertifikat und den privaten Schlüssel anzeigt

Sie verwenden das Verzeichnis /etc/ssl auf dem Server, um das Ursprungszertifikat und die privaten Schlüsseldateien zu speichern. Der Ordner existiert bereits auf dem Server.

Kopieren Sie zunächst den Inhalt des Origin Certificate, das im Dialogfeld in Ihrem Browser angezeigt wird.

Öffnen Sie dann auf Ihrem Server /etc/ssl/cert.pem in Ihrem bevorzugten Texteditor:

  • sudo nano /etc/ssl/cert.pem

Fügen Sie den Zertifikatinhalt zur Datei hinzu. Speichern und schließen Sie den Editor danach.

Kehren Sie dann zu Ihrem Browser zurück und kopieren Sie den Inhalt des privaten Schlüssels. Öffnen Sie die Datei /etc/ssl/key.pem zur Bearbeitung:

  • sudo nano /etc/ssl/key.pem

Fügen Sie den privaten Schlüssel in die Datei ein, speichern Sie die Datei und beenden Sie den Editor.

Hinweis: Wenn Sie das Zertifikat und den Schlüssel aus dem Cloudflare-Dashboard kopieren und in die entsprechenden Dateien auf dem Server einfügen, werden manchmal Leerzeilen eingefügt. Nginx behandelt solche Zertifikate und Schlüssel als ungültig. Stellen Sie also sicher, dass es keine leeren Zeilen in Ihren Dateien gibt.

Warnung: Das Origin CA-Zertifikat von Cloudflare wird nur von Cloudflare als vertrauenswürdig eingestuft und sollte daher nur von Ursprungsservern verwendet werden, die aktiv mit Cloudflare verbunden sind. Wenn Sie Cloudflare zu irgendeinem Zeitpunkt anhalten oder deaktivieren, wird in Ihrem Origin CA-Zertifikat ein nicht vertrauenswürdiger Zertifikatfehler ausgegeben.

Nachdem Sie die Schlüssel- und Zertifikatdateien auf Ihren Server kopiert haben, müssen Sie die Nginx-Konfiguration aktualisieren, um sie verwenden zu können.

Schritt 2 — Installieren des Origin CA-Zertifikats in Nginx

Im vorherigen Abschnitt haben Sie mithilfe des Cloudflare-Dashboards ein Ursprungszertifikat und einen privaten Schlüssel generiert und die Dateien auf Ihrem Server gespeichert. Jetzt aktualisieren Sie die Nginx-Konfiguration für Ihre Website, um mithilfe des Ursprungszertifikats und des privaten Schlüssels die Verbindung zwischen den Cloudflare-Servern und Ihrem Server zu sichern.

Stellen Sie zunächst sicher, dass UFW HTTPS-Datenverkehr zulässt. Aktivieren Sie Nginx Full, wodurch sowohl Port 80 (HTTP) als auch Port 443 (HTTPS) geöffnet werden:

  • sudo ufw allow 'Nginx Full'

Laden Sie nun UFW neu:

  • sudo ufw reload

Überprüfen Sie abschließend, ob Ihre neuen Regeln erlaubt sind und ob UFW aktiv ist:

  • sudo ufw status

Sie werden eine Ausgabe wie diese sehen:

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

Jetzt können Sie Ihren Nginx-Serverblock anpassen. Nginx erstellt während der Installation einen Standard-Serverblock. Entfernen Sie ihn, wenn er noch vorhanden ist, da Sie bereits einen benutzerdefinierten Serverblock für Ihre Domäne konfiguriert haben:

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

Öffnen Sie als Nächstes die Nginx-Konfigurationsdatei für Ihre Domäne:

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

Die Datei sollte so aussehen:

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

Sie ändern die Nginx-Konfigurationsdatei, um Folgendes zu tun:

  • Hören Sie auf Port 80 und leiten Sie alle Anfragen um, um https zu verwenden.
  • Hören Sie auf Port 443 und verwenden Sie das im vorherigen Abschnitt hinzugefügte Ursprungszertifikat und den privaten Schlüssel.

Ändern Sie die Datei, damit sie wie folgt aussieht:

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

Speichern Sie die Datei und beenden Sie den Editor.

Als Nächstes testen Sie, um sicherzustellen, dass es in keiner Ihrer Nginx-Konfigurationsdateien Syntaxfehler gibt:

  • sudo nginx -t

Wenn Sie keine Probleme gefunden haben, starten Sie Nginx neu, um Ihre Änderungen zu aktivieren:

  • sudo systemctl restart nginx

Wechseln Sie nun zum Abschnitt SSL/TLS des Cloudflare-Dashboards, navigieren Sie zur Registerkarte Übersicht und ändern Sie den SSL/TLS-Verschlüsselungsmodus in Voll (streng). Dadurch wird Cloudflare informiert, die Verbindung zwischen Cloudflare und Ihrem ursprünglichen Nginx-Server immer zu verschlüsseln.

Aktivieren des vollen (strengen) SSL-Modus im Cloudflare-Dashboard

Besuchen Sie nun Ihre Website unter https://your_domain, um zu überprüfen, ob sie richtig eingerichtet ist. Sie sehen Ihre Startseite angezeigt und der Browser wird melden, dass die Website sicher ist.

Im nächsten Abschnitt richten Sie Authenticated Origin Pulls ein, um zu überprüfen, ob Ihr Ursprungsserver tatsächlich mit Cloudflare und nicht einem anderen Server spricht. Auf diese Weise wird Nginx so konfiguriert, dass nur Anforderungen akzeptiert werden, die ein gültiges Client-Zertifikat von Cloudflare verwenden. Alle Anforderungen, die Cloudflare nicht durchlaufen haben, werden gelöscht.

Schritt 3 — Einrichten von Authenticated Origin Pulls

Mithilfe des Origin CA-Zertifikats kann Cloudflare überprüfen, ob es mit dem richtigen Origin-Server kommuniziert. In diesem Schritt wird mithilfe der TLS-Client-Authentifizierung überprüft, ob Ihr ursprünglicher Nginx-Server mit Cloudflare kommuniziert.

Bei einem vom Client authentifizierten TLS-Handshake stellen beide Seiten ein zu überprüfendes Zertifikat bereit. Der Ursprungsserver ist so konfiguriert, dass nur Anfragen akzeptiert werden, die ein gültiges Client-Zertifikat von Cloudflare verwenden. Anforderungen, die Cloudflare nicht durchlaufen haben, werden abgegeben, da sie nicht über ein Cloudflare-Zertifikat verfügen. Dies bedeutet, dass Angreifer die Sicherheitsmaßnahmen von Cloudflare nicht umgehen und keine direkte Verbindung zu Ihrem Nginx-Server herstellen können.

Cloudflare präsentiert Zertifikate, die von einer CA mit dem folgenden Zertifikat signiert werden:

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

Außerdem können Sie das Zertifikat direkt hier von Cloudflare herunterladen.

Kopieren Sie dieses Zertifikat.

Erstellen Sie dann die Datei /etc/ssl/cloudflare.crt, um das Zertifikat von Cloudflare zu speichern:

  • sudo nano /etc/ssl/cloudflare.crt

Fügen Sie das Zertifikat der Datei hinzu. Speichern Sie anschließend die Datei und beenden Sie den Editor.

Aktualisieren Sie jetzt Ihre Nginx-Konfiguration, um TLS Authenticated Origin Pulls zu verwenden. Öffnen Sie die Konfigurationsdatei für Ihre Domäne:

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

Fügen Sie die Direktiven ssl_client_certificate und ssl_verify_client ein, wie im folgenden Beispiel dargestellt:

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

    . . .

Speichern Sie die Datei und beenden Sie den Editor.

Testen Sie als Nächstes Nginx, um sicherzustellen, dass in Ihrer Nginx-Konfiguration keine Syntaxfehler vorhanden sind:

  • sudo nginx -t

Wenn keine Probleme gefunden wurden, starten Sie Nginx neu, um Ihre Änderungen zu aktivieren:

  • sudo systemctl restart nginx

Öffnen Sie schließlich den Abschnitt SSL/TLS im Cloudflare-Dashboard, navigieren Sie zur Registerkarte Origin Server und aktivieren Sie die Option Authenticated Origin Pulls .

Authenticated Origin Pulls aktivieren

Besuchen Sie nun Ihre Website unter https://your_domain, um zu überprüfen, dass sie richtig eingerichtet wurde. Wie zuvor sehen Sie Ihre Startseite angezeigt.

Um zu überprüfen, ob Ihr Server nur von der CA von Cloudflare signierte Anforderungen akzeptiert, aktivieren Sie die Option Authenticated Origin Pulls, um sie zu deaktivieren, und laden Sie dann Ihre Website neu. Sie sollten folgende Fehlermeldung erhalten:

Fehlermeldung

Ihr Ursprungsserver löst einen Fehler, wenn die CA von Cloudflare keine Anfrage signiert.

Hinweis: Die meisten Browser werden Anfragen zwischenspeichern. Um die obige Änderung zu sehen, können Sie Incognito/Private Browsing-Modus in Ihrem Browser verwenden. Um zu verhindern, dass Cloudflare Anforderungen zwischenspeichert, während Sie Ihre Website einrichten, navigieren Sie im Cloudflare-Dashboard zu Übersicht und schalten Sie den Entwicklungsmodus um.

Nachdem Sie jetzt wissen, dass es ordnungsgemäß funktioniert, kehren Sie zum Abschnitt SSL/TLS im Cloudflare-Dashboard zurück, navigieren Sie zur Registerkarte Origin Server und schalten Sie die Option Authenticated Origin Pulls erneut um, um sie zu aktivieren.

Zusammenfassung

In diesem Tutorial haben Sie Ihre Nginx-basierte Website durch Verschlüsselung des Datenverkehrs zwischen Cloudflare und dem Nginx-Server mithilfe eines Origin CA-Zertifikats von Cloudflare gesichert. Anschließend haben Sie Authenticated Origin Pulls auf dem Nginx-Server eingerichtet, um sicherzustellen, dass nur die Anforderungen der Cloudflare-Server akzeptiert werden, sodass andere Personen keine direkte Verbindung zum Nginx-Server herstellen können.

Creative Commons License