Mehr Sicherheit für Webseiten mit Security Headers

Das OWASP Secure Headers Projekt definiert eine Reihe von HTTP Headern, mit der die Sicherheit von Webseiten verbessert werden kann. Der Einsatz dieser Header verhindert, dass Sicherheitslücken in modernen Browser ausgenutzt werden können. 
Diese Anleitung beschreibt, wie die Security Headers einfach in TYPO3 implementiert werden können. 

Einbinden über TypoScript

Die Security Headers werden als zusätzliche HTTP-Header beim Verbindungsaufbau zwischen Browser und Server gesendet. In TYPO3 können weitere Header über TypoScript hinzugefügt werden. 

Ab TYPO3 Version 7.6 erfolgt die Angabe über ein numerisches Array in folgender Form:

config.additionalHeaders {
  10.header = Parameter1:Wert; eventuell zusätzliche Werte
  20.header = Parameter2:Wert; eventuell zusätzliche Werte
  ...
}

In TYPO3 Version 6.2 und früher werden die einzelnen Header über ein Pipe-Symbol | getrennt. Die obige Konfiguration würde daher lauten:

config.additionalHeaders (
  Parameter1:Wert;eventuell zusätzliche Werte |
  Parameter2:Wert;eventuell zusätzliche Werte |
  ...
)

Am Ende dieser Seite gibt es ein komplettes Beispiel, das als Vorlage für eigene TYPO3 Projekte verwendet werden kann.

HTTP Strict Transport Security (HSTS)

Mit der HTTP Strict Transport Security Linie wird dem Browser beim ersten Aufruf einer Domain mitgeteilt, dass alle künftigen Aufrufe ausschließlich über eine verschlüsselte Verbindung (https) erfolgen sollen. Diese Festlegung kann auch auf alle Subdomains ausgeweitet werden. 

