Cabeceras HTTP de seguridad

Informar al navegador del usuario que visita nuestra página para que permita hacer algunas tareas es algo habitual, y también deberíamos informarle de qué puede o no hacer en cuanto a seguridad.

Y esto lo podemos hacer añadiendo algunas cabeceras de seguridad a nuestro WordPress mediante configuraciones en Apache HTTPD o NGINX (el servidor web) o con algunos plugins.

Aquí vamos a ver algunas de esas cabeceras para saber para qué sirven y cómo se utilizan.

Strict-Transport-Security (HSTS)

Definido en el RFC 6797, el HSTS es una cabecera que indica que el navegador ha de utilizar HTTPS sí o sí en el sitio, y que no puede usar HTTP para nada. En este caso las peticiones HTTP se ignorarían.

Hay que indicarle el tiempo que queremos que el navegador se acuerde de que ese sitio ha de visitarse de forma segura. También podemos indicarle si los subdominios de ese sitio también ha de cumplir esta regla.

Strict-Transport-Security: max-age=31536000; includeSubDomains; preload;

Con esto le diríamos que durante un año ha de cumplir la regla del HTTPS y que los subdominios también han de cumplirlo.

Puedes validar si se está haciendo la carga del HSTS de forma correcta con la herramienta hstspreload.org.

X-Frame-Options (XFO)

Definido en el RFC 7034, el XFO define si una página ha de incluir otra página en las etiquetas <frame>, <iframe>, <embed> u <object>.

Básicamente permite informar de dos opciones: deny o sameorigin. En el primer caso no se cargaría nada, en el segundo sólo se permitirían contenidos que vengan del mismo sitio. Si nos e indica la cabecera se puede cargar contenido de cualquier lugar.

X-Frame-Options: sameorigin;

X-Content-Type-Options

Con esta cabecera impedimos que el navegador interprete un tipo de fichero como otro. Por ejemplo, si mandamos un <style>, se deberá leer como text/css, o un script como tal. También ayuda a que los textos se procesen como tal (HTML, TXT, XML, JSON, incluso SVG).

X-Content-Type-Options: nosniff

Content-Security-Policy (CSP)

Seguramente esta es la cabecera más compleja de configurar, tanto por lo que supone como por la cantidad de opciones que incluye.

Con esta cabecera podemos indicar a qué recursos se puede acceder por parte del navegador para un sitio web y que permiten bloquear la carga de elementos externos o de sitios no controlados.

Content-Security-Policy: default-src https: 'unsafe-eval' 'unsafe-inline'; object-src 'none';

La lista de directivas es bastante extensa y permiten decidir sobre la carga de scripts, fuentes, media, estilos e incluso workers.

Antes de comenzar a usarla es muy recomendable configurar el sistema como Content-Security-Policy-Report-Only, ya que te permitirá ver en la Consola del Navegador los errores o malas configuraciones, pero sin que afecte al usuario, sólo a modo informativo.

Una vez se encuentren todas las llamadas externas, este sistema puede ayudar a convertir esa cabecera a la normal.

X-XSS-Protection

En el caso de que aún no uses CSP, esta cabecera todavía puede ser útil. Con esta cabecera, si el navegador detecta un ataque XSS, se realizarán las acciones correspondientes.

X-XSS-Protection: 1; mode=block;

X-Permitted-Cross-Domain-Policies

Esta cabecera es prácticamente sólo para indicar si Adobe Flash Player puede o no acceder a determinados elementos del usuario. Teniendo en cuenta que este software ya no está disponible, esta cabecera se debería indicar sobre todo si tu sitio tiene acceso alto desde navegadores muy antiguos que aún le dan soporte o si aún utilizas Flash para algo.

X-Permitted-Cross-Domain-Policies: none;

Referrer-Policy

Con esta cabecera indicamos qué información enviar de referrer. Un caso muy habitual es el de la adquisición de tráfico de Google Analytics, en la que podemos ver desde qué páginas nos llega tráfico a nuestra web.

Hay varias opciones para esta política y dependerá mucho de la información que quieras dar a otras herramientas y por seguridad.

Referrer-Policy: strict-origin-when-cross-origin, origin-when-cross-origin;
PolíticaMismo sitioHTTPS → HTTPSHTTPS → HTTP
no-referrernada nada nada
no-referrer-when-downgradecompletocompletonada
origindominiodominiodominio
origin-when-cross-origincompletodominiodominio
same-origincompletonadanada
strict-origindominiodominionada
strict-origin-when-cross-origincompletodominionada
unsafe-urlcompletocompletocompleto

Cross-Origin-Resource-Policy (CORP)

Esta cabecera permite indicar el origen de un recurso y es un sistema sencillo para defenderse de determinados ataques.

Además, va acompañada de la contraparte Access-Control-Allow-Origin que decide si un elemento de un sitio está permitido ser llamado desde otro.

Cross-Origin-Resource-Policy: same-origin;

Si tu sitio devuelve esta cabecera no permitirá el acceso a recursos externos.

Access-Control-Allow-Origin

Con esta cabecera podemos indicar qué sitios tienen la posibilidad de descargar nuestros contenidos. Con este sistema podemos bloquear la carga de una imagen de nuestro sitio en un sitio de terceros.

Access-Control-Allow-Origin: https://www.wpsysadmin.com;

Cross-Origin-Opener-Policy (COOP)

Este sistema previene la apertura de elementos externos desde otro dominio que no sea el que indicas. Un caso podría ser la apertura de un PDF desde un popup fuera de tu sitio.

Cross-Origin-Opener-Policy: same-origin;
Cross-Origin-Embedder-Policy: require-corp;

Cross-Origin-Embedder-Policy (COEP)

Esta cabecera está pensada para permitir o bloquear la carga de contenidos externos y que cumpla el CORP. Un ejemplo habitual es la carga de una imagen desde otro dominio que no es el tuyo.

Cross-Origin-Embedder-Policy: require-corp;
Cross-Origin-Opener-Policy: same-origin;

Permissions-Policy

Aunque todavía no lo cubren todos los navegadores, con estas cabeceras podemos indicar al navegador si permitir el acceso o no a determinados elementos de hardware de nuestro dispositivo, por ejemplo, si poder acceder a la cámara o a la información de la batería.

Permissions-Policy: geolocation 'self' https://example.com; camera *; microphone 'none';

X-Download-Options

Aunque esta cabecera se creó específicamente para Internet Explorer 8, puede ser bastante útil en la descarga de un fichero.

Si en tu sitio tienes algún sistema de descargas, es posible que quieras impedir que esa descarga se abra directamente y forzar a que se tenga que guardar en el disco (y así, por ejemplo, que el antivirus haga una revisión completa del mismo).

X-Download-Options: noopen;
Content-Disposition: attachment; filename=inseguro.html;

Sobre este documento

Este documento está regulado por la licencia EUPL v1.2, publicado en WP SysAdmin y creado por Javier Casares. Por favor, si utilizas este contenido en tu sitio web, tu presentación o cualquier material que distribuyas, recuerda hacer una mención a este sitio o a su autor, y teniendo que poner el material que crees bajo licencia EUPL.