Descubre cómo HSTS puede ayudarte a mejorar la seguridad de tu sitio web

HTTP to HTTPS

HTTP to HTTPS

Cada vez son más los sitios web que utilizan únicamente HTTPS para servir su contenido, especialmente después de que Google anunciase que valorará positivamente en los resultados de búsquedas aquellos que así lo hagan. Para implementar esta medida se puede realizar de 2 maneras:

  1. Servir únicamente el contenido web en el puerto 443 (HTTPS).
  2. Redirigir todas las conexiones HTTP a HTTPS (301).

La primera de las opciones, tiene el inconveniente que si alguien se intenta conectar por HTTP (suele ser lo habitual) le dará error y no podrá acceder al sitio, por lo que es habitual que se implemente la segunda.

Esa redirección puede ser vulnerable a un ataque man-in-the-middle (ssl-trip) y en este artículo veremos como con HSTS podemos securizarlo. Veamos un ejemplo para entenderlo mejor:

Mientras esperas a que llegue tu vuelo en el aeropuerto de Bilbao, te conectas a la conexión WIFI gratuita y empiezas a navegar, visitando tu email y cuenta bancaria. En realidad, la WIFI gratuita a la que te has conectado, no es la del aeropuerto, sino que es el portátil de un ladrón de contraseñas puesto en modo Rogue AP. El atacante intercepta esa primera conexión HTTP y te redirige a una copia de la web de tu correo o tu banco sin que te des cuenta (a un dominio parecido con SSL). En cuanto introduzcas tus datos, los captura y te vuelve a redirigir al sitio real (para que no te des cuenta que te ha robado los datos).

SSLStrip

Imagen de exploitedsecurity.org

Esto, que parece sacado de una película, es algo que sucede con más frecuencia de la que nos gustaría.

HTTP Strict Transport Security (HSTS) es una directiva de seguridad (RFC 6797)  que permite en gran medida evitar este problema. Establece que durante un tiempo X (max-age) tanto el dominio solicitado como todos sus subdominios (includeSubDomains) deben operar bajo la especificación HSTS, obligando que todas las conexiones se realicen bajo HTTPS. Además el navegador web deberá cachear este dato para su uso en futuras conexiones a este dominio y sus correspondientes subdominios.

En algún momento anterior al ataque habrás accedido a la web de tu correo o tu banco, que tienen HSTS configurado, por lo que tu navegador sabrá que únicamente tiene que utilizar HTTPS, y no usará HTTP aunque tu se lo digas, evitando así el posible ataque man-in-the-middle.

Navegadores soportados

SSL with HSTS

Imagen de securityinside.info

Actualmente la mayoría de los navegadores modernos soportan HSTS. Concretamente:

  • Firefox 4.0 en adelante
  • Google Chrome/Chromium 4.0.211.0 en adelante
  • Safari 7 (Mavericks) en adelante
  • Opera 12.1 en adelante
  • Android Browser desde Android 4.4 en adelante
  • IOS Safari desde IOS 8 en adelante

Curiosamente (o no tanto) Internet Explorer aun no lo implementa, aunque espera hacerlo a partir de la versión 12.

Puedes consultar aquí el listado completo de soporte de HSTS en los diferentes navegadores.

Servidores web soportados

Actualmente la mayoría de los servidores web modernos soportan HSTS. Concretamente:

  • Apache 2.2.22 en adelante
  • Nginx 1.1.19 en adelante
  • IIS 7 en adelante

También está soportada en otros servidores aquí no indicados.

Entendiendo la directiva HSTS

Implementarlo es sumamente fácil. Solamente hay que añadir la siguiente directiva en el servidor web:

Strict-Transport-Security "max-age=31536000; includeSubdomains; preload"

Esta cabecera forzará a almacenar la directiva en el navegador durante 1 año (max-age en segundos). Cada vez que vuelves a entrar en el sitio web, se renueva de nuevo, así que mañana también serán de nuevo 1 año. Afecta a todos los subdominios del dominio (includeSubdomains).

HSTS demasiado estricto (includeSubdomains)

Es importante tener cuidado con configuraciones demasiado severas. Incluir todos los subdominios (includeSubdomains) obliga a que todos los subdominios estén configurados sobre HTTPS, y en caso de no estarlo, las páginas no serán accesibles. Utiliza esta directiva con cuidado si no quieres dejar alguno de tus sitios web sin acceso. Un error en esta configuración puede significar que durante 1 año no se pueda acceder a tu sitio (ya que el navegador del cliente lo recordará durante max-age). En caso en que no quieras hacerlo la directiva a usar sería:

Strict-Transport-Security "max-age=31536000; preload"

Preload o como solventar la debilidad de HSTS

Seguro que ya te habrás dado cuenta que HSTS tiene una debilidad, la primera vez que te conectas, en la que el navegador aun no tiene la directiva almacenada para cada dominio. Esa primera vez el proceso es vulnerable (el atacante puede colocarse en medio y eliminar la cabecera HSTS).

Para solventarlo, Chrome ha creado una lista HSTS (utilizada también por Firefox y Safari) para poder per-cargar las directivas directamente en los navegadores y solventar esa primera vez.

Mediante la opción preload consentimos que los navegadores pre-carguen nuestro dominio.

Implementar HSTS en los servidores web

Apache

Edita la configuración de apache (httpd.conf) y añade la directiva únicamente en el VirtualHost correspondiente a HTTPS (no HTTP). Requiere tener cargado previamente mod_headers.so.

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

Y solo queda redirigir todo el tráfico HTTP a HTTPS:

<VirtualHost *:80>
  [...]
  <IfModule mod_rewrite.c>
    RewriteEngine On
    RewriteCond %{HTTPS} off
    RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]
  </IfModule>
</VirtualHost>

No te olvides de reiniciar apache.

Nginx

Edita la configuración de nginx (nginx.conf) y añade la directiva únicamente en el VirtualHost correspondiente a HTTPS (no HTTP).

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

Y solo queda redirigir todo el tráfico HTTP a HTTPS:

server {
  listen 80;
  
  return 301 https://$server_name$request_uri;
}

server {
  listen 443;
  add_header Strict-Transport-Security max-age=31536000;
}

No te olvides de reiniciar nginx.

Conclusiones

Desde Irontec te recomendamos implantar SSL y HSTS en todos los servidores web para mejorar la seguridad de tus usuarios y la reputación de tu sitio. Es importante definirlo correctamente para evitar que algún sitio web se quede inaccesible.

HSTS mejora la seguridad frente a posibles ataques de man-in-the-middle y sslstrip, no permite evitarlos del todo, ya que como se indica en el RFC de HSTS existen otros posibles ataques como NTP o DNS spoofing que pueden servir para evitar la protección ofrecida por HSTS, pero de eso hablaremos en otra ocasión.



¿Te gusta este post? Es solo un ejemplo de cómo podemos ayudar a tu empresa...
Sobre Iker Sagasti Marquina

Iker Sagasti es CEO de Irontec, con más de 15 años de experiencia trabajando con Software Libre. Ingeniero de Telecomunicaciones, aficionado a la fotografía y viajero empedernido. Cuenta los días para cumplir el sueño de trabajar en chanclas delante de una playa con una cerveza fría en mano.

1 Comentario

¿Por qué no comentas tú también?

Queremos tu opinión :)