Hardening Apache

Casi dos meses sin publicar nada pero fijo que de menos no me echabais jeje y es que han sido unos tiempos muy ocupados y apenas he tenido tiempo que dedicarle al blog.

Antes de seguir dando el coñazo con la serie de Bash hoy os traigo un artículo que ha surgido a raíz de algo que me ha pasado en el trabajo y es el tema del hardening de Apache.

Hay muchos posts donde se habla de como habilitar mod_security, instalar fail2ban, etc, etc para proteger nuestro servidor pero en muchos casos se obvian ciertas configuraciones sencillas pero que aportan un gran valor a nivel de seguridad.

No he utilizado demasiado nginx pero por lo que he visto estas configuraciones deberían ser prácticamente idénticas pero, antes de tocar nada, os recomiendo que lo comprobéis en la correspondiente documentación.

Como supongo que todos utilizaréis https y redireccionaréis a todo el mundo que intente entrar por http (a fin de cuentas no queremos que a la gente que usa nuestro servidor puedan espiarlos) me voy a saltar esa parte e ir directamente al grano, como son varias opciones iré una a una explicando un poco lo que hacen, y como ya sabéis como soy no me voy a detener a explicar, por ejemplo, que es HSTS ya que está más que documentado.

Todas estas lineas de configuración debemos añadirlas al final de nuestro apache.conf al menos para aquellos que como yo utilicen la versión de Debian. Algunas opciones ya vienen así marcadas por defectos pero vamos a ponerlas de todas maneras para asegurarnos que si deciden cambiarlas no nos afecte.

Comencemos con algo tan básico como el fingerprinting del servidor web, por defecto Apache nos devolverá su nombre, versión y probablemente mucha más información que no le interesa a nadie, cambiemos este comportamiento:

ServerTokens Prod
ServerSignature Off

De esta manera en las cabeceras Apache simplemente dirá que es eso, Apache, sin dar ningún dato más.

Otra cosa que da demasiada información son los ETags, digamosle a Apache que si el documento proviene de un archivo no genere este campo:

FileETag None

Bien, con esto ya nos hemos asegurado de que nuestro servidor de cuanta menos información posible o al menos la hemos reducido considerablemente.

Otra cosa que no se suele hacer es deshabilitar el método TRACE, este método se puede utilizar en distintos vectores de ataque (si, otra vez google jeje) así que lo vamos a deshabilitar:

TraceEnable off

Otra cosa con la que tenemos que tener cuidado son los cifrados y protocolos de cifrado que nuestro servidor soporta, no todos son seguros ni mucho menos, así que vamos a decirle a nuestro servidor que solo acepte aquellos en los que confiamos:

SSLCipherSuite HIGH:!MEDIUM:!aNULL:!MD5:!RC4
SSLProtocol -ALL +TLSv1 +TLSv1.1 +TLSv1.2

Si os fijáis en la segunda linea lo que hace es rechazar todos los protocolos y luego solamente habilitar TLS y en la primera limitamos que cifrados puede utilizar el cliente para negociar la conexión.

Ahora vamos a añadir unos cuantos headers para eliminar una cantidad considerable de vectores de ataque que, aunque no os lo creáis, son tan sencillos de realizar pero que por defecto no son mitigados:

Header always append X-Frame-Options SAMEORIGIN
Header edit Set-Cookie ^(.*)$ $1;HttpOnly;Secure
Header always append X-XSS-Protection "1; mode=block"
Header always append X-Content-Type-Options nosniff
Header always set Strict-Transport-Security "max-age=63072000; includeSubdomains;"

Creo que estos headers son bastante auto explicativos así que no me detendré en ellos pero a grandes rasgos: evitamos que nuestra web pueda ser insertada en un iframe en otro servidor, ponemos todas las cookies como seguras y httponly; evitamos la ejecución de XSS si el navegador lo detecta (no todos lo soportan), evitamos que el navegador haga MIME-sniffing y, por último pero no menos importante, habilitamos HSTS.

Ahora guardamos y reiniciamos nuestro Apache para aplicar los cambios et voila, ya tenemos un servidor que da el mínimo de información a un atacante y a la vez protege el tráfico de los clientes.

Recordad que esto no es la panacea ni mucho menos, deberéis habilitar otros modulos como mod_security, configurar fail2ban, etc, etc Este artículo no pretende sustituir a los cientos de tutoriales que ya existen en internet sino servir como complemento a los mismos.

Espero os haya gustado esta breve entrada y a ver si consigo sacar más tiempo para seguir cacharreando y compartiendo más cosas divertidas, pero recordad, no todo es atacar ¡También hay que saber defenderse!

Como siempre, muchas gracias por vuestra visita, y cualquier duda o comentario, dejarmelo por aquí y os responderé en cuanto pueda.

Saludos!

Esta entrada fue publicada en hardening, tutorial, web. Guarda el enlace permanente.

2 respuestas a Hardening Apache

  1. Carlos dijo:

    Sencillo pero claro y necesario. Te felicito por tener tiempo para los mortales. jajaja
    Postdata: revisa el color de las letras que salen al lado de publicar comentarios son muy difíciles de ver.

Deja un comentario