Headereinträge zur Verbesserung der Sicherheit

Seien es die Angreifbarkeit älterer TLS(SSL)-Protokolle, die Abhör- und Ausspähskandale der letzten Monate oder einfach nur die permanente Gefahr eines Angriffs auf die Webseite unter Ausnutzung von Sicherheitslücken in der eingesetzten Software.
Alle diese Dinge bereiten sicher so manchem Webmaster oder Seitenbetrieber Kopfzerbrechen. Dass es die absolute Sicherheit nicht geben kann, ist wohl jedem klar, aber es gibt zahlreiche Punkte und Konfigurationsmöglichkeiten, um eine Webseite ein klein wenig sicherer zu machen.

Das Ziel sollte es aber dennoch sein, Angriffe möglichst „teuer“ zu machen. Dies bedeutet, je mehr Ressourcen (Zeit, Know-How, Hardware, Software-Tools etc.) es erfordert, um eine Lücke zu finden oder auszunutzen, umso geringer wird die Wahrscheinlichkeit einer erfolgreichen Attacke.

Daher habe ich mal wieder ein paar Punkte gesammelt, die zudem relativ leicht auch für Laien umzusetzen sind. Gerade auch im Hinblick auf Seitenbetreiber die beispielsweise selbst keinen Zugriff auf die Konfiguration Ihres Webservers (z.B. Apache) haben. Darunter fallen schon einmal alle Anwender ohne eigenen Server.

Es handelt sich um Headereinträge, die wir per .htaccess setzen und an die Browser übermitteln. Alle nachfolgend beschriebenen Einträge gelten für den Apache Webserver und benötigen das Apache Module „mod_headers„. Ebenfalls können diese nicht nur per .htaccess, sondern auch in der Server-Config bzw. den Einträgen zu einzelnen Virtual-Hosts hinterlegt werden. Es existieren natürlich noch mehr Einträge und Prüfungen, die man setzen kann und die Beispiele haben keinen Anspruch auf Vollständigkeit.

Es existiert dazu ein aktuellerer Beitrag zu diesem Thema aus 2017, der noch mehr Einträge beschreibt: „10 Apache Header Einträge die Ihre Webseite sicherer machen“

HTTP Strict Transport Security (HSTS)

Mittels dieses Header-Eintrags informiert der Webserver, der HSTS unterstützen muss, den anfragenden Browser beim ersten Kontakt via HTTP/HTTPS darüber, dass alle Verbindungen zur Website künftig per SSL/TLS verschlüsselt werden sollen. Allerdings erfolgt keine automatische Umleitung von http auf https. Auch kann dadurch der erste Verbindungsaufbau zur Webseite allerdings weiterhin per http erfolgen. Dieser Headereintrag macht natürlich nur Sinn, wenn Ihr ein SSL-Zertifikat einsetzt. Ein Beispielcode, die Angaben beginnend mit der Raute sind nur Kommentare und werden beim abarbeiten der .htaccess nicht ausgewertet:

# HTTP Strict Transport Security (HSTS) aktivieren
# Pflichtangabe: „max-age“
# Optional: „includeSubDomains“
   Header set Strict-Transport-Security „max-age=31556926, includeSubDomains“

Bedeutung: Verbiete alle unsicheren Verbindungen für die nächsten 365 Tage zu meiner Domain, mit oder ohne Subdomains.

X-Content-Type-Options

Es existiert nur ein definierbarer Wert „nosniff“, der verhindert, dass Internet Explorer und Google Chrome unabhängig vom deklarierten Content-Type (z.B. text/html) nach weiteren möglichen MIME-Types suchen. Für Chrome gilt dies auch für das Herunterladen von Erweiterungen. Der Headereintrag reduziert die Belastung durch sog. Drive-by-Download-Attacken und Webseiten, die den Upload von Dateien unterstützen, die, wenn deren Namen geschickte gewählt wurden, vom Browser als ausführbare Datei oder dynamische HTML-Datei behandelt werden und damit euren Rechner oder andere mit Schadcode infizieren.

# Verhindert mime based attacks, nur IE und Chrome
   Header set X-Content-Type-Options „nosniff“

X-XSS-Protection

Dieser Header aktiviert die in den meisten aktuellen Browsern eingebauten Cross-Site-Scripting (XSS)-Filter. Zwar sind diese standardmäßig aktiviert, daher ist dieser Header nur dazu da, den Filter für eure Seite wieder zu aktivieren, falls der Benutzer ihn abgeschaltet hat. Zudem wird er erst/nur ab dem IE 8 und in Chrome unterstützt.

# Aktiviert XSS Praeventions-/Filter-Tools, nur IE und Chrome
   Header set X-XSS-Protection „1; mode=block“

X-Frame-Options

Ob einem Browser erlaubt wird, eine Seite in einem frame oder iframe darzustellen, legt dieser Headereintrag fest. Damit können sog. Clickjacking-Attacken vermieden werde, indem sichergestellt wird, dass eure Webseite nicht in eine anderen Webseite eingebettet wird. Es gibt verschiedene Werte:

DENY: Kein Rendeeing der Seite, wenn Sie in einem frame oder iframe geladen wird
SAMEORIGIN: Rendering der Seite erfolgt nur, wenn der frame oder iframe innerhalb eurer Domain ist
ALLOW-FROM DOMAIN: Verhindert, dass die Seite dargestellt werden kann, wenn es sich um eine andere Domain handelt, als die hier angegebene

# Verhindert Clickjacking, Begrenzung der frame/iframe Darstellung
   Header append X-Frame-Options „SAMEORIGIN“

Zusammenfassung:

Zusammengefasst ein Beispielcode der oben genannten Zeilen für eure .htaccess für den Apache Webserver. Es wird zusätzlich geprüft, ob mod_headers.c zur Verfügung steht und Header-Einträge überhaupt gesetzt/übermittelt werden können:

