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).
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.1sind gebrochen; nurTLSv1.2undTLSv1.3sind sicher. - Cipher-Suite: die konkreten Verschlüsselungs-Algorithmen. Sicher sind
ECDHE+GCM-Verfahren. - Security-Header:
HSTSerzwingt HTTPS,CSPbegrenzt, 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. 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 komplexeopenssl-Syntax ab und legt die Dateien nach/etc/ssl/lab/(gültig 365 Tage).sudo /usr/local/bin/lab-gen-cert.shSchau dir das Skript vorher mit
bash -x /usr/local/bin/lab-gen-cert.shan, um zu verstehen, wasopenssl req -x509macht.Kontrolle:
openssl x509 -in /etc/ssl/lab/server.crt -noout -subjectzeigt eine Zeile mitCN = ....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 diessl_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 nginxKontrolle: Die Config enthält
ssl_certificate /etc/ssl/lab/server.crt.3. Alte TLS-Versionen abschalten
Begriff: TLS-Protokoll-Versionen.
TLSv1.0undTLSv1.1gelten 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 -Tzeigtssl_protocols TLSv1.2 TLSv1.3.4. Strenge Cipher-Suite setzen
Begriff: Cipher-Suite. Die Cipher-Suite legt die konkreten Verschlüsselungs-Algorithmen fest. Schwache wie
RC4oder3DESsind angreifbar. Sicher sindECDHE-Verfahren mitGCM(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 mitECDHE+GCM(ohneRC4/3DES/MEDIUM).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 einenStrict-Transport-Security: max-age=...-Header.6. Content-Security-Policy setzen
Begriff: CSP. Die
Content-Security-Policybegrenzt, 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/liefertContent-Security-Policy: default-src 'self'.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 --quietDie 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 startenLab-Inhalte unter CC BY 4.0 – frei nutzbar mit Namensnennung (© TechLogia).
