So setzen Sie den HSTS-Header von .htaccess nur auf HTTPS [geschlossen]

81

Meine Webanwendung wird auf einer anderen Anzahl von Hosts ausgeführt, die ich steuere. Um zu verhindern, dass die Apache-Konfiguration jedes vhost geändert werden muss, füge ich den größten Teil der Konfiguration mithilfe von .htaccess-Dateien in meinem Repo hinzu, sodass die Grundeinstellung jedes Hosts nur aus wenigen Zeilen besteht. Dies ermöglicht auch das Ändern der Konfiguration beim Bereitstellen einer neuen Version. Derzeit setzt .htaccess (un) Header, schreibt etwas um und steuert das Caching der UA.

Ich möchte HSTS in der Anwendung mit .htaccess aktivieren. Das Setzen des Headers ist einfach:

Header always set Strict-Transport-Security "max-age=31536000"

In der Spezifikation heißt es jedoch eindeutig: "Ein HSTS-Host darf das STS-Headerfeld NICHT in HTTP-Antworten enthalten, die über einen nicht sicheren Transport übermittelt werden." Daher möchte ich den Header nicht senden, wenn er über HTTP-Verbindungen gesendet wird. Siehe http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14 .

Ich habe versucht, den Header mithilfe von Umgebungsvariablen festzulegen, bin aber dort hängen geblieben. Wer weiß, wie das geht?

nielsr
quelle
Stack Overflow ist eine Site für Programmier- und Entwicklungsfragen. Diese Frage scheint nicht zum Thema zu gehören, da es nicht um Programmierung oder Entwicklung geht. Weitere Informationen zu den Themen finden Sie hier in der Hilfe. Vielleicht ist Super User oder Unix & Linux Stack Exchange ein besserer Ort, um zu fragen. Siehe auch Wo poste ich Fragen zu Dev Ops?
JWW
6
@jww Die .htaccess-Dateien sind Teil meines Web-App-Repos und werden von Entwicklern verwaltet, um das gewünschte Verhalten der Anwendung zu erhalten (z. B. Zwischenspeichern, Umschreiben von URLs und Festlegen der richtigen Header). Die Frage wird hier auf SO fast 20.000 Mal angezeigt (und die Tags [apache], [.htaccess] und [mod-headers] sind verfügbar). Ich denke also nicht, dass es hier nicht zum Thema gehört.
Nielsr
1
"Die .htaccess-Dateien sind Teil meines Web-App-Repos und werden von Entwicklern verwaltet ..." - Es gibt auch keine Kriterien für die Aufnahme in den Stapelüberlauf. Ein guter Schnüffeltest ist, können Sie Ihren Code zeigen? In diesem Fall lautet die Antwort NEIN. Nach der Prüfung ist es nur eine Apache-Konfigurationsfrage. "Die Frage wird fast 20.000 Mal angezeigt ..." - Der Stapelüberlauf ist eine Müllhalde. Hier wird eine Off-Topic-Frage gestellt, die dann von einer Suchmaschine indiziert wird. Weitere Beispiele für dieses Phänomen sind das Übertragen von Dateien über SSH . Entwickler verwenden gelegentlich auch SSH.
JWW

Antworten:

112

Anscheinend ist eine HTTPS-Umgebungsvariable verfügbar, die einfach verwendet werden kann. Für Menschen mit der gleichen Frage:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
nielsr
quelle
2
In welcher Datei wird diese Einstellung vorgenommen?
Ted.strauss
7
@ ted.strauss wäre es in der .htaccessDatei.
Zen
Aus irgendeinem Grund funktioniert dies auf meinem Server nicht. Apache 2.4
Andy
14
Hat auch bei mir nicht funktioniert; Das Anhängen "expr=%{HTTPS} == 'on'"funktionierte jedoch. Die ganze Linie ist dann Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'". Vielleicht liegt es am alwaysSchlüsselwort?
Adrian Föder
3
Beachten Sie, dass sich die HTTPS env-Variable in der Bedingung env=HTTPSvon der Server- Variable unterscheidet, die wir normalerweise unter mod_rewrite-Bedingungen (und Apache-Ausdruck) als sehen %{HTTPS}. Da dies eine env- Variable ist, hängt sie von der Umgebung ab, d. H. Serverkonfiguration Manchmal wird es nie eingestellt. Manchmal wird ihm der gleiche Wert wie der HTTPSServer var zugewiesen (daher wird er immer entweder auf "off" oder "on" gesetzt - und die Bedingung env=HTTPSist immer wahr! env=HTTPSTestet einfach, ob der env var gesetzt ist, nicht, dass er "on" ist. .) Die Verwendung eines Apache-Ausdrucks, wie von @ AdrianFöder vorgeschlagen, wird für Apache 2.4+
MrWhite am
29

