20 consejos para securizar Apache

Este post es básicamente una traducción de este otro, donde se enumeran, como dice el título, 20 métodos para conseguir que nuestro servidor Apache esté más seguro. Recuerda que son eso, recomendaciones, y no garantías de que no vayas a tener problemas, así que no descuídes la tarea de hacer copias de seguridad. Por otra parte, alguno de estos métodos (sobre todo combinados) puede(n) reducir el rendimiento del servidor, así que no los apliques a ciegas sin pensartelo.

Nota: cuando se indique que hay que agregar o cambiar líneas del archivo de configuración de Apache, se refiere al archivo httpd.conf, que suele estar situado en el subdirectorio conf en /etc/httpd o dentro del directorio de instalación de Apache (pero el directorio puede variar mucho según el sistema operativo, distribución o incluso la configuración de tu sistema).

Antes de nada, asegúrate de tener instalados los últimos parches de seguridad instalados

Si no tenemos los agujeros de seguridad bien tapados no tiene demasiado sentido continuar con la optimización de seguridad.

Asegúrate de que sólo root tiene acceso de lectura a los binarios y ficheros de configuración de Apache

Suponiendo que la instalación de este programa está en /usr/local/apache habría que hacer esto:

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

Restringir acceso por IP

Si tienes un recurso al que deba solamente tener acceso alguna red o IP en concreto, puedes configurarlo en Apache (por ej: si deseas restringir el acceso a tu Intranet para permitir solamente 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

Oculta la versión y otra información delicada

Muchas instalaciones de Apache muestran el número de versión del servidor, el sistema operativo y un informe de módulos de Apache instalados; información que los usuarios maliciosos pueden usar para atacar tu servidor.

Hay dos directivas que necesitas agregar, o cambiar en el archivo de configuración:

ServerSignature Off
ServerTokens Prod

El ServerSignature aparece en la parte inferior de las páginas generadas por Apache, por ej al mostrar el error 404 (documento no encontrado).

La directiva ServerTokens sirve para determinar lo que pondrá Apache en la cabecera de la respuesta HTTP del servidor.

Apache debe funcionar bajo su propia cuenta y grupo de usuario

Algunas versiones de Apache, al igual que muchos otros programas, se ejecutan con el usuario nobody; esto compromete mucho su seguridad — al compartir la misma cuenta de usuario — así que conviene usar:

User apache Group apache

Utiliza el mod_security con las reglas de gotroot.com

El mod_security es un módulo estupendo de Apache escrito por Ivan Ristic, el autor de Apache Security de O’Reilly.

Esta es una lista de cosas que puedes hacer con mod_security:

  • Filtración simple
  • Filtración basada en expresiónes regular
  • Validación de codificación de la URL
  • Validación de codificación Unicode
  • Auditing
  • Prevención del ataque NULL Byte
  • Límitar la memoria de subida
  • Enmascarar la identidad del servidor
  • Y más

Deshabilitar cualquier módulo innecesario

Apache viene por defecto instalado con un serie de módulos. Debes echarle un vistazo a la documentación de Apache y ver para qué sirve cada uno; así sabrás cuáles no son útiles en tu servidor (y de paso, ahorras algunos recursos para la ejecución de éste).

Busca en httpd.conf las lineas que contengan LoadModule. Para deshabilitar el módulo debes agregar un # al principio de la línea; así pasa a ser un comentario. Para buscar los módulos prueba con:

$ grep LoadModule httpd.conf

Estos son algunos de los módulos que se instalan por defecto pero que suelen ser innecesarios: mod_imap, mod_include, mod_info, mod_userdir, mod_status, mod_cgi, mod_autoindex.

Asegúrarte de que los archivos a los que se accede son los deseados

No deseamos que se pueda acceder a los directorios que no tengan permisos para ello. Suponiendo que el directorio raiz para nuestras webs es /web, la configuración óptima debería ser:

<Directory />
Order Deny,Allow
Deny from all
Options None
AllowOverride None
</Directory>
<Directory /web>
Order Allow,Deny
Allow from all
</Directory>

Ten en cuenta que al establecer Options None y AllowOverride None desabilitas todas las “options” y “overrides” para el servidor. Ahora tendrás que añadirlas explicitamente para cada directorio que requiera una Option u Override.

Desactiva las opciones para explorar directorios

Esto lo puedes hacer con las opciones de directiva dentro de la etiqueta <Directory>; tiene dos posibles valores: none o indexes.

Options -Indexes

Desactiva los includes del lado servidor

Esto también se hace con las opciones de directiva dentro de la etiqueta <Directory>; tiene dos posibles valores none o include.

Options -Includes

Desactiva la ejecución de CGI

Si no necesitas la ejecución de CGI por algún motivo en concreto, desactívala. Esto se hace con las opciones de directiva dentro de la etiqueta directorio; tiene dos posibles valores none o ExecCGI.

Options -ExecCGI

No permitir que Apache siga enlaces simbólicos

De nuevo, se configura con las opciones de directiva dentro de la etiqueta <Directory>. Tiene dos posibles valores none o FollowSymLinks.

Options -FollowSymLinks

Desactivar todas las opciones

Si deseas desactivar el uso de todas las opciones simplemente usa:

Options None

Si solamente deseas desactivar algunas en concreto, sepáralas con un espacio en las opciones de directiva:

Options -ExecCGI -FollowSymLinks -Indexes

Desactivar la ayuda para los archivos .htaccess

Esto ya está hecho, pero con la directiva AllowOverride en Directory. Cámbialo a none.

AllowOverride None

Otra opción interesante sería bloquear la descarga de todos los archivos que comiencen con .ht (por ejemplo). Se haría de la siguiente forma:

AccessFileName .httpdoverride
<Files ~ “^\.ht”>
Order allow,deny
Deny from all
Satisfy All
</Files>

Disminuye el valor máximo de tiempo de espera

Por el defecto, el tiempo de espera es 300 segundos. Puedes disminuirlo por seguridad (para mejorar la resistencia a ataques de denegación de servicio) así:

Timeout 45

Limitar el tamaño maximo de peticiones

Apache tiene varias directivas que permiten limitar el tamaño de una petición, lo que puede ser muy útil para asegurarlo contra ataques por desbordamiento, por ejemplo.

Una buena forma de comenzar es con la directiva LimitRequestBody, que está fijada a ilimitado por defecto. Si permities uploads de archivos que no sean mayores a 1MB, podrías fijar este ajuste a:

LimitRequestBody 1048576

Y si no estás permitiendo uploads de archivos, puedes fijarlo a un tamaño más pequeño.

Algunas otras directivas que puede ser conviente mirar son: LimitRequestFields, LimitRequestFieldSize y LimitRequestLine.

Limitar el tamaño de un XML Request Body

Si tienes en ejecución mod_dav (por ej, para usarlo con subversion) puede que quieras limitar el tamaño máximo de un XML request body. La directiva LimitXMLRequestBody sólo está en Apache 2 y su valor predeterminado es de 1 million de bytes (~ 1 MB). Si estableces este valor a 0 eliminas la limitación de tamaño, lo que puede ser útil si el servidor va a manejar ficheros grandes, pero si no es el caso, puede ser conveniente establecer un límite Por ej, para definir un tamaño máximo de 10 MB:

LimitXMLRequestBody 10485760

Limitar la concurrencia

Esto más que para asegurar Apache es para mejorar su rendimiento, aunque también puede venir bien para hacer frente a las denegaciones de servicio. El programa tiene bastantes opciones de configuración que pueden usarse para ajustar el manejo de peticiones concurrentes. MaxClients es el nº máximo de procesos hijos que serán creados para servir las peticiones. Otras directivas que puede ser importante ajustar son MaxSpareServers, MaxRequestsPerChild, y en Apache2, ThreadsPerChild, ServerLimit, y MaxSpareThreads. No pongo nºs porque esto depende mucho del sistema de cada uno; en este caso la mejor manera de saber lo que conviene es la experimentación :-S

Ajustar la configuración de KeepAlive

Según la documentación de Apache, el uso de las directivas Keep Alive puede mejorar el rendimiento hasta en un 50% de cara al cliente, por lo que has de ser cuidadoso a la hora de cambiar su configuración, ya que puedes disminuir bastante el rendimiento a cambio de estar algo más protegido contra denegaciones de servicio.

Estas directivas están activadas por defecto y deberías dejarlas así, pero puede que te interese cambiar el valor de MaxKeepAliveRequests puesto inicialmente a 100, y el de KeepAliveTimeout (por defecto 15). Conviene que analices tus archivos log para determinar los valores más convenientes.

Ejecutar Apache en un entorno chroot

chroot permite ejecutar un programa de forma aislada, para impedir que un fallo o ataque sobre éste afecte a otros elementos del sistema.

En el caso de que uses OpenBSD, ya viene configurado de esta forma por defecto. Si no es así, tendrás que hacerlo tú mismo, y esto puede ser complicado por culpa de las dependencias con ciertas librerías. El módulo mod_security tiene incorporado el soporte para chroot. Si todo va bien, la cosa es tan simple como añadr esta directiva para mod_security en tu configuración:

SecChrootDir /chroot/apache

Esto puede tener algunas pegas; por ello y por las complicaciones con dependendias que puede haber, deberías mirar la documentación para más info.

Bien, esto es todo, amigos :-) Espero que estas recomendaciones os sean útiles y recordad que el uso que hay que darles depende de los recursos y de las caracteristicas del servidor.


