HTTP Strict Transport Security (HSTS)

Acabo de aprender sobre HSTS y empecé a usarlo. Primero, déjenme explicar HSTS con mis propias palabras.

Escenario sin HSTS:

El usuario escribe el nombre de dominio en la barra de URL sin el protocolo, por ejemplo “example.com”, y el navegador automáticamente agrega el prefijo “http://”. Esta primera solicitud es vulnerable a ataques de tipo Man In The Middle (MITM).
El servidor responde con una redirección hacia el seguro “https://example.com”. Desde el resto de la interacción, la comunicación es segura.
Al día siguiente, el usuario escribe nuevamente “example.com” en la barra de URL. El navegador envía otra vez una solicitud HTTP insegura.

Escenario con HSTS:

El usuario escribe el nombre de dominio en la barra de URL sin el protocolo, por ejemplo “example.com”, y el navegador automáticamente agrega el prefijo “http://”. Esta primera solicitud es vulnerable a ataques MITM.
El servidor responde con una redirección hacia el seguro “https://example.com”. Desde el resto de la interacción, la comunicación es segura. Además, el servidor agrega el encabezado de respuesta:

 
Strict-Transport-Security: max-age=31536000
 

Este encabezado le indica al navegador que use HTTPS, y que lo haga durante los próximos 31.536.000 segundos (1 año).

Al día siguiente, el usuario escribe nuevamente “example.com” en la barra de URL. Pero el navegador recuerda la instrucción, y usa HTTPS en lugar de HTTP. Y lo hará incluso si el usuario incluye explícitamente el prefijo “http://example.com”.

Conclusión:

Con HSTS, el usuario solo será vulnerable la primera vez, y no cada vez que inicie sesión.

Después de aprender esto, he agregado soporte para HSTS en mi rol de Ansible para despliegues de Django. Revisa el commit, y te animo a que también empieces a usar HSTS.

Enlaces:

  • Detalles sobre HSTS y Nginx (imprescindible si usas Nginx)
  • Reporte sobre HSTS por Netcraft

¡Que tengas un día seguro!