Seguridad en Apache (Parte III): Ocultar Información

Apache-LogoEn la presente entrada, se describirán métodos para tratar de minimizar la información expuesta que facilite ataques sobre el servidor web.
Una de las primeras fases de los ataques sobre los sistemas de información es la revelación de información (o information disclosure). Cuanta más información tenga el atacante, más fácil le resultara encontrar vulnerabilidades existentes en el sistema atacado.
A continuación, se detallarán varias medidas para tratar de exponer la mínima información posible.

Deshabilitar el listado de ficheros

Si se le envía a Apache una URL que solicita un directorio y no un archivo concreto, Apache permite mostrar los contenidos de este directorio. Esta funcionalidad puede ser aprovechada por un atacante para descubrir archivos que el administrador del sitio no tenía intención de publicar.

Esta característica de Apache es controlada por la directiva Options, para desactivarla se debe aplicar la siguiente configuración:

Options -Indexes

Como su propio nombre indica, mediante esta directiva se controlan varias opciones de configuración. Puede aceptar varios valores, entre ellos All y None para activar o desactivar todas las opciones disponibles. De hecho, en la configuración del directorio raíz se recomienda desactivar todas por seguridad, lo que incluiría la opción Indexes:

 

Limitar el acceso a archivos por extensión

En algunas ocasiones determinados ficheros deben existir dentro del DocumentRoot del servidor pero no se desea que estén disponibles, como los ficheros .htaccess y .htpasswd, cuya funcionalidad se explicará posteriormente. En estos casos, se pueden utilizar las directivas Files y FilesMatch para denegar su acceso.

En el siguiente ejemplo, se deniega el acceso a todos los ficheros que comienzan por los caracteres “.ht” (entre ellos .htaccess y .htpasswd):

 

Las siguiente configuración evita que se publiquen los archivos de copia de seguridad:

 

Files y FilesMatch sólo actúan sobre el nombre del archivo, para filtrar directorios, se debe utilizar DirectoryMatch. Mediante las directivas presentes a continuación se vetaría el acceso a todos los directorios CVS:

 

Información en la cabecera Server

En las respuestas HTTP se incluye la cabecera Server que contiene información sobre el software que ejecuta el servidor web:

apache_wireshark_header_server_full

Si se desea restringir esta información se puede utilizar la directiva ServerTokens, aunque no se puede restringir la información enviada completamente ya que la configuración más restrictiva es Prod que, como se aprecia a continuación, envía el nombre del servidor web:

apache_wireshark_header_server_prod

Mediante el módulo mod_security es posible modificar el valor de esta cabecera completamente:

SecServerSignature “Microsoft-IIS/5.0”

Aunque mod_security es un módulo de gran utilidad, se desaconseja su instalación únicamente para enmascarar el servidor ya que un hacker dispone de múltiples herramientas de fingerprinting como HTTPrint, que basándose en pequeñas diferencias de implantación del protocolo HTTP, permite obtener la versión del navegador web:

httprint

Información en páginas generadas por el servidor

La directiva ServerSignature establece si se desea mostrar la versión del servidor, el correo del administrador y el nombre del servidor virtual en las páginas generadas por Apache (por ejemplo, errores o listados de directorio FTP). Para no mostrar información se puede establecer a Off.

La dirección de correo electrónico del administrador, que muestra en determinadas páginas de error para que el internauta pueda notificar el error, se establece mediante la directiva ServerAdmin. No es recomendable establecer una personal, sino una genérica con este fin específico.

Por otro lado, Apache muestra una página de error genérica cuando se produce un error que revela información sobre la versión del software ejecutada:

apache_error_404

Mediante la directiva ErrorDocument se puede modificar este texto, incluso invocar un script que lo construya dinámicamente. Aunque esta directiva es poco flexible ya que hay que crear una entrada por cada código de error. Por ejemplo:

ErrorDocument 404 /error/404.html
ErrorDocument 500 “Error en el servidor”