HSTS y cabeceras de seguridad para su sitio web
En cada página, su servidor web envía cabeceras: líneas breves con instrucciones para el navegador. Determinan en parte el nivel de seguridad con el que el navegador trata su sitio. A continuación encontrará qué es HSTS, qué otras cabeceras de seguridad existen y cómo configurarlas y probarlas.
Primero su sitio debe tener un certificado válido y redirigir a los visitantes a https. Puede leer esto en Activar, renovar y solucionar problemas del certificado SSL y Redirigir obligatoriamente a los visitantes a https.
¿Qué hace HSTS?
La redirección a https tiene un momento débil: la primera solicitud a través de http todavía se realiza sin cifrar. Alguien en la misma red, por ejemplo en una wifi pública, puede interceptar esa solicitud. HSTS (HTTP Strict Transport Security) soluciona esto. Su sitio envía esta cabecera a través de https:
Strict-Transport-Security: max-age=31536000
El navegador recuerda entonces que solo puede abrir su sitio a través de https. Si un visitante escribe más tarde http://, el propio navegador lo convierte en https, incluso antes de que se envíe nada por la red. El navegador ignora una cabecera HSTS que llegue a través de http normal.
| Elemento | Significado |
|---|---|
max-age | Cuánto tiempo lo recuerda el navegador, en segundos. La prueba de internet.nl considera suficiente al menos un año (31536000). |
includeSubDomains | También se aplica a todos los subdominios, como shop.jouwdomein.nl y mail.jouwdomein.nl. |
preload | Solicita la inclusión en la lista integrada en los navegadores (hstspreload.org). Así, incluso la primera visita queda protegida. Para ello se necesita, entre otras cosas, un año, includeSubDomains y https en todos los subdominios. Salir de la lista de nuevo lleva mucho tiempo. |
max-age=0 | Borra la instrucción recordada en la siguiente visita a través de https. |
includeSubDomains, esto también se aplica a cada subdominio, como una antigua página de cámara o impresora sin certificado. Por eso, actívelo de forma gradual: empiece con un max-age corto, por ejemplo un día (86400), compruebe que todo funciona y auméntelo en pasos hasta llegar a un año.HSTS en WebOké
En la mayoría de nuestros servidores, el servidor web envía HSTS de forma predeterminada en cada sitio web que se abre a través de https: Strict-Transport-Security: max-age=31536000. Esto equivale a un año, sin includeSubDomains y sin preload. Para ello no tiene que hacer nada. En algunos servidores no está activado de forma predeterminada, en ese caso deberá activarlo usted mismo. Puede comprobar si su sitio ya envía HSTS y con qué max-age en las herramientas para desarrolladores de su navegador o en la prueba de internet.nl (véase más abajo).
El interruptor de HSTS en DirectAdmin
En DirectAdmin, vaya a Dominios y haga clic en el nombre de su dominio. Si Conexión SSL segura está activada, verá junto a HSTS el interruptor Habilitar HTTP Strict Transport Security. Después, haga clic en Guardar para guardar los cambios. Puede leer el proceso paso a paso en Redirigir siempre a los visitantes a https.
Si su sitio ya envía HSTS, no necesita este interruptor. Actívelo solo si su sitio todavía no envía HSTS. Configure HSTS en un único lugar: en DirectAdmin o en .htaccess, no en ambos. Si el navegador recibe dos cabeceras HSTS, solo utilizará la primera.
Las demás cabeceras de seguridad
| Cabecera | Contra qué protege | Valor con el que empezar |
|---|---|---|
X-Content-Type-Options | El navegador intenta adivinar por sí mismo qué tipo de archivo es, lo que permite que una "imagen" subida se ejecute como script. | nosniff (el único valor válido) |
Content-Security-Policy: frame-ancestors o X-Frame-Options | Clickjacking: otro sitio carga su página de forma invisible en un frame, de modo que los visitantes hacen clic en sus botones sin darse cuenta. | frame-ancestors 'self', o la cabecera más antigua X-Frame-Options: SAMEORIGIN |
Referrer-Policy | Al hacer clic hacia otro sitio, el navegador envía la dirección de la página anterior, a veces con un término de búsqueda o un número de pedido incluido. | strict-origin-when-cross-origin, o de forma más estricta same-origin o no-referrer. Internet.nl solo considera correctos los valores estrictos. |
Permissions-Policy | Determina qué funciones del navegador pueden utilizar su página y los frames insertados, como la cámara, el micrófono y la ubicación. | camera=(), microphone=(), geolocation=() desactiva esas tres. Si su sitio utiliza alguna de esas funciones, omítala. |
Content-Security-Policy (completa) | Limita desde qué lugares pueden cargarse scripts, estilos e imágenes. Esto dificulta mucho la inserción de scripts maliciosos (XSS). | Personalizada según cada sitio. Evite unsafe-inline, unsafe-eval y comodines. |
Configuración en .htaccess
Coloque estas líneas al principio del archivo .htaccess en la carpeta public_html de su dominio. Primero haga una copia del archivo.
<IfModule mod_headers.c> Header always set X-Content-Type-Options "nosniff" Header always set Content-Security-Policy "frame-ancestors 'self'" Header always set Referrer-Policy "strict-origin-when-cross-origin" Header always set Permissions-Policy "camera=(), microphone=(), geolocation=()" # Solo si su sitio todavía no envía HSTS (véase más arriba): # Header always set Strict-Transport-Security "max-age=31536000" </IfModule>
Añada includeSubDomains únicamente cuando esté seguro de que todos los subdominios tienen https. Si utiliza WordPress, también puede configurar las cabeceras mediante un plugin. Elija un plugin conocido que siga recibiendo actualizaciones y configure cada cabecera en un único lugar: en el plugin o en .htaccess.
Content-Security-Policy-Report-Only. Esta no bloquea nada, pero muestra en la consola del navegador qué se bloquearía. Si tiene dudas, déjelo en manos de su desarrollador web, o empiece únicamente con frame-ancestors.Pruebas
- Internet.nl: introduzca su dominio en la prueba de sitios web en internet.nl.
- Su navegador: abra su sitio, pulse F12 (o elija Inspeccionar), vaya a la pestaña Red, vuelva a cargar la página y haga clic en la primera solicitud. En Cabeceras de respuesta (Response Headers) verá todo lo que envía su servidor.
- La línea de comandos:
curl -sI https://jouwdomein.nl/muestra las cabeceras.
Después de cada cambio, compruebe que su sitio, formularios y página de pago siguen funcionando. Además, mantenga actualizados su CMS, plugins y temas. Véase Proteger wp-login.php de WordPress.
Más información
- MDN: Strict-Transport-Security (en inglés)
- MDN: Content-Security-Policy (en inglés)
- MDN: Permissions-Policy (en inglés)
- Lista de precarga de HSTS (en inglés)
