HTTP-Strict-Transport-Security (HSTS): HTTP-Security-Header zum Schutz vor MITM-Angriffen

Mit dem HTTP-Security-Header HTTP-Strict-Transport-Security (HSTS) können sogenannte SSL-Stripping bzw. MITM-Angriffe verhindert werden.

Dem Webbrowser wird mittels dem HSTS-Header mitgeteilt, dass dieser die aufgerufene Webseite zukünftig für einen frei zu definierenden Zeitraum nur noch über eine verschlüsselte HTTPS-Verbindung abrufen soll. Dieses soll verhindern, dass ein Angreifer den Datenverkehr umleitet und manipuliert, so dass die angefragte Webseite anstatt über eine verschlüsselte über eine unverschlüsselte Verbindung übertragen wird und der Angreifer somit alle Daten im Klartext mitlesen kann.

In diesem Beitrag erfahrt ihr, wie HSTS für die eigene Webseite eingesetzt werden kann.

HTTP-Strict-Transport-Security - Beschreibung & Funktionsweise

Damit der Webserver weiß, dass dieser die Webseiten einer bestimmten Domain nur noch verschlüsselt abfragen soll, muss der Webserver dies dem Webbrowser mitteilen. Hierzu sendet der Webserver einen entsprechenden HTTP-Header innerhalb der HTTP-Antwort:

HTTP/2 200 OK
date: Sun, 15 Mar 2020 14:30:45 GMT
content-type: text/html; charset=UTF-8
content-length: 2802
strict-transport-security max-age=31536000
HTTP-Antwort mit HTTP-Strict-Transport-Security-Header

Das o.a. Beispiel weist den Webbrowser an, die Webseite zukünftig für die nächsten 31536000 Sekunden (entspricht einem Jahr) nur noch über eine verschlüsselte HTTPS-Verbindung abzurufen. Ruft der Benutzer in seinem Webbrowser nun beim nächsten mal die Webseite mit http://www.domain.de auf, dann sorgt der Webbrowser dafür, dass die eigentliche Anfrage an https://www.domain.de gestellt wird. Letztendlich gilt das für alle Ressourcen der Domain. Somit werden auch etwaige in der Webseite per HTTP eingebundene Ressourcen, wie z.B. Grafikdateien (http://www.domain.de/bild1.png) direkt per HTTPS abgerufen.

Header-Einstellungen im Detail

Der HSTS-Header stellt folgende 3 Paramter bereit:

max-age:
Hiermit wird die Gültigkeit ("Lebensdauer") der HSTS-Policy festgelegt. Der Webbrowser wird zukünftig für die angegebene Zeit Ressourcen dieser Domain nur noch verschlüsselt abrufen. Die Angabe erfolgt dabei in Sekunden.

includeSubDomains:
Hiermit kann HSTS auch für alle Subdomains aktiviert werden.

preload:
Beim ersten Aufruf einer Webseite kann HSTS noch nicht greifen bzw. schützen, weil der Webbrowser noch nicht die Kenntnis darüber hat, ob HSTS für die aktuelle Webseite gesetzt ist. Hier kommt der von Google initiierte preload-Parameter ins Spiel. Um das "trust on first use"-Problem zu lösen, kann eine Domain zu einer von Google gewarteten HSTS-Preload-Liste hinzugefügt werden. Bevor der Webbrowser die Webseite einer Domain zum ersten Mal aufruft, guckt dieser in der genannten Liste nach, ob die Domain dort enthalten ist. Wenn das der Fall ist, wird die Webseite direkt per HTTPS aufgerufen.
Angemerkt sei, dass dieser Parameter nicht Teil des RFCs ist.

Kritik, Schwächen & häufige Fehler beim Einsatz von HSTS

Folgende Dinge sind ggf. beim Einsatz von HSTS zu berücksichtigen:

Webbrowser-Unterstützung

HSTS wird von allen gängigen Webbrowsern unterstützt (siehe caniuse.com).

HTTP-Strict-Transport-Security-Header übertragen

Damit der Webserver den HSTS-Header mitsendet, ist dieser entsprechend zu konfigurieren:

Apache:
In der Apache-Konfigurationsdatei oder in der .htaccess ist folgende Anweisung zu hinterlegen:

Header set Strict-Transport-Security "max-age=31536000; includeSubDomains"
Apache-Konfigurationsdatei bzw. .htacess

nginx:
Analog dazu ist für nginx in der Konfigurationsdatei Folgendes einzufügen:

add_header Strict-Transport-Security "max-age=31536000; includeSubDomains";
nginx-Konfigurationsdatei

HSTS-Einstellungen von coding.blatt

Hier auf coding.blatt ist der HSTS-Header wie folgt gesetzt:
max-age=31536000; includeSubDomains.

Fazit

HSTS ist ein weiterer Baustein, die Sicherheit eurer Website oder Webanwendung zu erhöhen. Durch das Erzwingen von verschlüsselten HTTPS-Verbindungen, können eure Benutzer nicht mehr (ggf. unwissentlich) über eine unverschlüsselte Verbindung eure Website abrufen.

Aktualisierungshistorie:
  • 4. Juli 2020
    Bereich "HSTS-Einstellungen von coding.blatt" angepasst - anstatt max-age=31536000 verwende ich nun hier im Blog max-age=31536000; includeSubDomains
Feedback

Für Feedback zum Beitrag, seien es Fragen, Korrigierungen und/oder Anregungen, könnt ihr mir gerne eine Nachricht per E-Mail oder Mastodon schreiben (siehe Kontakt).