Este es el primer post de una serie elaborada por José Luis Chica y Guillermo Mir. En ésta se quieren recoger los pasos que se pueden realizar (en muchos casos creemos debería ser imperativo realizar) para instalar y securizar un servidor Apache. Existen múltiples entradas y páginas que explican, de manera separada, como realizar diversas tareas, pero nosotros nos hemos propuesto exponerlas todas en esta serie, de manera que puedan servir de guía a todos aquellas personas que se han de instalar o gestionar un servidor de estas características. El sistema operativo que vamos a usar en los ejemplos es un Linux con distribución Debian Squeeze (6), pero esto sólo va a influir en las rutas dónde se encuentran los distintos ficheros de configuración.
Primer paso: Ocultando información
Una instalación por defecto de Apache muestra cierta información relacionada con el entorno donde ha sido desplegado. Dependiendo del sistema operativo, esta información puede variar pero en general, un posible atacante puede recopilar datos muy útiles que le puedan aportar vectores de ataque adicionales. Así pues, solo tendría que comprobar si existen vulnerabilidades conocidas en las versiones de las tecnologías utilizadas.
Pongamos como ejemplo la respuesta de una instalación por defecto de un WordPress sobre un Apache:
HTTP/1.0 302 Found Date: Thu, 19 Jan 2012 11:27:54 GMT Server: Apache/2.2.16 (Debian) X-Powered-By: PHP/5.3.37 X-Pingback: http://example.com/wordpress/xmlrpc.php Content-Length: 0 Content-Type: text/html
Se puede ver como en tan poco espacio encontramos tanta información. No obstante, es posible minimizar el revelado de información. Comencemos por eliminar la información relacionada con la versión de apache. Ésta se modifica cambiando las siguientes directivas en el fichero /etc/apache2/conf.d/security:
ServerTokens ProductOnly ServerSignature Off
Esto disminuye la cantidad de información ofrecida en las cabeceras de respuesta HTTP. Antes se mostraba la siguiente cadena:
Server: Apache/2.2.16 (Debian)
Aplicando las directivas anteriores:
Server: Apache
Igualmente, se elimina la información relativa a Apache en las páginas de errores 400.
Es posible modificar la cadena del banner Server: Apache para que se personalice con un texto propio y poder así confundir al atacante. Una forma es modificando una cadena concreta del código fuente y recompilándolo, pero en un entorno de producción, cuyas actualizaciones son habituales (o deberían serlo :P), no parece muy práctico. La alternativa es utilizar mod_security. Para ello solo tenemos que añadir las siguiente directivas al fichero de configuración:
ServerTokens Full SecServerSignature “Nintendo Game Boy Color 1.0”
Se entrará en más detalle sobre la configuración de mod_security para securizar apache en un post posterior.
La información sobre la versión de PHP puede ser útil para un posible intruso, por lo que vamos a ocultarla también. Para ello, es necesario editar el fichero /etc/php5/apache2/php.ini y cambiar la siguiente directiva:
expose_php = off
De esta forma, la línea donde se muestra la versión de PHP como la que se ha puesto de ejemplo anteriormente, desaparece.
Otra manera de ocultar información, y confundir a las herramientas automatizadas, es personalizando los errores de página. De esta manera en estos casos el código devuelto en la respuesta HTTP será un 200 en lugar de un 404 o un 500. El lugar para configuraro es el fichero del virtualhost donde se quiera hacer, dentro de /etc/apache2/sites-available:
<Directory> ... ErrorDocument 404 /myError404.html ErrorDocument 500 /myError500.html ... </Directory>
Donde myError*.html son las páginas personalizadas que hemos creado para que se muestren cuando exista un error, en vez de la página genérica de Apache.
También es recomendable recordar, aunque parezca básico, configurar cada site denegando el listado de directorio. Es sorprendente la cantidad de webs que se pueden encontrar que permiten navegar por su estructura de directorios. Se configura igualmente dentro del fichero de configuración del virtualhost:
<Directory> ... Option -Indexes ... </Directory>
Continuaremos con el bastionado de Apache en una próxima entrada. Esperamos que la primera entrada les haya resultado interesante.



