Cómo configurar el encabezado HSTS desde .htaccess solo en HTTPS [cerrado]

81

Mi aplicación web se ejecuta en un número diferente de hosts que controlo. Para evitar la necesidad de cambiar la configuración de Apache de cada vhost, agrego la mayor parte de la configuración usando archivos .htaccess en mi repositorio para que la configuración básica de cada host sea solo un par de líneas. Esto también hace posible cambiar la configuración al implementar una nueva versión. Actualmente, .htaccess (des) establece encabezados, hace algo de magia de reescritura y controla el almacenamiento en caché del UA.

Quiero habilitar HSTS en la aplicación usando .htaccess. Simplemente configurar el encabezado es fácil:

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

Pero la especificación establece claramente: "Un host HSTS NO DEBE incluir el campo de encabezado STS en las respuestas HTTP transmitidas por transporte no seguro". Entonces no quiero enviar el encabezado cuando lo envío a través de conexiones HTTP. Consulte http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14 .

Traté de configurar el encabezado usando variables de entorno, pero me quedé atascado allí. ¿Alguien que sepa cómo hacer eso?

nielsr
fuente
Stack Overflow es un sitio para preguntas de programación y desarrollo. Esta pregunta parece estar fuera de tema porque no se trata de programación o desarrollo. Consulte ¿Qué temas puedo preguntar aquí en el Centro de ayuda? Quizás Super User o Unix & Linux Stack Exchange sería un mejor lugar para preguntar. Consulte también ¿Dónde publico preguntas sobre Dev Ops?
jww
6
@jww Los archivos .htaccess son parte de mi repositorio de aplicaciones web y los desarrolladores los mantienen para obtener el comportamiento deseado de la aplicación (por ejemplo, almacenamiento en caché, reescritura de URL y configuración de los encabezados correctos). La pregunta se ve casi 20K veces aquí en SO (y las etiquetas [apache], [.htaccess] y [mod-headers] están disponibles). Así que no creo que esté fuera de tema aquí.
nielsr
1
"Los archivos .htaccess son parte de mi repositorio de aplicaciones web y son mantenidos por desarrolladores ..." - Tampoco son criterios para su inclusión en Stack Overflow. Una buena prueba de rastreo es, ¿puede mostrar su código? En este caso, la respuesta es NO. Después del examen, es solo una pregunta de configuración de Apache. "La pregunta se ve casi 20.000 veces ..." - Stack Overflow es un vertedero. Aquí se hace una pregunta fuera de tema y luego un motor de búsqueda la indexa. Otros ejemplos del fenómeno incluyen la transferencia de archivos a través de SSH . Los desarrolladores también usan SSH en ocasiones.
jww

Respuestas:

110

Aparentemente, hay una variable de entorno HTTPS disponible que se puede usar fácilmente. Para personas con la misma pregunta:

Header set Strict-Transport-Security "max-age=31536000" env=HTTPS
nielsr
fuente
2
¿En qué archivo está hecha esta configuración?
ted.strauss
7
@ ted.strauss estaría en el .htaccessarchivo.
zen
Por alguna razón, esto no funciona en mi servidor. Apache 2.4
Andy
14
No funcionó para mí también; Sin embargo, anexar "expr=%{HTTPS} == 'on'"funcionó. Entonces toda la línea es Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'". ¿Quizás sea por la alwayspalabra clave?
Adrian Föder
3
Tenga en cuenta que la HTTPS var env en la condición env=HTTPSes diferente a la var del servidor que comúnmente vemos en las condiciones mod_rewrite (y Apache expr) como %{HTTPS}. Dado que esta es una variable env , depende del entorno, es decir. configuración del servidor. A veces, nunca se establece. A veces se le asigna el mismo valor que la HTTPSvar del servidor (por lo que siempre se establece en "off" o "on", ¡y la condición siempreenv=HTTPS es verdadera! Simplemente prueba si la var env está configurada, no que esté "on" .) Se recomienda usar Apache expr como sugiere @ AdrianFöder en Apache 2.4+env=HTTPS
MrWhite
28

Para aprovechar la respuesta de nielsr, utilicé lo siguiente en .htaccess para cumplir con las recomendaciones de implementación segura en https://hstspreload.org que codificará el dominio en el navegador Chrome. Tenga en cuenta que esto impondrá HSTS en sus subdominios y que la inclusión en la lista de precarga no se puede deshacer fácilmente, por lo que rtfm.

<IfModule mod_headers.c>
Header set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload" env=HTTPS
</IfModule>
LJT
fuente
6
Es un poco más seguro, sí, si solo tiene la intención de usar HTTPS en todo su dominio. De lo contrario, es increíblemente peligroso, por lo que es irresponsable sugerirlo sin previo aviso. Supongamos que su servidor web responde con este encabezado a una solicitud en un dominio de nivel superior (ejemplo.com); luego, mientras incluye subdominios, cualquier otro subdominio servido por un servidor web diferente solo a través de http y no https (por ejemplo, intranet.example.com) , no trabajará. La inclusión de la etiqueta de precarga también permite enviarla a una lista de precarga para que esté codificada en los navegadores web y luego sea irreversible.
Barry Pollard
Han pasado unos años, por lo que solo estoy comentando que su fragmento sigue siendo efectivo a partir de hoy.
KGIII
6

Puede usar esto y ponerlo en su archivo htaccess para cumplir con https://hstspreload.org . ponga esto en su archivo .htaccess.

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

primero, hará la redirección de no https a https. y redirigir https no www a www https con encabezado HSTS.

( http://example.com -> https://example.com -> https://www.example.com - con encabezado HSTS)

Probado y cumple con https://hstspreload.org

Yuda Prawira
fuente
4

Para httpd.conf(si tiene acceso para editar esto) puede usar

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

NOTA: Debe configurarlo solo en HTTPS vhost y no puede estar en http vhost.

¿Cuándo debería y no debería utilizar archivos .htaccess?

Permitir archivos .htaccess hará que Apache los busque en cada acceso a su servidor. Dado que también se realizan búsquedas en los directorios principales, esto llevará una (pequeña) cantidad de tiempo y puede afectar el rendimiento de su servidor. Fuente

Aniket Thakur
fuente
Apache siempre buscará archivos .htaccess. Entonces, a menos que haya deshabilitado las búsquedas .htaccess, esto no mejorará el rendimiento, ya que Apache buscará el archivo de todos modos.
Rudy Broersma
1

Otra alternativa más es establecer siempre el encabezado y eliminarlo condicionalmente para conexiones que no sean ssl:

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

Esto tiene la ventaja de que la Headerdirectiva se puede utilizar tanto con la envcondición como con la earlybandera. Con una sola Headerdirectiva, envy earlyno se pueden usar juntas, son mutuamente excluyentes (consulte la documentación oficial: https://httpd.apache.org/docs/current/mod/mod_headers.html#header ).

Studersi
fuente