Zum Inhalt springen
Techlogia — KI- und Web-Dienstleister Berlin
Alle Kurse
Frei lesbar – ohne Anmeldung

nginx-TLS-Hardening

Du härtest nginx von einem unsicheren Default-Zustand (selbst-signiertes snakeoil-Cert + TLSv1 enabled + permissive Ciphers + keine Security-Header) zu einer modernen TLS-Konfig. 7 Aufgaben, ca. 60 Minuten. Hinweis: Wir nutzen ein selbst-signiertes Zertifikat — Browser-Warnungen sind hier korrekt (in Produktion kommt Let's Encrypt, das ist ein eigenes Modul).

Dauer: 60 Min.Niveau: FortgeschrittenAufgaben: 7

nginx-TLS-Konfiguration absichern

nginx & TLS härten

TLS (Transport Layer Security, der Nachfolger von SSL) ist die Verschlüsselung hinter HTTPS. Sie sorgt dafür, dass niemand zwischen Browser und Server mitlesen oder Daten verändern kann. Ein Webserver wie nginx kann TLS aber unsicher konfigurieren — mit veralteten Protokollen, schwachen Verschlüsselungsverfahren und fehlenden Schutz-Headern.

Wichtige Begriffe

  • Zertifikat (cert): belegt die Identität des Servers. Hier nutzt du ein selbst-signiertes Cert — Browser-Warnungen sind dabei normal (in Produktion kommt Let's Encrypt).
  • TLS-Version: TLSv1.0/1.1 sind gebrochen; nur TLSv1.2 und TLSv1.3 sind sicher.
  • Cipher-Suite: die konkreten Verschlüsselungs-Algorithmen. Sicher sind ECDHE+GCM-Verfahren.
  • Security-Header: HSTS erzwingt HTTPS, CSP begrenzt, was der Browser laden darf (Schutz vor XSS).

Dein Ziel

Du bringst nginx von einem unsicheren Default-Zustand zu einer modernen TLS-Konfiguration. Die Konfig liegt in /etc/nginx/sites-enabled/lab-default.conf; nach Änderungen prüfen mit nginx -t und neu laden mit systemctl reload nginx.

Aufgaben

  1. 1. Self-Signed-Cert generieren

    Begriff: Self-Signed-Zertifikat. Ein Zertifikat braucht einen privaten Schlüssel (geheim) und ein öffentliches Zertifikat (server.crt). Hier erzeugst du beides selbst-signiert. Ein Helfer-Skript nimmt dir die komplexe openssl-Syntax ab und legt die Dateien nach /etc/ssl/lab/ (gültig 365 Tage).

    sudo /usr/local/bin/lab-gen-cert.sh

    Schau dir das Skript vorher mit bash -x /usr/local/bin/lab-gen-cert.sh an, um zu verstehen, was openssl req -x509 macht.

    Kontrolle: openssl x509 -in /etc/ssl/lab/server.crt -noout -subject zeigt eine Zeile mit CN = ....

  2. 2. nginx auf neues Cert umstellen

    Begriff: Wirksame Konfiguration. Ein gutes Zertifikat nützt nichts, wenn nginx weiter den alten Default-Pfad (snakeoil) lädt. Erst die ssl_certificate-Direktiven machen dein Cert wirksam.

    Setze in /etc/nginx/sites-enabled/lab-default.conf (sudo nano ...):

    ssl_certificate     /etc/ssl/lab/server.crt;
    ssl_certificate_key /etc/ssl/lab/server.key;

    Dann testen und neu laden:

    sudo nginx -t && sudo systemctl restart nginx

    Kontrolle: Die Config enthält ssl_certificate /etc/ssl/lab/server.crt.

  3. 3. Alte TLS-Versionen abschalten

    Begriff: TLS-Protokoll-Versionen. TLSv1.0 und TLSv1.1 gelten als gebrochen — moderne Browser warnen oder verweigern die Verbindung. Erlaube nur die zeitgemäßen Versionen.

    Setze in der nginx-Config:

    ssl_protocols TLSv1.2 TLSv1.3;

    Dann sudo nginx -t && sudo systemctl restart nginx.

    Kontrolle: nginx -T zeigt ssl_protocols TLSv1.2 TLSv1.3.

  4. 4. Strenge Cipher-Suite setzen

    Begriff: Cipher-Suite. Die Cipher-Suite legt die konkreten Verschlüsselungs-Algorithmen fest. Schwache wie RC4 oder 3DES sind angreifbar. Sicher sind ECDHE-Verfahren mit GCM (bieten Forward Secrecy).

    Setze in der nginx-Config:

    ssl_ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256;
    ssl_prefer_server_ciphers on;

    Dann sudo nginx -t && sudo systemctl restart nginx.

    Kontrolle: Die Config enthält eine ssl_ciphers-Zeile mit ECDHE+GCM (ohne RC4/3DES/MEDIUM).

  5. 5. HSTS-Header setzen

    Begriff: HSTS. Der Strict-Transport-Security-Header sagt dem Browser: „Nutze für diese Seite nur noch HTTPS, nie wieder HTTP." Das verhindert Downgrade-Angriffe (z. B. SSL-Strip).

    Setze im server-Block der Config:

    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

    Wichtig im server-Block (nicht im location-Block) — sonst werden geerbte Header überschrieben.

    Dann reloaden und prüfen: curl -sIk https://localhost/ | grep -i strict.

    Kontrolle: curl -sIk https://localhost/ liefert einen Strict-Transport-Security: max-age=...-Header.

  6. 6. Content-Security-Policy setzen

    Begriff: CSP. Die Content-Security-Policy begrenzt, aus welchen Quellen der Browser Inhalte laden darf. default-src 'self' heißt: nur von der eigenen Domain. Das ist Defense-in-Depth gegen XSS — selbst eingeschleustes JavaScript wird nicht ausgeführt.

    Setze im server-Block:

    add_header Content-Security-Policy "default-src 'self'" always;

    Dann reloaden und prüfen: curl -sIk https://localhost/ | grep -i content-security.

    Kontrolle: curl -sIk https://localhost/ liefert Content-Security-Policy: default-src 'self'.

  7. 7. TLS-Härtung am laufenden Server verifizieren

    Begriff: effektive Konfiguration. sudo nginx -T zeigt die tatsächlich geladene Gesamtkonfiguration von nginx — inklusive aller über include eingebundenen Dateien. Damit prüfst du als Abschluss, ob deine Härtung aus den Schritten 1–6 im laufenden Server wirklich greift (nicht nur in einer Datei steht).

    sudo nginx -T

    Suche die ssl_protocols-Zeile. Sie muss TLSv1.2 TLSv1.3 zeigen — ohne die veralteten TLSv1/TLSv1.1.

    Kontrolle: nginx -T läuft fehlerfrei (gültige Konfiguration) und die geladene Konfiguration erzwingt TLSv1.3.

Verwandte Kurse

Jetzt selbst üben

Lesen ist gut – selbst machen ist besser. Starte diesen Kurs an einer echten Linux-VM, direkt im Browser. Ein kostenloses Konto genügt.

Kostenlos starten

Lab-Inhalte unter CC BY 4.0 – frei nutzbar mit Namensnennung (© TechLogia).

Wie gefällt dir diese Seite?

nginx-TLS-Hardening lernen | Techlogia Lab