20 formas de asegurar tu instalación de Apache

Para aquellos que recién comenzamos a experimentar con servidores web Apache puede ser un embrollo. Existen tutoriales por todos lados para hacer las cosas más diversas que nos podamos imaginar. Sin embargo, pocos encontré sobre seguridad que valieran la pena. He aquí 20 consejos simples directos y útiles para mantener nuestra instalación de Apache más o menos segura.

Notas de traducción

  • Este artículo fue traducido con autorización por escrito (en un e-mail) de su autor: Pete Freitag
  • Los links dentro del artículo no se modificaron por lo que es casi seguro que estén en inglés. Es probable, sin embargo, que existan versiones en español (especialmente de las páginas de documentación de Apache)
  • Artículo original: 20 ways to Secure your Apache Configuration


La traducción

He aquí 20 cosas que puende hacer para hacer más segura su configuración de Apache.

Disclaimer: El problema de la seguridad es que no hay absolutos ni garantías. Estas sugerencias harán su servidor más cerrado, pero no creo que esté necesariamente seguro luego de seguir estas sugerencias. Por otro lado, algunas de éstas sugerencias podrían llegar a influenciar la performance o causar inconvenientes debido al entorno. Es su responsabilidad verificar si alguno de estos cambios sugeridos no es compatible con sus necesidades. En otras palabras: proceder bajo su propio riesgo.

Primero: asegurarse de tener los últimos parches de seguridad

No tiene sentido bloquear las ventanas si la puerta principal está abierta de par en par. Por lo tanto, si no se ha parchado el sistema no tiene mucho sentido continuar más allá de este punto. Agrégalo a tus favoritos para volver más tarde, con el servidor ya parchado.

Esconder el número de versión de Apache y otra información importante

Muchas instalaciones de Apache por defecto le anuncian al resto del mundo la versión de Apache que se está corriendo, el sistema operativo y/o su versión e inclusive qué módulos de Apache están instalados en el servidor. Los atacantes pueden utilizar esta información para su propia ventaja al intentar atacar. También hace saber que has dejado la mayoría de los parámetros como venían por defecto.

Hay dos directivas que necesitarás agregar a tu archivo httpd.conf:

ServerSignature Off
ServerTokens Prod

ServerSignature” (la firma del servidor) aparece al final de páginas generadas por Apache como errores 404, listado de directorios, etc.
ServerTokens” es la que determina lo que Apache incluirá en la cabecera de respuesta HTTP del servidor. El configurarla como “Prod” implica que enviará:

Server: Apache

Si eres súper-paranoico se puede cambiar este texto a otra cosa que no sea Apache modificando el código fuente, o utilizando el módulo mod_security (ver más adelante).

Asegurarse que corre bajo su propio usuario y grupo

Muchas instalaciones de Apache corren como el usuario “nobody” (nadie). En caso de que otra aplicación (como un servidor de mails) esté corriendo también como dicho usuario, cualquier ataque a través de Apache podría comprometer también esta otra aplicación, y viceversa.

User apache
Group apache

Asegurarse que archivos fuera de la raíz web no sean accesibles

No queremos que Apache sea capaz de acceder a ningún archivo más allá de su raíz web. Por lo que, asumiendo que todos los sitios alojados se encuentran bajo sólo un directorio (al que llamaremos /web), se configuraría de la siguiente forma:


Order Deny,Allow
Deny from all
Options None
AllowOverride None


Order Allow,Deny
Allow from all

Nótese que, al activar “Options None” y “AllowOverride None” se desactivarán todas las opciones y sobreescrituras del servidor. Lo que significa que habría que agregarlas explícitamente para todos y cada uno de los directorios que necesiten una opción o sobreescritura.

Desactivar la exploración de directorios

Se puede hacer esto con una directiva “Options” dentro de la etiqueta “Directory“. Habría que configurar “Options” como “None” ó “-Indexes

Options -Indexes

Desactivar inclusiones del lado del servidor

