¿Cómo corregir las vulnerabilidades de las cabeceras de seguridad (http headers) del servidor web apache?

Últimamente está surgiendo bastantes casos de ataques aprovechando de las vulnerabilidades de las cabeceras se seguridad del servidor web apache.

Las cabeceras de seguridad del apache (módulo mod_headers), no vienen configuradas por defecto y para ello voy a explicar cómo configurarlas para mejorar la seguridad de nuestro sitio web.

Lo primero que haremos es comprobar la seguridad de nuestra web, para el ejemplo utilice la web https://securityheaders.com/ y pude comprobar que tenía la peor calificación F.

Calificación F (web insegura)

El mensaje era bastante claro tengo que corregir las vulnerabilidades Strict-Transport-Securiry, Content-Security-Policy, X-Frame-Options, X-Content-Type-Options, Referrer-Policy y Feature-Policy.

Para corregirlo accedí a mi proveedor de hosting, en mi caso utilizo clouding.io, ya que tienen buen servicio, calidad y precio, además de que a golpe de un solo clic permiten instalar un servidor LAMP, con el que tengo todo lo necesario para utilizar en mi web y poder administrar el servidor a demanda.

hosting clouding.io

UUna vez dentro del servidor, comprobé con el phpinfo, que no tenía el módulo mod_headers habilitado.

phpinfo

Al tratarse el servidor LAMP de un ubuntu server 18.04, habilite el modulo con el comando:

a2enmod headers

Y reinicie el servidor apache.

systemctl restart apache2

Con estos dos simple comandos ya tenía habilitado el modulo, como pude comprobar en el phpinfo.

phpinfo, modulo ‘mod_headers’ habilitado

Una vez habilitado el módulo mod_heades paso a explicar las vulnerabilidades y las correcciones que vamos a aplicar.

Strict-Transport-Security

Esta cabecera se utiliza para forzar que la web sea cargada mediante HTTPS, ya que la navegación HTTP no es segura al no viajar el contenido cifrado.

Solución: (Forzamos https durante los próximos 63072000 segundos (2 años) la web y sus subdominios):

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

Content-Security-Policy

Esta cabecera se utiliza para indicar al navegador qué contenidos dinámicos de terceros se permiten cargar. Evitando a ataques de tipo Cross-Site Scripting

Solución: (incluir únicamente las url que deseemos que sirvan contenido).

Header set Content-Security-Policy \
"default-src 'self' *.programacionconphp.com;\
 font-src 'self' 'unsafe-inline' data: *.programacionconphp.com;\
 style-src 'self' 'unsafe-inline' data: *.programacionconphp.com;\
 media-src 'self' *.programacionconphp.com;\
 frame-src 'self' *.programacionconphp.com;"

X-Frame-Options

La cabecera X-Frame-Options sirve para prevenir que nuestra web se cargada en un frame, o iframe, protegiéndonos de ataques de tipo Clickjacking.

Solución:(Lo configuramos para solo poder usar frames desde nuestro propio dominio).

Header always set X-Frame-Options "SAMEORIGIN"

X-Content-Type-Options

El encabezado HTTP de respuesta X-Content-Type-Options es un marcador utilizado por el servidor para indicar que los tipos MIME anunciados en los encabezados Content-Type no se deben cambiar ni seguir.

Solución: (Desactivar el MIME type sniffing).

Header set X-Content-Type-Options nosniff

Referrer-Policy

La cabecera Referrer-Policy determina que información se envía en la cabecera Referer cuál es utilizada por el navegador para indicarle al servidor desde que enlace se ha llegado a la página web.

Solución: (Deshabilitamos el envio de datos referentes junto con las solicitudes):

Header set Referrer-Policy: no-referrer

Feature-Policy

El encabezado HTTP Feature-Policy proporciona un mecanismo para permitir y denegar el uso de las funciones del navegador en el propio frame y en el contenido dentro de cualquier elemento <iframe> en el documento.

Solución: (Al no utilizar iframe, denegamos todas las funciones).

Header set Feature-Policy "accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; payment 'none'; usb 'none'"

Resultado final:

Una vez explicadas las soluciones, el siguiente paso es añadirlas en el fichero de configuración del certificado. En mi caso el fichero /etc/apache2/sites-enabled/default-ssl.conf

Header always set X-Frame-Options "SAMEORIGIN"

Header set X-Content-Type-Options nosniff

Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"

Header set Content-Security-Policy \
"default-src 'self' *.programacionconphp.com;\
 font-src 'self' 'unsafe-inline' data: *.programacionconphp.com;\
 style-src 'self' 'unsafe-inline' data: *.programacionconphp.com;\
 media-src 'self' *.programacionconphp.com;\
 frame-src 'self' *.programacionconphp.com;"

Header set Referrer-Policy: no-referrer

Header set Feature-Policy "accelerometer 'none'; camera 'none'; geolocation 'none'; gyroscope 'none'; magnetometer 'none'; microphone 'none'; payment 'none'; usb 'none'"

Reiniciamos el apache (systemctl restart apache2) y volvemos a pasar el test y veremos cómo hemos corregido todas las vulnerabilidades y hemos obtenido la calificación A.

Calificación A. Web segura

Utilizando clouding.io y con estos pasos podemos añadir una capa más de seguridad a nuestro servidor web.

Deja un comentario