Um auf der Antwort von nielsr aufzubauen, habe ich im .htaccess Folgendes verwendet, um die Empfehlungen für die sichere Bereitstellung unter https://hstspreload.org zu erfüllen, mit denen die Domain im Chrome-Browser fest codiert wird. Beachten Sie, dass dies HSTS in Ihren Subdomains erzwingt und dass die Aufnahme in die Preload-Liste nicht einfach rückgängig gemacht werden kann, also rtfm.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
LJT
quelle
6
Es ist ein bisschen sicherer, ja - wenn Sie jemals nur beabsichtigen, HTTPS in Ihrer gesamten Domain zu verwenden. Wenn nicht, ist es unglaublich gefährlich - und daher ist es unverantwortlich, es ohne Vorwarnung vorzuschlagen. Angenommen, Ihr Webserver antwortet mit diesem Header auf eine Anfrage in einer Top-Level-Domain (example.com). Wenn Sie dann Subdomains einschließen, wird jede andere Subdomain von einem anderen Webserver nur über http und nicht über https (z. B. intranet.example.com) bereitgestellt. , wird nicht funktionieren. Durch das Einfügen des Preload-Tags kann dieses auch an eine Preload-Liste gesendet werden, sodass es in Webbrowsern fest codiert und dann irreversibel ist.
Barry Pollard
Es ist ein paar Jahre später, also bemerke ich nur, dass Ihr Snippet bis heute noch wirksam ist.
KGIII
6

Sie können dies verwenden und in Ihre htaccess-Datei einfügen, um https://hstspreload.org zu erfüllen . Fügen Sie dies in Ihre .htaccess-Datei ein.

RewriteCond %{HTTPS} !=on
RewriteRule ^(.*)$ https://%{HTTP_HOST}/$1 [R=301,L]

RewriteCond %{HTTP_HOST} !^www\.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}/$1 [R=301,L,E=HTTPS:1]
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS

Zunächst wird eine Umleitung für Nicht-https zu https durchgeführt. und leiten Sie nicht www https zu www https mit HSTS-Header um.

( http://example.com -> https://example.com -> https://www.example.com - mit HSTS-Header)

Getestet und eingehalten https://hstspreload.org

Yuda Prawira
quelle
4

Für httpd.conf(wenn Sie Zugriff haben, um dies zu bearbeiten) können Sie verwenden

<VirtualHost 65.81.122.43:443>
    Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
</VirtualHost>

HINWEIS: Sie müssen es nur auf dem HTTPS-vhost festlegen und dürfen nicht auf http vhost sein.

Wann sollte ich und sollte ich keine .htaccess-Dateien verwenden?

Wenn Sie .htaccess-Dateien zulassen, sucht Apache bei jedem Zugriff auf Ihren Server nach ihnen. Da auch übergeordnete Verzeichnisse durchsucht werden, nimmt dies einige (kleine) Zeit in Anspruch und kann die Leistung Ihres Servers beeinträchtigen. Quelle

Aniket Thakur
quelle
Apache sucht immer nach .htaccess-Dateien. Wenn Sie also die .htaccess-Suche nicht deaktiviert haben, wird die Leistung dadurch nicht verbessert, da Apache ohnehin nach der Datei sucht.
Rudy Broersma
1

Eine weitere Alternative besteht darin, den Header immer festzulegen und für Nicht-SSL-Verbindungen bedingt zu entfernen:

Header always set   Strict-Transport-Security "max-age=31536000" early
Header        unset Strict-Transport-Security env=!HTTPS

Dies hat den Vorteil, dass die HeaderDirektive sowohl mit der envBedingung als auch mit dem earlyFlag verwendet werden kann. Mit einer einzigen HeaderRichtlinie, envund earlynicht zusammen verwendet werden können, sind sie sich gegenseitig ausschließen (siehe offizielle Dokumentation: https://httpd.apache.org/docs/current/mod/mod_headers.html#header ).

studersi
quelle