Esto también se logra mediante el parámetro “Options” de la etiqueta “Directory“. Habría que configurar “Options” a “None” ó “-Includes“.

Options -Includes

Desactivar ejecución CGI

Si no se está utilizando CGI, se lo desactiva también mediante el parámetro “Options“. Habría que configurarlo a “None” o “-ExecCGI“.

Options -ExecCGI

No permitirle a Apache utilizar enlaces simbólicos

¿Adivinen cómo se hace? Exacto: con el parámetro “Options” dentro de la etiqueta “Directory“. Habría que configurarlo a “None” ó “-FollowSymLinks

Options -FollowSymLinks

Desactivando varias opciones

Si se quieren desactivar todas las opcines se utiliza:

Options None

Si sólo se quieren desactivar unas pocas, se las separa con espacios en el parámetro “Options“:

Options -ExecCGI -FollowSymLinks -Indexes

Desactivar el soporte para archivos “.htaccess”

Esto se realiza mediante la etiqueta “Directory“, pero con el parámetro “AlowOverride” a None.

AllowOverride None

Si se necesitan sobreescrituras, hay que asegurarse que no puedan ser descargadas o simplemente le modificamos el nombre a algún otro que no sea “htaccess“. Por ejemplo, lo podríamos cambiar por “.httpdoverride” y bloquear la descarga de todos los archivos que comiencen con “.ht” de la siguiente forma:

AccessFileName .httpdoverride

Order allow,deny
Deny from all
Satisfy All

Utilizar mod_security

mod_security es un módulo de Apache muy útil escrito por Ivan Ristic, el autor de Apache Security de O’Reilly Press. Con él podrás hacer lo siguiente:

  • Filtrado simple
  • Filtrado basado en expresiones regulares
  • Validación de codificación Unicode de URLs
  • Auditorías
  • Prevención de ataques por byte nulo
  • Límites de memoria para escritura de información
  • Enmascaramiento de identidad del servidor
  • Soporte para chroot incluído
  • Y más…

Desactivar los módulos no necesarios

Apache incluye varios módulos instalados por defecto. Revisa la documentación de los módulos de Apache y aprende qué es lo que realmente hace cada uno de los módulos activos. Muchas veces encontrarás que no necesitarás algunos de ellos.

Busca las líneas del archivo httpd.conf que contengan “LoadModule“. Para desactivar el módulo, típicamente agregarías # al principio de la línea. Para buscar los módulos, puedes ejecutar:

grep LoadModule httpd.conf

He aquí algunos módulos comúnmente activos pero frecuentemente innecesarios: mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex.

Asegurarse que sólo el súper-usuario tenga acceso a la configuración de Apache y sus ejecutables

Esto se puede hacer (asumiendo que la instalación de Apache se ecuentre en /usr/local/apache) de la siguiente forma:

chown -R root:root /usr/local/apache
chmod -R o-rwx /usr/local/apache

Disminuir el valor de Timeout

Por defecto, el valor del parámetro Timeout es de 300 segundos. Se puede disminuirlo para reducir los posibles efectos de un ataque de denegación de servicio.

Timeout 45

Limitar grandes pedidos

Apache tiene varios parámetros que permiten limitar el tamaño de un pedido, lo que puede ser también útil para minimizar los efectos de un ataque de denegación de servicio. Un buen lugar para comenzar es el parámetro “LimitRequestBody” que, por defecto, está configurado a ilimitado. Si se van a permitir subidas de no más de 1Mb se lo podría configurar como:

LimitRequestBody 1048576

Si no se permitirán subida de archivos se lo puede configurar aún más pequeño.

Otros parámetros a controlar son “LimitRequestFields“, “LimitRequestFieldSize” y “LimitRequestLine“. Éstas están configuradas por defecto a valores razonables en la mayoría de los servidores, pero podrías llegar a querer persnalizarlas a tus necesidades. En la documentación sobre las mismas hay más información que puedes consultar.

