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.



Leave a comment

Available formatting commands

Use Markdown commands or their HTML equivalents to add simple formatting to your comment:

Text markup
*italic*, **bold**, ~~strikethrough~~, `code` and <mark>marked text</mark>.
Lists
- Unordered item 1
- Unordered list item 2
1. Ordered list item 1
2. Ordered list item 2
Quotations
> Quoted text
Code blocks
```
// A simple code block
```
```php
// Some PHP code
phpinfo();
```
Links
[Link text](https://example.com)
Full URLs are automatically converted into links.
© TECH-SUPPORT.KOELN