HTTP Security Headers für Sicherheit und SEO von Webseiten
Security Headers sind HTTP-Header, die dazu dienen, die Sicherheit von Webseiten zu verbessern, indem durch das setzen der Headers bestimmte Sicherheitsmechanismen implementiert werden.
Die Security Headers werden vom Webserver an den Browser gesendet und enthalten Anweisungen oder Informationen, die dazu beitragen, verschiedene Sicherheitsrisiken zu minimieren.
Die Headers können auf verschiedenen Ebenen eingerichtet werden, je nach dem welchen Zugriff man auf den zugrunde liegenden Webserver hat oder alternativ über den Webspace:
- Webserver
- je nach Webhoster im Webhosting Control Panel
- per .htaccess (Nur Apache Webserver)
- im CMS (PHP)
Auf die einzelenen Möglichkeiten gehen wir weiter unten ein.
Wir setzen die Headers bevorzugt im Nginx Webserver. Aber es kommt auf den jeweiligen Einzelfall an.
Security-Header testen
Um sich zunächst initial einen Eindruck vom IST-Zustand zu verschaffen, bietet es sich an, einer der folgenden kostenlosen Tools zum Testen zu verwenden:
Nach jeder Veränderung der Security-Headers empfiehlt sich eine Kontrolle mit einem oder mehreren der oben gelisteten Tools.
Die wichtigsten HTTP-Security-Headers
HTTP Strict-Transport-Security (HSTS)
Der HSTS Eintrag erzwingt die Verbindung über HTTPS anstelle einer unverschlüsselten HTTP Verbindung. Hierfür muss natürlich im Vorfeld ein SSL Zertifikat eingerichtet sein.
Der Eintrag könnte wie folgt aussehen:
Strict-Transport-Security: max-age=31536000; includeSubDomains; preload
Strict-Transport Security informiert den Browser über den HTTPS aufruf. "Max-age" teilt dem Browser die Gültigkeit dieser Information in Sekunden mit. "IncludeSubDomains" bezieht auch alle Subdomains ein. "Preload" steht für HTTPS Only, damit der Browser diese Seite erst gar nicht versucht, in HTTP aufzurufen.
X-Frame-Options
Der X-Frame-Options Eintrag verhindert das Einbetten der Seiten von fremden Webseiten.
Der Eintrag kann "deny", "sameorigin" oder "allow-from https://example.com/" enthalten und sieht wie folgt aus:
X-Frame-Options: deny
Sollte es zu Problem auf der Webseite kommen, muss statt "deny" die Option "sameorigin" ausgewählt werden.
X-Content-Type-Options
Um Drive-by-Download-Attacken zu verhindern mit für den Browser unbekannten Dateien, lässt sich die MIME-Typ Erkennung des Browsers deaktivieren.
Die MIME-Typ Erkennung soll eigentlich dafür sorgen, das Browser unbekannte Dateien durch MIME-Sniffing mit dem korrekten Programm öffnen können, auch wenn der Medientyp nicht korrekt angegeben wurde.
Die Option nosniff deaktiviert die Erkennung:
X-Content-Type-Options: nosniff
X-XSS-Protection
Die X-XSS-Protection wird nur noch für ältere Browser benötigt und wurde eigentlich durch Content-Security-Policy ersetzt.
Die Funktion soll das Laden von Seiten verhindern, wenn diese Angriffe mit Cross-Site-Scripting erkennen. Dabei wird Java Script oder HTML-Code an die URL angehängt und so an die Webseite übergeben und an die Webseite Besucher zurückgegeben um bösartigen Code im Browser der Besucher auszuführen.
Der übliche Eintrag sieht wie folgt aus:
X-XSS-Protection: 1; mode=block
Referrer-Policy
Der Referrer-Policy Header steuert, in welchen Fällen bei ausgehenden Links die Informationen übermittelt werden, von wo der Aufruf herkommt.
Referrer-Policy: "no-referrer"
Sollten Affiliate Links auf der Webseite platziert sein, empfiehlt sich statt "no-referer" "no-referrer-when-downgrade". Dann werden die Refererr nur an Seiten übertragen, die auch HTTPS nutzen. Das ganze sieht wie folgt aus:
Referrer-Policy: "no-referrer-when-downgrade"
Permissions-Policy
Über den Permission-Policy Header kann gesteuert werden, welche Funktionen vom Browser verwendet werden. Hierunter zählt unter anderem die Webcam, Mikrofon und sonstige Sensoren wie Lagesensor, Umgebungslicht oder Zahlungsdienste wie Apple Pay.
Ein Stern gibt für alle Quellen die Funktion frei, self für die eigene Webseite und ein leeres Feld deaktiviert die Funktion:
Permissions-Policy: geolocation=(), midi=(), camera=(), usb=(), payment=(), vr=(), speaker=(), ambient-light-sensor=(), gyroscope=(), microphone=(), usb=(), interest-cohort=()
Die Option interest-cohort=() verhindert Googles FLoC.
Content Security Policy (CSP)
Der CSP Eintrag gilt als schwierigster, da dieser komplex ist und einige CMS-Systeme bei falscher Konfiguration nicht mehr funktionieren.
Grundsätzlich lässt sich mit dem CSP Eintrag einstellen, welche Inhalte erlaubt sind und aus welchen Quellen diese jeweils geladen werden dürfen. Dazu zählt insbesondere CSS und auch Java Script.
Die jeweiligen Inhalte werden mit "script-src", "connect-src", "img-src", "style-src", "base-uri" und "form-action" angegeben.
Die Quellen können mit "none", "self" oder "https://<domain>" angegeben werden.
Ein Beispiel für eine minimale Richtlinie sieht wie folgt aus:
Content-Security-Policy: "frame-ancestors 'self'"
Oder strikter mit der Begrenzung auf die eigene Seite:
Content-Security-Policy "default-src 'self'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'";
Hier hilft nur intensives Testen und auseinandersetzten mit den einzelnen Optionen.
weitere Security-Header
HSA Limit Login to block brute force attacks.
Expect-CT
Access-Control-Allow-Origin
Access-Control-Allow-Methods
Access-Control-Allow-Headers
X-Permitted-Cross-Domain-Policies
X-Powered-By
Clear-Site-Data
Cross-Origin-Embedder-Policy-Report-Only
Cross-Origin-Opener-Policy-Report-Only
Cross-Origin-Embedder-Policy
Cross-Origin-Opener-Policy
Cross-Origin-Resource-Policy
Wie und wo einrichten?
Nginx Webserver
Die Konfigurationsdatei befindet sich unter Linux in:
cd /etc/nginx/sites-enabled/<your-config-file>
Da der Name eurer Konfigurationsdatei unterschiedlich sein kann, müsst ihr euch den Inhalt des Ordners /sites-enabled/ mit dem Befehl ls anschauen und anschließend die Konfigurationsdatei öffnen:
ls
nano <your-config-file>
Die Security-Header können nach den Zertifikaten und über der location eingefügt werden:
server {
listen 443 http2 ssl;
server_name <your-domain>;
root /var/www/xyz/public;
index index.php;
# Self-Signed Zertificat
ssl_certificate /etc/ssl/certs/xyz.crt;
ssl_certificate_key /etc/ssl/private/xyz.key;
# Security-Header
add_header X-XSS-Protection "1; mode=block" always;
add_header X-Content-Type-Options "nosniff" always;
add_header X-Frame-Options "deny" always;
add_header Referrer-Policy "no-referrer" always;
add_header Permissions-Policy "interest-cohort=(), geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=(self),payment=(),usb=()";
add_header X-Permitted-Cross-Domain-Policies "none" always;
add_header Content-Security-Policy "default-src 'self'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'";
location ~ /\.ht {
deny all;
}
location / {
try_files $uri /index.php$is_args$args;
}
location ~ ^/index\.php(/|$) {
fastcgi_pass unix:/run/php/php8.1-fpm.sock;
fastcgi_split_path_info ^(.+\.php)(/.*)$;
include fastcgi.conf;
fastcgi_param PHP_ADMIN_VALUE "open_basedir=$document_root/..:/tmp/";
internal;
}
location ~ \.php$ {
return 404;
}
}
Apache Webserver
Die Security-Header müssen in die httpd.conf eingetragen werden, welche sich im Apache Installationsordner befindet. Unter Linux lässt sich die Konfigurationsdatei wie folgt öffnen:
nano /etc/httpd/conf/httpd.conf
Die Security-Header werden am Ende eingefügt:
Header always set X-XSS-Protection: "1; mode=block"
Header always set X-Content-Type-Options: "nosniff"
Header always set X-Frame-Options: "deny"
Header always set Referrer-Policy: "strict-origin-when-cross-origin"
Header always set Strict-Transport-Security: "max-age=31536000; includeSubDomains; preload"
Header always set Content-Security-Policy: "default-src 'self'"
Die Änderungen speichern und den Apache Webserver neustarten:
service httpd restart
Webhosting Control Panel
Einige Webhoster bieten die Möglichkeit zusätzliche Header über das Webhosting Control Panel zu setzen. Bei Netcup findet sich die Einstellung im Webhosting Control Panel unter Websites & Domains, unter der betroffenen Domain oder Subdomain unter Apache und nginx.
Die Option zusätzliche Header muss von Standard auf Eigenen Wert eingeben geändert werden. Anschließend können die Security-Header in folgendem Format hinterlegt werden:
X-XSS-Protection: "1; mode=block"
X-Content-Type-Options: "nosniff"
X-Frame-Options: "deny"
Referrer-Policy: "strict-origin"
Permissions-Policy: "interest-cohort=(), geolocation=(),midi=(),sync-xhr=(),microphone=(),camera=(),magnetometer=(),gyroscope=(),fullscreen=(),payment=(),usb=()"
Content-Security-Policy: "default-src 'self'; script-src 'self'; connect-src 'self'; img-src 'self'; style-src 'self';base-uri 'self';form-action 'self'"
Der Strict-Transport-Security Header wird in den SSL/TLS-Zertifikats Einstellungen aktiviert. Hier sollte außerdem die HTTP auf HTTPS Umleitung aktiviert sein und die OCSP-Anheftung ebenfalls.
.htaccess
Hierzu muss im root Verzeichnis der Webseite eine .htaccess Datei mit den Security-Header erstellt werden. Diese gilt auch für alle Unterordner!
Header set Content-Security-Policy "header-value"
Header set X-XSS-Protection "header-value"
Header set Strict-Transport-Security "header-value"
Header set X-Frame-Options "deny"
Wordpress
Für Wordpress gibt es mehrere Plugins. Wir haben Headers Security Advanced & HSTS WP verwendet, weil es sehr gut bewertet ist und einige zusätzliche Security-Headers unterstützt.
Kirby
Für das CMS Kirby gibt es das Plugin Content Security Policy welches die Security-Headers automatisch setzt. Dafür muss das Plugin in den Ordner "site/plugins/kirby3-security-headers" hochgeladen werden.
Schlusswort
Die hier aufgeführten Security-Header und Beispiele sind nicht abschließend! Je nach dem wo die Header gesetzt werden, empfiehlt sich eine weitere Lektüre zu dem Thema. Unsere Anleitung dient zum schnellen Überblick und ersten Einstieg in das kompexe aber auch interessante Thema.