FuncionalidadEsta guía consta de una plantilla para realizar una correcta configuración de las cabeceras de seguridad en los servidores Apache, Tomcat y Nginx. Además de una explicación más concreta de cada cabecera por si fuera necesario personalizar la plantilla de configuración. | RequisitosComunicaciones entre cliente-servidor (básico) Necesario que el producto sea una aplicación aplicación web o API REST |
Descripción
Este acelerador tiene como objetivo reducir el tiempo invertido en la configuración y dotar de una mayor seguridad al servidor. Permitiendo a los desarrolladores un control adicional sobre la configuración de la seguridad en el navegador del cliente, siempre que el producto sea una aplicación web o una API REST.
Beneficios
Proteger la información sensible: evitar que la información viaje en claro (si no esta configurado que se fuerce a HTTPS) y pueda ser interceptada por un atacante, el cual podría visualizar o modificar dicha información, afectando a la confidencialidad, integridad y disponibilidad de los datos.
Prevenir y mitigar los ataques más comunes como inyección de contenido/código, ataques de cross-site scripting (XSS) o cross-site request forgery (CSRF), ataques que requieren incrustar un recurso malicioso (CORS), ataques que involucran el uso malicioso de iframes, cómo ataques de clickjacking.
Compatibilidad con la mayoría de navegadores modernos a excepción de Internet Explorer, el cuál utiliza la política de same-origin (mecanismo de seguridad crítico que restringe cómo un documento o script cargado por un "origen" puede interactuar con un recurso de un origen distinto).
Evidencias
Una vez completadas las configuraciones de cabeceras que se exponen más abajo, es importante reiniciar los servidores y comprobar que las cabeceras se han añadido correctamente. En la captura de la izquierda vemos una configuración por defecto y a la derecha una configuración completa además de ocultar la versión del servidor.
Configuración sin cabeceras de seguridad | Configuración con cabeceras de seguridad |
Riesgos de seguridad
Problema | Vulnerabilidad | Mitigación | Referencias |
---|---|---|---|
Seguridad insuficiente |
| Correcta configuración de los servidores | https://developer.mozilla.org/es/docs/Web/HTTP/Headers https://developer.mozilla.org/es/docs/Web/HTTP/CSP https://tomcat.apache.org/tomcat-9.0-doc/config/filter.html#CORS_Filter |
Recomendación
A continuación se presenta una serie de plantillas para los distintos servidores. Se recomienda revisar y adaptar algunos valores lo máximo posible a cada producto. En la página asociada a este acelerador se puede encontrar una explicación más detallada de cada cabecera de seguridad.
Plantilla de cabeceras de seguridad en Apache
Para introducir las cabeceras de seguridad en el servidor previamente hay que cargar el módulo correspondiente:
Cargar el módulo
# a2enmod headers |
Posteriormente añadir la siguiente configuración al fichero:
/etc/apache2/conf-enabled/security.conf
<IfModule mod_headers.c> Header unset X-Powered-By Header always unset X-Powered-By Header always append X-Frame-Options: SAMEORIGIN Header add Strict-Transport-Security: "max-age=631138519; includeSubDomains; preload" Header set X-XSS-Protection: "1; mode=block" Header set X-Content-Type-Options: "nosniff" Header always set X-Content-Security-Policy "default-src 'self'; img-src 'self$ Header set Content-Security-Policy "default-src 'self'" Header set Referrer-Policy "same-origin" Header set Feature-Policy "vibrate 'self' cabeceras2.honeysec.info" Header set Content-Security-Policy "upgrade-insecure-requests" </IfModule> |
Para ocultar el nombre y versión del servidor debemos añadir al fichero /etc/apache2/apache2.conf la siguiente configuración:
Ocultar nombre y versión de Apache
ServerSignature Off ServerTokens Prod |
Plantilla de cabeceras de seguridad en TOMCAT
Se debe añadir la siguiente configuración al fichero:
etc/tomcat/conf/web.xml
<filter> <filter-name>httpHeaderSecurity</filter-name> <filter-class>org.apache.catalina.filters.HttpHeaderSecurityFilter</filter-class> <async-supported>true</async-supported> <init-param> <param-name>antiClickJackingOption</param-name> <param-value>DENY</param-value> </init-param> <init-param> <param-name>hstsEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>hstsIncludeSubDomains</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>antiClickJackingEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>antiClickJackingOption</param-name> <param-value>DENY</param-value> </init-param> <init-param> <param-name>blockContentTypeSniffingEnabled</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>xssProtectionEnabled</param-name> <param-value>true</param-value> </init-param> </filter> <filter-mapping> <filter-name>httpHeaderSecurity</filter-name> <url-pattern>/*</url-pattern> <dispatcher>REQUEST</dispatcher> </filter-mapping> <filter> <filter-name>CorsFilter</filter-name> <filter-class>org.apache.catalina.filters.CorsFilter</filter-class> <init-param> <param-name>cors.allowed.origins</param-name> <!-- Añadir las fuentes de origenes permitidos --> <param-value>https://www.apache.org</param-value> </init-param> <init-param> <param-name>cors.allowed.methods</param-name> <!-- Solo declarar los métodos utilizados--> <param-value>GET,POST,HEAD,OPTIONS,PUT</param-value> </init-param> <init-param> <param-name>cors.allowed.headers</param-name> <param-value>Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers</param-value> </init-param> <init-param> <param-name>cors.exposed.headers</param-name> <param-value>Access-Control-Allow-Origin,Access-Control-Allow-Credentials</param-value> </init-param> <init-param> <param-name>cors.support.credentials</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>cors.preflight.maxage</param-name> <param-value>10</param-value> </init-param> </filter> <filter-mapping> <filter-name>CorsFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> |
Para ocultar el nombre y versión del servidor debemos modificar el fichero /etc/tomcat9/server.xml y complementar la etiqueta existente "connector" de la siguiente manera:
Ocultar nombre y versión de Tomcat
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" server=" " redirectPort="8443" /> |
Plantilla de cabeceras de seguridad en Nginx
Instalar paquete extra de Nginx para que permita la lectura de "more_clear_headers Server;" , la cuál añadiremos junto al resto de cabeceras permitiendo ocultar el nombre y versión del servidor :
Paquete de extras Nginx
# sudo apt-get install nginx-extras |
Se debe añadir la siguiente configuración al fichero:
/etc/nginx/sites-enabled/default
add_header Strict-Transport-Security 'max-age=31536000; includeSubDomains; preload'; add_header Content-Security-Policy "default-src 'self';"; add_header X-Frame-Options “DENY”; add_header X-XSS-Protection "1; mode = block" always; add_header X-Content-Type-Options nosniff always; add_header Referrer-Policy same-origin; add_header Cache-Control "private, no-cache, no-store, max-age=0"; more_clear_headers Server; |