So fügt man Security Headers zum eigenen Webserver hinzu

In diesem Beitrag wird beschrieben, wie man bestimmte Security header zu einem apache2 oder nginx Webserver hinzufügt. Dadurch werden einige clientseitige Angriffsvektoren in den Client-Browsern, die Ihre Website nutzen, eliminiert. Darüber hinaus wird Ihre Website dadurch vertrauenswürdiger, was einen Einfluss auf Ihren Suchmaschinen-Score haben kann.

So testen Sie Ihre Website

Es stehen mehrere Websites zur Verfügung, die Websites hinsichtlich verschiedener Sicherheitseinstellungen testen können. Die folgende Tabelle zeigt drei davon.

URLDescription
https://securityheaders.comSucht hauptsächlich nach den in diesem Beitrag beschriebenen Sicherheitsheadern.
https://internet.nlSucht nach Sicherheitsheadern, DNSsec, https-Parametern und mehr
https://observatory.mozilla.orgSucht hauptsächlich nach Headern, einige werden jedoch auch detailliert analysiert.
Some security scanners for websites

The Security Headers

Wir konzentrieren uns auf die folgenden sieben (derzeit wichtigsten) Security-Header.

Header typeBeispiel WertErklärung
Strict-Transport-Securitymax-age=31536000Erzwingt eine HTTPS-Verbindung zur Website, siehe auch https://en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
X-Frame-OptionsSAMEORIGINClickjacking Schutz-Header, der Frames von nicht vertrauenswürdigen Quellen auf Ihrer Website vermeidet. Siehe auch wikipedia.
X-Content-Type-OptionsnosniffMit diesem Header weist der Server den Browser an, sich strikt an die MIME-Typen in Content-Type-Headern zu halten und das Sniffing zu deaktivieren. Siehe auch wikipedia.
Referrer-Policyno-referrerDer Referrer-Policy-Header steuert, wie viele Referrer-Informationen (mit dem Referer-Header gesendet) in Anfragen enthalten sein sollen.
Permissions-Policygeolocation=(); midi=();....Die Berechtigungsrichtlinie teilt dem Browser mit, ob eine Funktion auf einer Website verwendet werden kann oder nicht. Diese werden als richtliniengesteuerte Funktionen bezeichnet. Eine Liste der Funktionen, die durch diese Richtlinie gesteuert werden können, finden Sie unter https://github.com/w3c/webappsec-permissions-policy/blob/main/features.md. The Permissions API gates access to features based on user-granted permissions.
X-XSS-Protection1; mode=blockDieser Header aktiviert die Cross-Site-Scripting-Schutzfunktion in modernen Browsern.
Content-Security-Policyscript-src domain.orgContent Security Policy (CSP) ist eine zusätzliche Sicherheitsebene, die dabei hilft, bestimmte Arten von Angriffen zu erkennen und abzuwehren, darunter Cross-Site Scripting (XSS) und Dateninjektionsangriffe. Der CSP kann sehr feingranular konfiguriert werden und schließt so viele Angriffsvektoren aus, was jedoch mit zusätzlichem Verwaltungsaufwand verbunden ist. Siehe auch https://en.wikipedia.org/wiki/Content_Security_Policy.
List of security headers

Die Beispielwerte in der folgenden Header Konfiguration sind von meinen Webservern. Bitte beachten, das wordpress und andere CMS-Systeme einige spezielle Einstellungen benötigen, um ein funktionierendes Setup zu erhalten, siehe Abschnitt Probleme mit der Content-Security-Policy für mehr Informationen.

How to configure Security Headers for Nginx

In Nginx können Header in der zentralen Nginx-Konfigurationsdatei konfiguriert werden. Das folgende Beispiel gilt für Debian-basierte Systeme.

user1@host:/etc/nginx$ sudo nano nginx.conf 

Im http-Bereich können die sieben zuvor beschriebenen Header mit add_header hinzu gefügt werden, wie unten gezeigt (für die Webseite domain.org).

http {
        ##
        # Basic Settings
        ##
        ....       
        add_header Strict-Transport-Security "max-age=31536000";
        add_header X-Frame-Options "SAMEORIGIN" always;
        add_header X-Content-Type-Options "nosniff" always;
        add_header Referrer-Policy "no-referrer";
        add_header Permissions-Policy "geolocation=(); midi=();notifications=();push=();sync-xhr=();accelerometer=(); gyroscope=(); magnetometer=();  payment=(); camera=(); microphone=();usb=(); xr=();speaker=(self);vibrate=);fullscreen=(self);";
       add_header X-XSS-Protection "1; mode=block";
        add_header Content-Security-Policy "default-src domain.org";
}

Nachdem die Änderungen gespeichert wurden, muss Nginx neu gestartet werden, z. B. mit

user1@host:/sudo systemctl restart nginx

How to configure Security Headers for Apache2

Für den Apache2-Webserver können die Header in der Konfiguration für jede Site hinzugefügt werden. Wichtig ist, dass das Modul mod_headers aktiviert ist. Das kann man machen mit

user1@host:/sudo a2enmod headers
user1@host:/sudo systemctl restart apache2

Auch hier ist die Beispiel Seite domain.org.

user1@host:/etc/apache2/sites-available# nano domain.org-le-ssl.conf 

Man fügt im Abschnitt mod_headers Folgendes hinzu:

</IfModule>
<IfModule mod_headers.c>
  Header always set Strict-Transport-Security "max-age=31536000;" 
  Header always append X-Frame-Options SAMEORIGIN
  Header always append X-Content-Type-Options "nosniff"
  Header always set Permissions-Policy "geolocation=(); midi=();notifications=()push=();sync-xhr=();accelerometer=(); gyroscope=(); magnetometer=();  payment=(); camera=(); microphone=();usb=(); xr=();speaker=(self);vibrate=);fullscreen=(self);";
  Header always set Referrer-Policy "no-referrer"
  Header always set X-XSS-Protection "1; mode=block"
  Header always set Content-Security-Policy "default-src 'self' "
</IfModule>

Nachdem die Änderungen gespeichert wurden, muss Apache2 neu gestartet werden, z.B. mit

user1@host:/sudo systemctl restart apache2

Probleme mit der Content-Security-Policy

Insbesondere der Content-Security-Policy-Header kann Probleme verursachen und dazu führen, dass die Website nicht funktioniert, da der Browser benötigte Ressourcen nicht laden kann. Die allgemeine Strategie hier besteht darin, dass man blockierte Ressourcen mit den Entwicklertools in im Browser überprüft (normalerweise F12) und diese als vertrauenswürdige Quelle (z. B. script-src) zur Header-Definition hinzufügt. Zusätzlich benötigen einige CMS wie wordpress , abhängig von den verwendeten Plugins, script-src mit unsafe-inline und unsafe-eval, die im Allgemeinen unsichere Optionen sind. Es gibt unzählige Artikel im Internet, wie man die einzelnen Stellen sichern kann aber das bedeutet viel Aufwand. Das folgende Beispiel bezieht sich auf eine WordPress-Website mit Google Analytics und Google Adsense.

 Content-Security-Policy "script-src 'self' 'unsafe-inline' 'unsafe-eval'  *.googleapis.com *.googlesyndication.com *.googletagmanager.com *.googleadservices.com *.google.com"

Bitte beachten, dass hier nur script-src gesichert ist, nicht style etc. (was wiederum viel Aufwand für eine WordPress-Site ist). Zusätzlich werden unsafe-inline und unsafe-eval nicht als sicher betrachtet.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert