HTTP Strict Transport Security (HSTS) es un mecanismo de seguridad
web donde el servidor exige que las conexiones se realicen únicamente
mediante conexiones seguras. El servidor informa de esta política de
seguridad utilizando la cabecera Strict-Transport-Security
, en donde
se especifica el periodo durante el cual las conexiones seguras son
obligatorias.
Si una web proporciona acceso seguro (HTTPS) pero accedemos de forma no segura (HTTP) podría suceder que nos redirija a la versión segura, sin embargo, ya se había iniciado una conversación sin cifrar. Este comportamiento puede ser explotado por un ataque Man-In-The-Middle.
La política de seguridad HSTS pretende evitar este tipo de ataques, impidiendo que se realice ninguna conexión que no sea segura. La cabecera no se envía durante una transacción HTTP no cifrada dado que el User-Agent no sabe si HTTPS está disponible y porque podría haber sido inyectada por un atacante.
Configuración en Apache
En Apache, además de tener habilitado mod_headers
, deberemos
introducir la siguiente línea allí donde configuramos la conexión
SSL. Por ejemplo, tras el DocumentRoot
del VirtualHost
seguro por
defecto en el archivo /etc/apache2/sites-enabled/default-ssl
:
Header add Strict-Transport-Security "max-age=15768000"
El atributo max-age
especifica el tiempo durante el cual las
conexiones seguras serán obligatorias. También se puede añadir el
atributo includeSubDomains
para incluir todos los subdominios:
Header add Strict-Transport-Security "max-age=15768000; includeSubDomains"
WordPress, por ejemplo, tiene una directiva para conseguir que la
conexión al panel de control se haga a través de una conexión
segura. Pero es posible que en otros casos sigamos necesitando una
redirección hacia la versión segura de la página, que podemos conseguir
mediante mod_rewrite
:
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI}
</IfModule>