Der Browser merkt sich diese Einstellungen für alle künftigen Aufrufe innerhalb des festgelegten Zeitraums und verweigert den Aufruf über unverschlüsselte Verbindungen (http://).

Voraussetzung zur Nutzung von HSTS ist, dass für die Domain ein gültiges SSL-Zertifikat existiert. Wird die Festlegung auf Subdomains erweitert, so muss geprüft werden, ob entweder ein Wildcard-SSL Zertifikat für die Domain vorhanden ist oder alternativ alle genutzten Subdomains ebenfalls über ein SSL-Zertifikat verfügen.

Syntax des HTTP Strict Transport Security Headers nur für eine Domain:

strict-transport-security:max-age=31536000

Der Parameter max-age legt fest, wie lange diese Regel gültig sein soll (in Sekunden), empfohlen ist ein Wert von einem Jahr (31536000 Sekunden).

Sollen auch alle Subdomains mit der Regel eingeschlossen werden, so lautet der Header:

strict-transport-security:max-age=31536000; includeSubdomains

X-Frame-Options

Mit dem Header X-Frame-Options kann festgelegt werden, ob die eigene Webseite in Frames eingebunden werden darf. Wenn man im Browser verhindert, dass eine Seite auch per Frame geladen werden darf, kann man Angriffe über sog. Clickjacking verhindern.

Mögliche Parameter sind:

DENY: das Einbinden der Seite per Frame ist generell nicht möglich

SAMEORIGIN: das Einbinden ist nur von der eigenen Domain aus erlaubt

ALLOW-FROM example.com: es können explizit Webseiten angegeben werden, denen man das Einbinden per Frame erlaubt

Für TYPO3 Webseiten empfiehlt sich die Nutzung von SAMEORIGIN:

X-Frame-Options:SAMEORIGIN

X-Xss-Protection

Aktuelle Browser haben einen eingebauten Schutz gegen Reflective XSS Angriffe. Dieser Schutz kann mit dem X-Xss-Protection Header ein- und ausgeschaltet werden. Mit dem optionalen Parameter mode=block wird der Angriff blockiert statt nur gefiltert. Empfohlene Einstellung:

X-Xss-Protection: 1; mode=block

Referrer-Policy

Mit dem Referrer-Policy Header kann konfiguriert werden, ob und wie der Referrer bei ausgehenden Links von der Webseite übergeben wird. Dieser Header ist relativ neu und wird seit Anfang 2017 unterstützt.

Es gibt folgende Konfigurationsmöglichkeiten:

no-referrer: es wird kein Referrer mitgegeben

no-referrer-when-downgrade: bei einem Wechsel von einer https- auf eine http Seite (verschlüsselt auf unverschlüsselt) wird kein Referrer mitgegeben. Bei Links von unverschlüsselten Seiten (http) wird der Referrer erzeugt.

same-origin: bei einer Verlinkung innerhalb einer Webseite wird der Referrer erzeugt, bei Links auf externe Webseiten dagegen nicht.

origin: der Referrer wird immer erzeugt und gibt die Quell-Domain an, der Pfad wird jedoch entfernt.

strict-origin: wie origin, aber die Quell-Domain wird nur angegeben, wenn das Zeil eine Webseite mit Verschlüsselung ist (https)

origin-when-cross-origin: innerhalb der gleichen Domain wird der Pfad im Refferer mit aufgeführt, bei Verlinkung auf andere Domains nur der Domainname ohne Pfad.

strict-origin-when-cross-origin: wie zuvor, jedoch wird bei einem Downgrade von verschlüsselter auf unverschlüsselte Verbindung keine Referrer Information mitgeschickt.

unsafe-url: der Referrer wird in jedem Fall mitgeschickt, auch bei Verlinkung von verschlüsselter auf unverschlüsselte Verbindung. Diese Option wird nicht empfohlen (daher schon der Name "unsafe")

Empfehlung:

Sofern ein SSL Zertifikat für die Domain ausgestellt ist, wird die Option strict-origin empfohlen, ansonsten die Option origin.

Referrer-Policy:strict-origin

Content Security Policy

Mit der Content Security Policy kann man genau festlegen, welche Inhalte woher vom Browser auf der Webseite geladen werden dürfen. Hier ist leider keine Empfehlung für einen Standard Eintrag möglich, da die Angaben individuell vom Inhalt der Webseite abhängen. 

Detaillierte Informationen dazu gibt es auf der Webseite von Scott Helme

Es wird dringend empfohlen, die Policy zunächst mit der Anweisung "Content-Security-Policy-Report-Only" zu testen, bevor die Policy live geschaltet wird. Die Ausgabe beim Testen erfolgt z.B. in der Konsole des Chrome Browsers.

Hier ein Beispiel, wie die Konfiguration bei der jweiland.net Webseite aussieht:

Content-Security-Policy: default-src 'unsafe-inline' 'unsafe-eval'; 
script-src 'unsafe-inline' 'unsafe-eval' https://jweiland.net https://stat.jweiland.net https://www.googletagmanager.com https://www.google-analytics.com; font-src 'self'; 
style-src 'unsafe-inline' https://jweiland.net/; 
img-src 'self' https://www.google-analytics.com/ https://stats.g.doubleclick.net/ https://stat.jweiland.net; 
frame-src https://player.vimeo.com/;
connect-src https://jweiland.net/

TypoScript Beispielkonfiguration

Das folgende Beispiel für TYPO3 Version 7 (und höher) kann als Grundlage verwendet werden:

config.additionalHeaders {
  10.header = strict-transport-security:max-age=31536000
  20.header = X-Frame-Options:SAMEORIGIN
  30.header = X-Xss-Protection: 1; mode=block 40.header = X-Content-Type-Options: nosniff   50.header = Referrer-Policy:strict-origin }

Für TYPO3 Version 6.2 (und niedriger) hier die Beispielkonfiguration:

config.additionalHeaders ( 
  strict-transport-security:max-age=31536000 |
  X-Frame-Options:SAMEORIGIN |
  X-Xss-Protection: 1; mode=block | X-Content-Type-Options: nosniff |
  Referrer-Policy:strict-origin
)

Test der Security Headers Konfiguration

Hat man die Einstellungen in TYPO3 vorgenommen, kann die tatsächliche Konfiguration mit einem Tool überprüft werden: https://securityheaders.io

Weiterführende Informationen

Wer sich mit dem Thema Security Headers intensiver beschäftigen möchte, kann sich auf den folgenden Webseiten informieren:

Webseite von Scott Helme
OWASP Project Security Headers

Aktualisiert: 01.02.2018