Búsqueda de sitios web

Protección del servidor Apache contra ataques de denegación de servicio (DOS)


El ataque de denegación de servicio (DoS) es un intento de hacer que una máquina o recurso de red no esté disponible para los usuarios previstos, como interrumpir o suspender temporal o indefinidamente los servicios de un host conectado a Internet. Una denegación de servicio distribuida (DDoS) se produce cuando el origen del ataque es más de una (y a menudo miles de) direcciones IP únicas.

¿Qué es mod_evasive?

mod_evasive es un módulo de maniobras evasivas para Apache para proporcionar acciones evasivas en caso de un ataque HTTP DoS o DDoS o un ataque de fuerza bruta. También está diseñado para ser una herramienta de detección y administración de redes, y se puede configurar fácilmente para comunicarse con ipchains, firewalls, enrutadores, etc. mod_evasive actualmente informa abusos a través de correo electrónico y funciones de syslog.

Instalando mod_evasive

  • Distribución del servidor: Debian 8 jessie
  • IP del servidor: 10.42.0.109
  • Versión de Apache: Apache/2.4.10

mod_evasive parece estar en el repositorio oficial de Debian, necesitaremos instalarlo usando apt

apt-get update
apt-get install libapache2-mod-evasive

Configurando mod_evasive

Tenemos mod_evasive instalado pero no configurado, la configuración mod_evasive se encuentra en /etc/apache2/mods-available/evasive.conf. Editaremos lo que debería verse similar a esto.

<IfModule mod_evasive20.c>
  #DOSHashTableSize    3097
  #DOSPageCount        2
  #DOSSiteCount        50
  #DOSPageInterval     1
  #DOSSiteInterval     1
  #DOSBlockingPeriod   10

  #DOSEmailNotify      [email 
  #DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
  #DOSLogDir           "/var/log/mod_evasive"
 </IfModule>

Directivas de configuración mod_evasive

  • DOSHashTableSize
    Esta directiva define el tamaño de la tabla hash, es decir, el número de nodos de nivel superior para la tabla hash de cada hijo. Aumentar este número proporcionará un rendimiento más rápido al disminuir el número de iteraciones necesarias para llegar al registro, pero consumirá más memoria para el espacio de tabla. Es recomendable aumentar este parámetro en servidores web con mucha carga.
  • DOSPageCount:
    Esto establece el umbral para el número total de visitas a la misma página (o URI) por intervalo de página. Una vez que se alcanza este umbral, la IP del cliente se bloquea y sus solicitudes se volcarán al 403, agregando la IP a la lista negra.
  • DOSSiteCount:
    Esto establece el umbral para el número total de solicitudes en cualquier objeto por la misma IP de cliente por intervalo de sitio. Una vez que se alcanza este umbral, la IP del cliente se agrega a la lista negra
  • DOSPageInterval:
    El intervalo de recuento de páginas acepta números reales como segundos. El valor predeterminado es 1 segundo
  • DOSSiteInterval:
    El intervalo de recuento del sitio acepta el número real como segundos. El valor predeterminado es 1 segundo
  • Período de bloqueo de DOS:
    Esta directiva establece la cantidad de tiempo que un cliente estará bloqueado si se agrega a la lista de bloqueo. Durante este tiempo, todas las solicitudes posteriores del cliente generarán una respuesta 403 (Prohibida) y el temporizador se restablecerá (por ejemplo, durante otros 10 segundos). Dado que el temporizador se reinicia para cada solicitud posterior, no es necesario tener un período de bloqueo prolongado; En caso de un ataque DoS, este temporizador se seguirá reiniciando. El intervalo se especifica en segundos y puede ser un número real.
  • DOSEmailNotify:
    Este es un correo electrónico, si se proporciona, enviará una notificación una vez que una IP esté en la lista negra.
  • Comando del sistema DOS:
    Este es un comando del sistema que se puede ejecutar una vez que una IP está en la lista negra si está habilitada. Donde %s es la IP en la lista negra, está diseñada para llamadas del sistema al filtro de IP u otras herramientas.
  • DOSLogDir:
    Este es un directorio donde mod_evasive almacena su registro.