## Mod Headers – Security
<IfModule mod_headers.c>
   # HTTP Strict Transport Security (HSTS) aktivieren
   Header set Strict-Transport-Security „max-age=31556926, includeSubDomains“
   # Avoid Clickjacking, Seite darf nur in frame oder iframe geöffnet werden auf eigener Domain
   Header append X-Frame-Options „SAMEORIGIN“
   # Turn on XSS prevention tools, activated by default in IE and Chrome
   Header set X-XSS-Protection „1; mode=block“
   # prevent mime based attacks like drive-by download attacks, IE and Chrome
   Header set X-Content-Type-Options „nosniff“
</IfModule>

Ihr könnt prüfen, welche Header eure Webseite an den Browser übermittelt. Für alle, die nicht wissen wie, geht das natürlich auch über einen Dienst online wie z.B. http://pgl.yoyo.org/http/browser-headers.php
Tragt dort einfach eure Domain ein und ihr seht, ob und welche Werte jeweils übermittelt werden: Strict-Transport-Security , X-Frame-Options, Content-Type-Options, X-XSS-Protection

9 Antworten

  1. Leon 21. Juli 2015 / 16:03

    Ich habe den Header-Eintrag „HTTP Strict-Transport-Security“ mal bei mir auf einem lokalen xampp bzw. Apache Server getestet, indem ich mit der PHP-Funktion header() diesen Header-Eintrag wie folgt setze:

    header(„Strict-Transport-Security: max-age=31536000“);

    Allerdings wird hier nach dem ersten Aufruf und folgende Aufrufe nicht automatisch eine verschlüsselte HTTPS-Verbindung erzwungen.

    Woran könnte hier mein Problem liegen? Manuell kann eine HTTPS Verbindung jedenfalls erzeugen, aber auch eine HTTP-Verbindung.

    Vielen Dank und mit freundlichen Grüßen

    Leon

    • dietmar 23. Juli 2015 / 23:13

      Hi Leon,
      du hast alles richtig gemacht. Das „Problem“ ist, dass eine automatische Umleitung von http auf https nicht per HSTS erfolgt. Das war zwar ursprünglich angedacht, wurde aber nie so realisiert. Leider findet sich diese Falschinfo bezüglich automatischer Umleitung an vielen Stellen im Netz und ich hatte das selbst bisher nicht angepasst in meinem Beitrag . Du müsstest z.B. per htaccess-Rewrite eine automatische Umleitung von http auf https realisieren.

  2. Franz Meyer 26. Februar 2016 / 14:24

    Guten Tag
    ich bin neulich auf diesen Artikelecke stoßen und da ich das Ganze äußerst interessant und wichtig finde, möchte ich das kann zwei auch auf meiner Webseite anwenden.
    Habe dazu eine Frage: Sie haben folgendes empfohlen:
    Header append X-Frame-Options „SAMEORIGIN“
    was ist denn der Unterschied zu folgendem?
    Header always set X-Frame-Options SAMEORIGIN

    vielen Dank schonmal für Ihre Antwort

    • dietmar 26. Februar 2016 / 23:43

      Hallo Herr Meyer,
      Header always set X-Frame-Options SAMEORIGIN wird auch funktionieren. „Header set“ bzw. „always set“ setzt den Header auf den angegeben Wert und ersetzt evtl. vorhandene Einträge mit diesem Namen.

      Bei der angegebenen Version von „append“ wird, im Falle es existiert bereits ein gleichnamiger Eintrag, dieser erweitert. Das ist z.B. erforderlich, wenn Sie zwar eigentlich nur die Ausführung auf der eigenen Domain wollen, aber dennoch zusätzlich eine spezifische URL auch noch zulassen wollen.
      Setzen Sie z.B. SAMEORIGIN aber möchten in einem Unterverzeichnis dennoch Inhalt auch von einer anderen URL zulassen, können Sie einfach darin nochmals eine .htaccess erstellen und dort etwas wie Header append X-Frame-Options „ALLOW-FROM https://example.com/“ eintragen dann wird der Header erweitert, allerdings nicht ersetzt.

      • Franz Meyer 27. Februar 2016 / 09:26

        Vielen Dank für Ihre ausführliche Erklärung!
        Wünsche Ihnen noch einen schönen Tag

  3. Franz Meyer 2. April 2016 / 14:53

    Jetzt hätte ich noch einmal eine Frage bzw. ich habe ein Problem.
    Ich möchte inline CSS und Skripte erlauben. Dazu habe ich folgenden Code erstellt:
    Header set Content-Security-Policy: "default-src 'self'; script-src 'unsafe-inline' 'unsafe-eval'; style-src 'unsafe-inline'"
    inline CSS funktioniert damit, aber inline Skript wird nicht ausgeführt.
    Wir muss denn mein Code korrekt lauten?

    • Jürgen Auer 9. Oktober 2016 / 21:59

      unsafe-inline und unsafe-eval sind Schlüsselwörter. Und müssen in Hochkommata (‚) notiert werden.

      Also:

      Header set Content-Security-Policy: "default-src ’self‘; script-src 'unsafe-inline' 'unsafe-eval'; style-src 'unsafe-inline'"

      Das sieht so aus, als sei der Code von Word her reinkopiert worden, so daß Word einfache Anführungszeichen (oben) ersetzt durch unten/oben. Ferner könnte beim script-src noch ein ’self‘ fehlen, so werden aktuell keine Scriptdateien geladen.

  4. Kreuzfahrten 11. Juni 2017 / 10:44

    Guten Tag. Dank für diesen großartigen Artikel. Ich mag Deine Webseite!

Schreibe einen Kommentar

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