HSTS und Sicherheitsheader für Ihre Website
Bei jeder Seite sendet Ihr Webserver Header mit: kurze Zeilen mit Anweisungen für den Browser. Sie bestimmen zum Teil, wie sicher der Browser mit Ihrer Website umgeht. Hier lesen Sie, was HSTS ist, welche weiteren Sicherheitsheader es gibt und wie Sie diese einrichten und testen.
Zuerst muss Ihre Website ein funktionierendes Zertifikat haben und Besucher auf https weiterleiten. Wie das geht, lesen Sie in SSL-Zertifikat aktivieren, erneuern und Probleme lösen und Besucher verpflichtend auf https weiterleiten.
Was bewirkt HSTS?
Die Weiterleitung auf https hat einen Schwachpunkt: Die erste Anfrage über http erfolgt noch unverschlüsselt. Jemand im selben Netzwerk, zum Beispiel in einem öffentlichen WLAN, kann diese Anfrage abfangen. HSTS (HTTP Strict Transport Security) löst dieses Problem. Ihre Website sendet über https diesen Header mit:
Strict-Transport-Security: max-age=31536000
Der Browser merkt sich dann, dass er Ihre Website nur über https öffnen darf. Gibt ein Besucher später http:// ein, macht der Browser selbst https daraus, noch bevor etwas über das Netzwerk gesendet wird. Einen HSTS-Header, der über einfaches http ankommt, ignoriert der Browser.
| Bestandteil | Bedeutung |
|---|---|
max-age | Wie lange sich der Browser die Anweisung merkt, in Sekunden. Der Test von internet.nl wertet mindestens ein Jahr (31536000) als ausreichend. |
includeSubDomains | Gilt auch für alle Subdomains, zum Beispiel shop.ihre-domain.de und mail.ihre-domain.de. |
preload | Sie beantragen die Aufnahme in die Liste, die fest in Browser eingebaut ist (hstspreload.org). Dann ist sogar der allererste Besuch geschützt. Dafür sind unter anderem ein Jahr, includeSubDomains und https auf allen Subdomains erforderlich. Wieder von der Liste entfernt zu werden, dauert lange. |
max-age=0 | Löscht die gespeicherte Anweisung wieder, beim nächsten Besuch über https. |
includeSubDomains gilt das auch für jede Subdomain, zum Beispiel eine alte Kamera- oder Druckerseite ohne Zertifikat. Gehen Sie deshalb schrittweise vor: Beginnen Sie mit einem kurzen max-age, zum Beispiel einem Tag (86400), prüfen Sie, ob alles funktioniert, und erhöhen Sie den Wert schrittweise auf ein Jahr.HSTS bei WebOké
Auf den meisten unserer Server sendet der Webserver HSTS standardmäßig für jede Website mit, die über https aufgerufen wird: Strict-Transport-Security: max-age=31536000. Das ist ein Jahr, ohne includeSubDomains und ohne preload. Dafür müssen Sie nichts tun. Auf einigen wenigen Servern ist es nicht standardmäßig aktiviert; dort aktivieren Sie es selbst. Ob Ihre Website HSTS bereits mitsendet und mit welchem max-age, sehen Sie in den Entwicklertools Ihres Browsers oder im Test von internet.nl (siehe unten).
Der HSTS-Schalter in DirectAdmin
Gehen Sie in DirectAdmin zu Domains und klicken Sie auf Ihren Domainnamen. Ist Secure SSL aktiviert, sehen Sie bei HSTS den Schalter Enable HTTP Strict Transport Security. Klicken Sie anschließend auf Save, um zu speichern. Wie das Schritt für Schritt funktioniert, lesen Sie in Besucher immer auf https weiterleiten.
Sendet Ihre Website bereits HSTS mit, benötigen Sie den Schalter nicht. Aktivieren Sie ihn nur, wenn Ihre Website noch kein HSTS sendet. Richten Sie HSTS an einer einzigen Stelle ein: in DirectAdmin oder in .htaccess, nicht in beiden. Erhält der Browser zwei HSTS-Header, verwendet er nur den ersten.
Die weiteren Sicherheitsheader
| Header | Schützt vor | Wert für den Einstieg |
|---|---|---|
X-Content-Type-Options | Der Browser errät selbst, um welche Art von Datei es sich handelt, sodass ein hochgeladenes „Bild“ als Skript ausgeführt werden kann. | nosniff (der einzige gültige Wert) |
Content-Security-Policy: frame-ancestors oder X-Frame-Options | Clickjacking: Eine andere Website lädt Ihre Seite unsichtbar in einen Frame, sodass Besucher unbemerkt auf Ihre Schaltflächen klicken. | frame-ancestors 'self' oder der ältere Header X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Bei einem Klick auf eine andere Website sendet der Browser die Adresse der vorherigen Seite mit, manchmal mit einem Suchbegriff oder einer Bestellnummer darin. | strict-origin-when-cross-origin oder strenger same-origin bzw. no-referrer. Internet.nl wertet nur die strengen Werte als gut. |
Permissions-Policy | Legt fest, welche Browserfunktionen Ihre Seite und eingebettete Frames nutzen dürfen, zum Beispiel Kamera, Mikrofon und Standort. | camera=(), microphone=(), geolocation=() deaktiviert diese drei. Nutzt Ihre Website eine dieser Funktionen, lassen Sie sie in der Liste weg. |
Content-Security-Policy (vollständig) | Beschränkt, von welchen Quellen Skripte, Stylesheets und Bilder geladen werden dürfen. Das erschwert eingeschleuste Schadskripte (XSS) erheblich. | Individuell für jede Website. Vermeiden Sie unsafe-inline, unsafe-eval und Wildcards. |
Einrichten in .htaccess
Fügen Sie diese Zeilen ganz oben in die Datei .htaccess im Ordner public_html Ihrer Domain ein. Erstellen Sie zuvor eine Kopie der Datei.
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "frame-ancestors 'self'" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # Alleen als je site nog geen HSTS meestuurt (zie hierboven): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Die Kommentarzeile im Code bedeutet: Nur verwenden, wenn Ihre Website noch kein HSTS mitsendet (siehe oben). Fügen Sie includeSubDomains erst hinzu, wenn Sie sicher sind, dass jede Subdomain https hat. Nutzen Sie WordPress, können Sie die Header auch mit einem Plugin einrichten. Wählen Sie ein bekanntes Plugin, das noch aktualisiert wird, und richten Sie jeden Header an einer einzigen Stelle ein: im Plugin oder in .htaccess.
Content-Security-Policy-Report-Only. Dieser blockiert nichts, zeigt aber in der Konsole des Browsers an, was blockiert würde. Überlassen Sie dies im Zweifel Ihrem Webentwickler oder beginnen Sie nur mit frame-ancestors.Auf einem VPS mit nginx oder Caddy
Auf einem VPS verwenden Sie kein DirectAdmin und oft auch keine .htaccess. Sie setzen die Header dann in der Konfiguration Ihres Webservers. Keiner der beiden sendet HSTS oder diese Header von selbst mit.
nginx: im server-Block für Port 443:
add_header Strict-Transport-Security "max-age=31536000" always; add_header X-Content-Type-Options "nosniff" always; add_header Content-Security-Policy "frame-ancestors 'self'" always; add_header Referrer-Policy "strict-origin-when-cross-origin" always;
Mit always werden die Header auch bei Fehlerseiten mitgesendet. Achtung: Steht in einem location-Block selbst ein add_header, gelten die Regeln aus dem server-Block für diese Location nicht mehr. Wiederholen Sie sie dort oder legen Sie sie in eine separate Datei, die Sie mit include überall einbinden. Testen Sie die Konfiguration mit nginx -t und laden Sie sie mit systemctl reload nginx.
Caddy: im Block Ihrer Website in der Caddyfile:
header {
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
Content-Security-Policy "frame-ancestors 'self'"
Referrer-Policy "strict-origin-when-cross-origin"
}
Laden Sie die Änderung mit systemctl reload caddy. Zum Aufbau einer Website mit nginx oder Caddy siehe nginx mit einem Zertifikat von Let's Encrypt und Caddy: eine Website mit automatischem https in der VPS-Anleitung.
Testen
- Internet.nl: Geben Sie Ihre Domain beim Website-Test auf internet.nl ein.
- Ihr Browser: Öffnen Sie Ihre Website, drücken Sie F12 (oder wählen Sie Untersuchen), wechseln Sie zum Tab Netzwerk, laden Sie die Seite neu und klicken Sie auf die erste Anfrage. Unter Antwort-Header (Response Headers) sehen Sie alles, was Ihr Server mitsendet.
- Die Kommandozeile:
curl -sI https://ihre-domain.de/zeigt die Header an.
Prüfen Sie nach jeder Änderung, ob Ihre Website, Formulare und Bezahlseite noch funktionieren. Halten Sie außerdem Ihr CMS, Ihre Plugins und Themes aktuell. Siehe wp-login.php von WordPress absichern.
Weiterführende Informationen
- MDN: Strict-Transport-Security (Englisch)
- MDN: Content-Security-Policy (Englisch)
- MDN: Permissions-Policy (Englisch)
- HSTS-Preload-Liste (Englisch)
Möchten Sie mehr erfahren? Besuchen Sie den kostenlosen Kurs Sicher online für Unternehmer, Lektion 4.2 Ihre Website: https, HSTS und Sicherheitsheader, oder den kostenlosen WordPress-Kurs, Lektion 7.4 Die Website absichern: Berechtigungen, Header und Sicherheits-Plugins.