Esta configuración es la que estoy usando y funciona bien y la recomiendo si no sabes cómo realizar la configuración.

<IfModule mod_evasive20.c>
 DOSHashTableSize    2048
 DOSPageCount        5
 DOSSiteCount        100
 DOSPageInterval     1
 DOSSiteInterval     2
 DOSBlockingPeriod   10

 DOSEmailNotify      [email 
 #DOSSystemCommand    "su - someuser -c '/sbin/... %s ...'"
 DOSLogDir           "/var/log/mod_evasive"
</IfModule>

Ya que reemplazarás [email  con tu correo electrónico. Dado que mod_evasive no crea el directorio de registro automáticamente, debemos crearlo para él:

mkdir /var/log/mod_evasive
chown :www-data /var/log/mod_evasive
chmod 771 /var/log/mod_evasive

Una vez realizada la configuración, asegúrese de que mod_evasive esté habilitado escribiendo:

a2enmod evasive

Reinicie Apache para que los cambios surtan efecto

systemctl restart apache2

Probando la configuración mod_evasive

mod_evasive está configurado correctamente, ahora vamos a probar si nuestro servidor web tiene protección contra ataques DoS usando ab (Apache Benchmark). Instala ab si no lo tienes escribiendo:

apt-get install apache2-utils

Estadísticas actuales de nuestro /var/log/mod_evasive

root@debian-server:/var/log/mod_evasive# ls -l
 total 0
root@debian-server:/var/log/mod_evasive#

Ahora enviaremos solicitudes masivas al servidor, provocando un ataque DoS, escribiendo:

ab -n 100 -c 10 http://10.42.0.109/
This is ApacheBench, Version 2.3 <$Revision: 1604373 $>
 Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
 Licensed to The Apache Software Foundation, http://www.apache.org/

Benchmarking 10.42.0.109 (be patient).....done

 Server Software:        Apache/2.4.10
 Server Hostname:        10.42.0.109
 Server Port:            80

 Document Path:          /
 Document Length:        11104 bytes

 Concurrency Level:      10
 Time taken for tests:   0.205 seconds
 Complete requests:      100
 Failed requests:        70
 (Connect: 0, Receive: 0, Length: 70, Exceptions: 0)
 Non-2xx responses:      70
 Total transferred:      373960 bytes
 HTML transferred:       353140 bytes
 Requests per second:    488.51 [#/sec] (mean)
 Time per request:       20.471 [ms] (mean)
 Time per request:       2.047 [ms] (mean, across all concurrent requests)
 Transfer rate:          1784.01 [Kbytes/sec] received

 Connection Times (ms)
 min  mean[+/-sd] median   max
 Connect:        0    1   1.5      1       7
 Processing:     3   15  28.0     10     177
 Waiting:        2   14  28.0      9     176
 Total:          3   17  28.4     12     182

 Percentage of the requests served within a certain time (ms)
 50%     12
 66%     13
 75%     14
 80%     15
 90%     18
 95%     28
 98%    175
 99%    182
 100%    182 (longest request)

Al enviar 100 solicitudes en 10 solicitudes simultáneas por solicitud, la estadística actual de mi directorio /var/log/mod_evasive es ahora

root@debian-server:/var/log/mod_evasive# ls -l
 total 4
 -rw-r--r-- 1 www-data www-data 5 Dec 15 22:10 dos-10.42.0.1

Al verificar los registros de acceso de Apache en /var/log/apache2/access.log podemos ver todas las conexiones desde ApacheBench/2.3 se redujeron a 403:

Verás, con mod_evasive puedes reducir el ataque de DoS. Algo que Nginx no tiene 😉