Cómo aumentar la seguridad de tu sitio Web con NPM añadiendo todos los Security Headers
Partiendo de la base de que la seguridad absoluta no existe, lo que si podemos hacer es intentar blindar nuestro sitio web para evitar que sufra un ataque o sea vulnerable a un fallo de seguridad existente.
Cuando accedemos a cualquier sitio web, no solamente se proporciona el contenido visible del mismo, sino que también se transmiten una serie de cabeceras que son interpretadas por el Navegador de Internet. Estas cabeceras son utilizadas por el servidor y por el navegador para el envío de información.
Por defecto, muchas de estas cabeceras de seguridad no son enviadas, lo que se traduce en un posible agujero por el cual algunos avispados pueden aprovechar para atacar dicho sitio web. Con el tutorial sencillo de hoy, vamos a ver como incrementar la seguridad en estas cabeceras al máximo posible.
Para ello, existe una Web con el nombre de Security Headers la cual ingresando nuestro sitio web, nos devuelve una puntuación que va desde el A+ (lo más alto), hasta la F (la más baja). Siguiendo el tutorial de hoy, obtendréis la mayor seguridad posible y por lo tanto la mejor puntuación.
Al final del artículo os explicaré como obtener la clasificación A+ si tienes tu web mediante la protección de Cloudflare.
Añadiendo los Security Headers a NPM
En el ejemplo de hoy, voy a utilizar NPM (Nginx Proxy Manager), que es el gestor de Proxy Inverso más utilizado por la mayoría de nosotros.
Lo primero que tendremos que hacer es crear un nuevo archivo con el nombre de _hsts.conf
y en el cual copiaremos las siguientes lineas:
{% if certificate and certificate_id > 0 -%}
{% if ssl_forced == 1 or ssl_forced == true %}
{% if hsts_enabled == 1 or hsts_enabled == true %}
# HSTS (ngx_http_headers_module is required) (63072000 seconds = 2 years)
add_header Strict-Transport-Security "max-age=63072000;{% if hsts_subdomains == 1 or hsts_subdomains == true -%} includeSubDomains;{% endif %} preload" always;
add_header Referrer-Policy strict-origin-when-cross-origin;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
add_header X-Frame-Options SAMEORIGIN;
add_header Content-Security-Policy upgrade-insecure-requests;
add_header Permissions-Policy interest-cohort=();
add_header Expect-CT 'enforce; max-age=604800';
more_set_headers 'Server: Proxy';
more_clear_headers 'X-Powered-By';
{% endif %}
{% endif %}
{% endif %}
Una vez guardado, lo subimos a la carpeta raíz de nuestra instalación de NPM y añadiremos la siguiente variable al Docker.
- Imagen de jc21/nginx-proxy-manager:
volumes:
- /PROXY-PATH/_hsts.conf:/app/templates/_hsts.conf:ro
- Imagen de jlesage/nginx-proxy-manager:
volumes:
- /PROXY-PATH/_hsts.conf:/opt/nginx-proxy-manager/templates/_hsts.conf:ro
En el caso de unRAID, tendremos que añadir una nueva variable del tipo "ruta" a la plantilla del contenedor con permisos de sólo lectura tal y como muestro en la imagen inferior.
Comprobar que se inyectan correctamente
Una vez arrancado nuevamente el contenedor de NPM, si comprobamos nuestros dominios, ya deberíamos de obtener el grado A+ de seguridad, pero si todavía no nos lo muestra, tendremos que editar todos los dominios y hacer clic en la pestaña de SSL volviendo a marcar las cuatro opciones como muestro en la imagen inferior.
Una vez seguidos estos sencillos pasos, podemos volver a consultar nuestro sitio web en SecurityHeaders y veremos como nuestra seguridad se ve incrementada al máximo y con ello, conseguir la máxima categoría: A+.
Conseguir el grado A+ con Cloudflare
Una vez seguido los pasos descritos anteriormente con NPM, si tienes tu sitio web bajo la protección de Cloudflare (Proxied), no obtendrás la clasificación A+ salvo que hagas unas modificaciones rápidas que detallo a continuación:
- Nos vamos a SSL/TLS y activamos el protocolo Full (Strict).
- Nos vamos a SSL/TLS ➙ Edge Certificates y activamos las opciones Always use HTTPS y Automatic HTTPS Rewrites.
- Dentro de este apartado habilitamos también HTTP Strict Transport Security (HSTS) activando todos los checks, además de especificar en Max Age Header (max-age) el valor de 6 meses.