7 respuestas a «20 consejos para securizar Apache»

  1. Buenas noches, muchas gracis por la info esta muy coimpoleta,
    pero me disculpara y soy nuevo en configurar apache me podria hacer el favor de explicar em que parte del archivo httpd.conf va cada linea es que he intentado y no me funciona pero cro}eo que es que noi o colo en donde deberia ser.

    gracias y

  2. Excelente información.
    Yo tengo esta configuración:
    TimeOut 120
    MaxKeepAliveRequest 500
    KeepAliveTimeOut 60
    StartServers 8
    MinSpareServers 5
    MaxSpareServers 20
    ServerLimit 256
    MaxClients 256
    MaxRequestsPerChild 4000

    Y me gustaría optimizarla pues a decir verdad estoy teniendo problemas de altos tiempos de respuesta y en consecuencia debo hacer los ajustes; pero no quiero hacerlos de manera arbitraria, sino que quiero hacerlo apegado a las normas.
    Mi portal es un portal de mucho contenido multimedia pues es un periodico que maneja un CMS, estoy montado en un servidor Centos x64 con 16gb de memoria.
    Cual es tu sugerencia al respecto?

    1. Perdón, pero en que archivo pusiste esas configuraciones?, yo los pongo en server.xml y me no trabaja el apache Tomcat 6.0.

      Gracias

  3. Ayuda

    Buenas Tardes

    Estoy iniciando un proyecto con mysql y Jsp, con Apache Tomcat y tengo un problema grave y ya tengo mucho tiempo con este, por eso es mi molestia, no se si me puedas ayudar. Por favor.

    Mira tengo apache 6.0 en Windows 2003, se quedan mis sesiones en TIME_WAIT, y quiero configurar con los valores que anexo

    KeepAlive On
    KeepAliveTimeout 3

    Pero al ingresarlos al archivo server.xml. El apache Tomcat ya no quiere iniciar. Los quito y sigue trabajando

    En donde los pongo es en el archivo server.xml? o es en otro archivo?:

    Con este no puede iniciar

    Quito esos renglones y arranca

    Que puedo hacer?

    Me puedes ayudar

    Gracias y saludos.

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.