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 reload 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 reload 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 reload 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. Lynis-TLS-Suggestions abarbeiten

    Begriff: Lynis-Audit. Lynis ist ein Sicherheits-Audit-Tool, das ein System scannt und einen Härtungs-Score plus konkrete Vorschläge liefert. Wenn deine vorherigen 6 Schritte sauber sind, sollten die TLS-bezogenen Lynis-Hinweise (NETW-3032, HTTP-6624) abgedeckt sein.

    Führe das Audit aus und arbeite verbliebene TLS-Vorschläge ab:

    sudo lynis audit system --quiet

    Die Suggestions stehen am Ende der Ausgabe. Sind Schritte 1–6 erledigt, sollte dieser Check automatisch bestehen.

    Kontrolle: Der Lynis-Hardening-Score hat sich gegenüber dem Ausgangswert ausreichend verbessert.

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

nginx-TLS-Hardening