HSTS verstehen und konform einrichten

HTTP Strikt Transport Security (HSTS) ist eine Sicherheitsfunktion, die das Aushebeln von HTTPS verhindern soll. Die Idee ist, dass der Browser des Web-Site-Besuchers überprüft, dass die Web-Site garantiert über HTTPS mit gültigen Zertifikat besucht wird. Stellt der Browser einen Fehler fest, wird dieser Fehler angezeigt und die Verbindung sofort abgebrochen. Der Web-Site-Besucher, kann diesen Fehler nicht mit einer Ausnahme überstimmen!

Dieses strenge Verhalten des Browsers erhöht die Sicherheit enorm, erfordert aber auch einige Sorgfalt des Web-Site Betreibers. Dieser muss beispielsweise sicherstellen, dass er immer ein gültiges Zertifikat ausliefert und dass er keine unsicheren Ressourcen/Dienste (z.B. externe Links) nutzt.

Da eine fehlerhafte Web-Site bei aktivierten HSTS nicht mehr erreichbar ist, muss der Web-Site Betreiber, den Browser mitteilen, dass diese Sicherheitsfunktion erzwungen werden soll und für wie lange dieses Verhalten gefordert wird. 

Im RFC6797 sind die notwendigen Anforderungen an HSTS konforme Browser und Server und wie HSTS aktiviert und deaktiviert werden kann, definiert.

Anforderungen an Web-Server

Es ist offensichtlich, dass es nicht damit getan ist, den HSTS Header einfach zu setzen. Vielmehr muss der Web-Site Betreiber folgendes sicherstellen:

  1. Benutzung eines gültigen Zertifikat
  2. HSTS Header nur über sichere Verbindungen senden
  3. Alle nicht sicheren Verbindungen umleiten
  4. HSTS Header richtig setzen

Der Punkt eins kann einfach umgesetzt werden, wenn man beispielsweise ein Zertifikat von Let’s Encrypt nutzt. Let’s Encrypt bietet auch einen Prozess, der automatisch Zertifikate erneuert bevor diese ablaufen. Wer ein anderes Zertifikat nutzt, muss selbst für die Erneuerung sorgen. In Zusammenspiel mit HSTS sollte dies möglichst automatisiert passieren, um nicht in die Gefahr zu laufen, dass die Web-Site wegen eines abgelaufenen Zertifikats nicht mehr erreichbar ist. Selbstsignierte Zertifikate sind für HSTS nicht akzeptiert.

Die Punkte zwei bis vier werde ich nachfolgend besprechen und zeigen wie ich dies für meine Web-Site gelöst habe. Entsprechend beziehe ich mich wieder auf ein Synology NAS mit DSM 6.2 und einen Nginx Webserver. Wie ich diese für WordPress aufgesetzt habe, kann hier nachgelesen werden.