Ú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.
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.
UUna vez dentro del servidor, comprobé con el phpinfo, que no tenía el módulo mod_headers habilitado.
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.
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.
Utilizando clouding.io y con estos pasos podemos añadir una capa más de seguridad a nuestro servidor web.