Pon una A+ en tu servidor https
Apache hardening & security guide
última actualización: 10 octubre 2019
Este documento es una quick reference de configuración de un servidor Apache. Lo primero que se pretende es no dar información del servidor que se está usando, versiones, módulos cargados, etc. con el fin de no ser usado por un atacante. Lo segundo que se pretende es tener buenas suites de cifrado para evitar los MiTM o WiTM (Woman In The Middle 😎).
Es un documento en continua evolución y cambio, si detectas errores o quieres contribuir a mejorarlo, se te agradecerá.
Cuando decimos que intentamos tener un A+ no es una calificación energética 😆 es el valor que se establece para indicar si tu servidor está configurado correctamente. Por otro lado, me encanta la tools testssl.sh de @drwetter y no me gusta que aparezca el color rojo y tampoco el amarillo.
Las utilidades usadas para chequear las características del servidor son:
online:
offline:
- testssl.sh ( https://testssl.sh/ )
- nmap (https://nmap.org/)
No pretendo explicar que es cada directiva, eso os lo dejo de deberes, ¡hay que currar un poco!
Primero activamos el módulo de headers y rearrancamos servicio. Ya podemos modificar el fichero security.conf.
# a2enmod headers
# apachectl restart
# vi /etc/apache2/conf-enabled/security.conf
Modificamos/añadimos las siguiente líneas:
Removemos banners. No queremos dar información de la versión de Apache ni del sistema operativo.
# vi /etc/apache2/conf-enabled/security.confServerTokens Prod
ServerSignature Off
TraceEnable Off# vi /etc/apache2/conf-enabled/security.conf###############################################################
# Politica para las cabecera Referrer
#
Header always set Referrer-Policy "no-referrer"
Header always set Referrer-Policy "no-referrer-when-downgrade"
Header always set Referrer-Policy "origin"
Header always set Referrer-Policy "origin-when-cross-origin"
Header always set Referrer-Policy "same-origin"
Header always set Referrer-Policy "strict-origin"
Header always set Referrer-Policy "strict-origin-when-cross-origin"#### Fin politica Referrer###############################################################
# Politica para las cabecera Feature-Policy
# permite a los desarrolladores habilitar ciertas funciones y APIs en el navegador
Header always set Feature-Policy "microphone 'none'; speaker 'none'; geolocation 'none'; notifications 'none'"# Fin politica Feature-Policy###############################################################
# Politica para las cabecera Content-Security-Policy CSP
# Prevenir y mitiar ataques de XSS, clickjacking y code injection
# interesante la habilitar informes:
# report-uri https://site/report.cgi
# Header set Content-Security-Policy: "default-src 'self'; script-src site.domain "
# XSS protection
Header always set X-XSS-Protection "1; mode=block"# clickjacking
Header always append X-Frame-Options: "DENY"# los tipos mimes que se indican en la cabecera Content-Type no se deben de cambiar
Header always set X-Content-Type-Options "nosniff"# Fin politica Content-Security-Policy
###############################################################
# HSTS
#
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"###############################################################
# galleeetassss
#
Header set Set-Cookie "HttpOnly; Secure"###############################################################
# Certificate Transparency CT ( experimental )
# A new header still in experimental status is to instruct the
# browser to validate the connection with web servers for
# certificate transparency (CT)
# queda ver report report-uri="https://somedomain.com/report"
#
Header set Expect-CT: "max-age=86400; enforce"###############################################################
# HTTP Public Key Pinning HPKP
# minimizar MiTM
# openssl rsa -in my-rsa-key-file.key -outform der -pubout | openssl dgst -sha256 -binary | openssl enc -base64
#
Header always set Public-Key-Pins "pin-sha256=\"base64\"; max-age=2592000"
Ojo con las comillas dobles, si da error al lanzar el servidor mirar si son las correctas.
Suite de cifrado recomendadas y valores más específicos para el protocolo:
# vi /etc/apache2/sites-enabled/default-ssl
# vi /etc/apache2/sites-enabled/default-ssl
SSLEngine on
SSLProtocol ALL -TLSv1.1 -TLSv1 -SSLv2 -SSLv3
SSLCipherSuite "EECDH+CHACHA20:EECDH+AESGCM:EECDH+AES+SHA384:EECDH+AES+SHA256:EECDH+AES:EDH+AES256:!EDH+AESGCM:!EDH+SHA256:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4:!ECDHE-RSA-AES256-GCM-SHA384"
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
# vi /etc/apache2/mods-enabled/ssl.conf
# vi /etc/apache2/mods-enabled/ssl.confSSLStrictSNIVHostCheck Off
SSLHonorCipherOrder on
SSLStrictSNIVHostCheck Off
SSLCompression off
SSLUseStapling on
SSLStaplingResponderTimeout 5
SSLStaplingReturnResponderErrors off
SSLStaplingCache shmcb:/var/run/ocsp(128000)
SSLSessionTickets off
Nota importante: desactivar los protocolos no seguros.
Verificado OCSP:
# openssl s_client -connect host:443 -tls1_2 -tlsextdebug -status
Como respuesta deberíamos obtener:
OCSP response:
======================================
OCSP Response Data:
OCSP Response Status: successful (0x0)
Response Type: Basic OCSP Response
Version: 1 (0x0)
Para ver los algoritmos de cifrado usados por nuestro servidor podemos ejecutar un nmap:
nmap -sV --script ssl-enum-ciphers -p 443 host
Para ver todas las suit disponibles
openssl ciphers -v
Corrigiendo vulnerabilidades que puedan ser detectadas por testssl.sh
POODLE, SSL (CVE-2014–3566): si tenemos a alguien en nuestra red haciendo un MiTM o WiTM :wink: éste puede forzar tanto al cliente como al servidor a usar SSLv3 y “hablar” un cifrado vulnerable, con el fin de obtener las cookies o los datos estáticos.
Solución: Deshabilitar SSLv3, cosa que hemos conseguido en la configuración del servidor https.
SSLProtocol ALL -TLSv1.1 -TLSv1 -SSLv2 -SSLv3
SWEET32 (CVE-2016–2183, CVE-2016–6329) : vulnerabilidad en el cifrado 3DES-CBC, soportado por muchos servidores.
Solución: En el fichero de configuración de apache, eliminar todas las suit de cifrado DES: ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA.
Esto lo tenemos solucionado cuando hemos puesto como suit de cifrado:
SSLCipherSuite AES256+EECDH:AES256+EDH:AES128+EECDH:AES128+EDH
LUCKY13 (CVE-2013–0169), experimental: Esta es una vulnerabilidad para los que están en modo paranoia. Es un ataque dirigido a los protocolos TLS 1.1 y 1.2 y el protocolo DTLS 1.0 y 1.2 y cifrado Cipher Block Chaining (CBC).
BEAST (CVE-2011–3389): Vulnerabilidad del lado del cliente por parte de navegadores que soportan TLSv1, es decir ¿¡todos!?
Solución: como tenemos puesto en nuestra configuración, sólo hablamos con gente que hable TLSv1.2 o superior.
Algunos comandos
Comprobar puerto 25
openssl s_client -starttls smtp -crlf -connect host:25
Comprobar Logjam TLS attack
openssl s_client -connect host:443 -cipher ‘EXP’
o
nmap --script ssl-enum-ciphers -p 443 host
by @nuria_imeq