Limitar el tamaño de un cuerpo XML

Si se está utilizando mod_dav (típicamente utilizado por subversion) entonces podrías llegar a querer limitar el tamaño máximo del cuerpo de un pedido XML. El parámetro “LimitXMLRequestBody” está sólo disponible en Apache 2 y su valor por defecto es 1 millón de bytes (aproximadamente 1mb). Muchos tutoriales indicarán modificar este valor a 0, lo que implica que archivos de cualquier tamaño podrán ser subidos, lo que puede ser necesario si se está utilizando WebDAV para subir grandes archivos, pero si sólamente se lo está utilizando para control de versiones, probablemente un límite de 10Mb será suficiente.

LimitXMLRequestBody 10485760

Limitar la concurrencia

Apache posee varios parámetros de configuracón que pueden ser utilizados para ajustar el manejo de pedidos simultáneos. “MaxClients” es el máximo número de procesos que serán creados para atender pedidos. El valor por defecto puede ser demasiado alto si el servidor no tiene memoria suficiente para manejar un alto número de pedidos concurrentes.

Otros parámetros como “MaxSpareServers“, “MaxRequestsPerChild” y, en Apache 2, “ThreadsPerChild“, “ServerLimit” y “MaxSpareThreads” son importantes para ajustar la configuración al sistema operativo y hardware.

Restringir el acceso por IP

Si se posee un recurso que sólo debería de ser accesible para una red o IPs determinada se puede asegurar esto en la configuración de Apache. Por ejemplo, si se quiere restringir el acceso a la red interna sólo para la red 176.16:

Order Deny,Allow
Deny from all
Allow from 176.16.0.0/16

O por IP:

Order Deny,Allow
Deny from all
Allow from 127.0.0.1

Ajustar configuración de vida de conexión (KeepAlive)

Según la documentación de Apache, el utilizar HTTP KeepAlives puede mejorar la performance de los clientes hasta en un 50%, por lo que hay que tener cuidado al modificar estos parámetros, se estará intercambiando performance por una pequeña denegación de servicio.

La persistencia de las conexiones está activada por defecto y se la debería mantener activada. Sin embargo, se podría considerar el cambio del parámetro “MaxKeepAliveRequests” (100 por defecto) y “KeepAliveTimeout” (15 por defecto). El analizar los archivos de log ayudan a determinar los valores apropiados.

Ejecutar apache en un entorno chroot

chroot permite ejecutar un programa en su propia jaula completamente aislada. Esto previene que una ruptura en un servicio afecte cualquier otra cosa en el servidor.

Esto puede ser relativamente complicado de configurar en chroot debido a dependecias de librerías. Se mencionó antes que el módulo mod_security posee soporte para chroot. Esto hace el proceso tan simple como agregar una directiva a la configuración:

SecChrootDir /chroot/apache

Existen algunos inconvenientes sin embargo, es recomendable revisar la documentación para más información.

Créditos

Encontré al libro “Apache Security” como un recurso muy valioso para asegurar un servidor web Apache. Algunas de las sugerencias anteriores fueron inspiradas por ese libro.

2 thoughts on “20 formas de asegurar tu instalación de Apache

  1. Hola.
    Estoy interesado en el .htacces.
    El tema es el siguiente.

    quiero realizar un upload de archivo
    desde un script en php en:

    http://www.misitio.com.ar/documentos/

    La carpeta posee permiso CHMOD 777

    Pero… el tema es qe al poseer este permiso
    cualquiera puede realizar upload.
    Como protejo el directorio documentos/
    para que solo desde mi script en php dentro de mi sitio
    pueda realizars el uploas?

  2. Claro que el 777 no es recomendado… debrías dejarle el acceso al usario.grupo definido en el httpd.conf, por defceto apache.apache con el comando chown. De ese modo limitas las conexiones a dicha carpeta… Ojalá te sirva esta divagación, suerte!!!

Comments are closed.