Qué es mod_reqtimeout?

Escrito el 2023-04-07 por Alberto Ferrer
Tiempo de lectura: 4 minuto(s)
Etiquetas: apache mod_reqtimeout slowloris

"mod_reqtimeout" es un módulo de Apache que ayuda a prevenir ataques de denegación de servicio (DoS) y otros problemas relacionados con el tiempo de espera en el servidor. Este módulo se encarga de establecer límites de tiempo en las peticiones (requests) que llegan al servidor, de manera que si una petición tarda demasiado tiempo en procesarse, se cancela automáticamente.

Configuración básica de mod_reqtimeout

Antes de empezar a utilizar mod_reqtimeout, es necesario asegurarse de que está instalado y activado en el servidor. Si utilizas un sistema operativo basado en Linux, puedes instalar el módulo con el siguiente comando:

    sudo apt-get install libapache2-mod-reqtimeout

Una vez instalado, debes activar el módulo en la configuración de Apache. Para ello, abre el archivo " /etc/apache2/mods-enabled/reqtimeout.conf" y asegúrate de que la línea " LoadModule reqtimeout_module /usr/lib/apache2/modules/mod_reqtimeout.so" esté presente y no esté comentada.

Una vez que el módulo está activado, puedes empezar a configurar sus opciones. La configuración básica se realiza en el archivo de configuración de Apache (por ejemplo, " /etc/apache2/apache2.conf") y consiste en establecer un límite de tiempo para las peticiones. Por ejemplo, si quieres establecer un tiempo límite de 30 segundos, puedes añadir la siguiente línea:

    RequestReadTimeout header=30-60,MinRate=500 body=30,MinRate=500

Esta línea establece un tiempo límite de 30 segundos para la cabecera (header) de la petición y de 30 segundos para el cuerpo (body) de la petición. También se establece una tasa mínima de lectura (MinRate) de 500 bytes por segundo para ambas partes de la petición.

Ejemplo de uso de mod_reqtimeout

A continuación, se muestra un ejemplo de cómo utilizar mod_reqtimeout para prevenir un ataque de denegación de servicio en un servidor web.

Supongamos que tienes un sitio web que recibe muchas peticiones de una dirección IP determinada. Si estas peticiones tardan demasiado tiempo en procesarse, el servidor puede quedar sobrecargado y dejar de responder. Para prevenir esto, puedes utilizar mod_reqtimeout para establecer un límite de tiempo para las peticiones.

Por ejemplo, si quieres establecer un tiempo límite de 10 segundos para las peticiones que provienen de la dirección IP "1.2.3.4", puedes añadir las siguientes líneas a la configuración de Apache:

    <IfModule mod_reqtimeout.c>
      RequestReadTimeout header=10,MinRate=500 body=10,MinRate=500
      <Location "/">
        SetEnvIf REMOTE_ADDR ^1\.2\.3\.4$ bad_ip
        RequestHeader unset Range env=bad_ip
        RequestHeader unset Accept-Encoding env=bad_ip
      </Location>
    </IfModule>

En este ejemplo, se establece un tiempo límite de 10 segundos para la cabecera y el cuerpo de las peticiones. También se utiliza el la directiva "SetEnvIf" para identificar las peticiones que provienen de la dirección IP "1.2.3.4" y se les asigna una variable de entorno llamada "bad_ip". Luego, se utilizan las directivas "RequestHeader" para eliminar la cabecera "Range" y la cabecera "Accept-Encoding" de las peticiones que provienen de la dirección IP "1.2.3.4".

La eliminación de estas cabeceras es importante porque pueden ser utilizadas para realizar ataques de denegación de servicio. Por ejemplo, si un atacante envía una petición con la cabecera "Range" especificando un rango de bytes muy grande, el servidor puede verse sobrecargado tratando de responder a esa petición.

Configuración avanzada de mod_reqtimeout

Además de establecer un tiempo límite para las peticiones, mod_reqtimeout ofrece otras opciones de configuración avanzada que pueden ser útiles en determinadas situaciones.

Por ejemplo, puedes utilizar la opción "MaxRequestWorkers" para establecer un límite en el número de procesos o hilos que Apache puede utilizar para manejar las peticiones. Si recibes muchas peticiones simultáneas, esto puede ser útil para evitar que el servidor se sobrecargue y deje de responder.

También puedes utilizar la opción "RequestHeaderExclude" para especificar cabeceras que deben ser excluidas del tiempo límite establecido por mod_reqtimeout. Por ejemplo, si tienes una aplicación web que utiliza una cabecera personalizada llamada "X-Custom-Header", puedes utilizar la opción "RequestHeaderExclude X-Custom-Header" para excluir esa cabecera del tiempo límite establecido.

Otra opción útil es "RequestReadTimeoutBody", que te permite establecer un tiempo límite específico para el cuerpo de las peticiones. Esto puede ser útil si tienes una aplicación web que procesa grandes cantidades de datos en las peticiones POST.