Seguridad en Apache (Parte II): Control de los archivos publicados

Apache-LogoEn esta nueva entrega se explicarán las directivas principales para definir los ficheros que servirá Apache sin que se facilite el acceso a ningún otro archivo del servidor.

El directorio especificado mediante la directiva DocumentRoot es el directorio desde el que se servirán los archivos de Apache. Aún así, existen errores de configuración que pueden posibilitar el acceso a otros directorios.

Denegar el acceso por defecto

Es conveniente denegar el acceso a todos los directorios por defecto y permitir el acceso sólo al directorio especificado en el DocumentRoot explícitamente:

 

Las directivas Allow y Deny son utilizadas para permitir o denegar respectivamente el acceso a un directorio y Order especifica el orden en el que serán evaluadas.

La directiva <Directory> sirve para aplicar un serie de directivas al directorio especificado y a todos sus subdirectorios. Lo más común es que existan varias de estas directivas y que, como también se aplican a los subdirectorios, existan directivas contradictorias aplicadas a un directorio. En este caso, la directiva del <Directory> más específico es la que prevalece. En el ejemplo anterior, existen directivas de acceso contradictorias en el directorio /var/www/htdocs, pero se imponen las que permiten el acceso por estar contenidas en un <Directory> más específico.

El cometido de las directivas Options y AllowOverride se explicarán en entregas posteriores.

Revisar las directivas Alias

Para servir un archivo Apache concatena el directorio especificado en DocumentRoot con la parte de la ruta de la URL:

apache_file_path

Pero mediante la directiva Alias se puede modificar esta resolución. Si la URL coincide con el primer parámetro de la URL, Apache servirá desde el directorio especificado en el segundo parámetro:

apache_alias

Para evitar filtrar información se debe analizar la necesidad de esta directiva y de las similares AliasMatch, ScriptAlias y ScriptAliasMatch.

Vetar la resolución de enlaces simbólicos

En sistemas Unix/Linux, Apache puede recibir una petición a un archivo que es, a nivel de sistema operativo del servidor, un enlace simbólico y devolver el archivo apuntado por él aunque se encuentre fuera del DocumentRoot.

Esta funcionalidad además posibilita que un atacante, que tenga permisos de escritura sobre el DocumentRoot, cree un enlace simbólico a archivos contenidos fuera del DocumentRoot para luego acceder a ellos a través del navegador.

Para deshabilitar esta posibilidad se debe aplicar la siguiente directiva:

Options -FollowSymLinks

Como alternativa, se puede habilitar esta funcionalidad pero sólo si el archivo destino pertenece al mismo usuario que el enlace simbólico:

Options -FollowSymLinks +SymLinksIfOwnerMatch

Parte I: Seguridad en Apache: Configuración e instalación (Parte I)

Seguridad en Apache: Configuración e instalación (Parte I)

Apache-LogoEn este primer post se explicará cómo modificar la configuración de Apache y las medidas de seguridad que se deben aplicar al instalar el software.

Los servidores web son elementos especialmente sensibles ya que por definición la mayoría son accesibles a través de Internet y debido a que cada vez más aplicaciones se ejecutan a través del navegador. Ataques de denegación de servicio, defacements o inyección de código malicioso son algunas de las consecuencias de no tener una instalación segura del servidor web.

La presente serie de posts tiene el objetivo de informar de cómo implantar el servidor web Apache de forma segura. Aunque hay que tener en cuenta otros factores en la seguridad del servidor web, como por ejemplo el “hardering” del servidor, estos temas no se tratarán en esta guía debido a su extensión.

Directivas y archivos de configuración

Es importante resaltar que según la distribución de Linux/Unix utilizada, el número, las rutas y los nombres de los archivos de configuración de Apache pueden variar. Con el siguiente comando, se pueden averiguar datos sobre una instalación concreta incluyendo cúal es el archivo de configuración:

Screenshot from 2013-10-18 16:30:38

Este archivo de configuración puede incluir a su vez otros más utilizando la directiva Include (en Apache se llama directivas a las distintas opciones de configuración).

Por ejemplo en sistemas Debian/Ubuntu utiliza la siguiente estructura de archivos de configuración diseñada para facilitar la administración:

  • /etc/apache2/apache2.conf: el archivo raíz es que incluye a los demás. No se debe modificar este archivo.
  • mods-enabled/*.load y mods-enabled/*.conf: la finalidad de estos archivos es la carga y configuración de los módulos de Apache.
  • httpd.conf: directivas aplicables a todos los servidores web.
  • ports.conf: define en qué puertos “escuchará” Apache.
  • conf.d/: directorio que contiene archivos de configuración para cada funcionalidad de apache (charset, php, security, etc.)
  • sites-enabled/: directorio que contiene los archivos de configuración de cada virtual host.

Seguridad en la instalación

Afortunadamente, las instalaciones de Apache en sistemas Linux/Unix a través de los mecanismos de gestión de paquetes incluyen muchas de las opciones que se citan a continuación activadas o implantadas por defecto.

Deshabilitar los módulos que no se utilicen. De este modo no sólo se evitarán ataques sobre estos módulos sino que también Apache en ejecución consumirá menos recursos.

Permisos sobre ficheros:

Crear un usuario y grupo exclusivo para la ejecución de Apache. Este usuario y grupo se configura con las directivas User y Group. En cuanto a los permisos de ficheros, el owner del binario de Apache ha de ser root para poder abrir el puerto 80, aunque después cambia el usuario del proceso al propio de Apache. El resto de usuarios no ha de tener permisos de escritura sobre este fichero ya que entonces podría sustituirlo por otro malicioso que se ejecutaría con los máximos privilegios. Por ello estos son los permisos que deben tener los binarios de Apache:

 

Por otro lado, en muchas instalaciones por defecto otros usuarios tienen permisos de lectura sobre los archivos de configuración y de logs de Apache. Es conveniente eliminar estos permisos con los siguientes comandos: