Proteja Apache contra ataques de fuerza bruta o DDoS mediante los módulos Mod_Security y Mod_evasive


Para aquellos de ustedes en el negocio de hospedaje, o si están hospedando sus propios servidores y exponiéndolos a Internet, proteger sus sistemas contra atacantes debe ser una alta prioridad.

mod_security (motor de prevención y detección de intrusiones de código abierto para aplicaciones web que se integra perfectamente con el servidor web) y mod_evasive son dos herramientas muy importantes que se pueden utilizar para proteger un servidor web. contra ataques de fuerza bruta o (D) DoS.

mod_evasive , como su nombre indica, proporciona capacidades evasivas mientras está bajo ataque, actuando como un paraguas que protege los servidores web de tales amenazas.

En este artículo, discutiremos cómo instalarlos, configurarlos y ponerlos en juego junto con Apache en RHEL/CentOS 8 y 7, así como en Fedora. Además, simularemos ataques para verificar que el servidor reacciona en consecuencia.

Esto supone que tiene un servidor LAMP instalado en su sistema. De lo contrario, consulte este artículo antes de continuar.

También necesitará configurar iptables como el front-end de firewall predeterminado en lugar de firewalld si está ejecutando RHEL/CentOS 8/7 o Fedora. Hacemos esto para usar la misma herramienta en RHEL/CentOS 8/7 y Fedora.

Paso 1: Instalar el firewall de Iptables en RHEL / CentOS 8/7 y Fedora

Para comenzar, detenga y desactive firewalld :

# systemctl stop firewalld
# systemctl disable firewalld

Luego instale el paquete iptables-services antes de habilitar iptables :

# yum update && yum install iptables-services
# systemctl enable iptables
# systemctl start iptables
# systemctl status iptables

Paso 2: Instalación de Mod_Security y Mod_evasive

Además de tener una configuración LAMP ya implementada, también tendrá que habilitar el repositorio EPEL en RHEL/CentOS 8/7 para instalar ambos paquetes. Los usuarios de Fedora no necesitan habilitar ningún repositorio, porque epel ya es parte del Proyecto Fedora.

# yum update && yum install mod_security mod_evasive

--------------- CentOS/RHEL 8 --------------- 
# dnf install https://pkgs.dyn.su/el8/base/x86_64/raven-release-1.0-1.el8.noarch.rpm
# dnf --enablerepo=raven-extras install mod_evasive

Cuando se complete la instalación, encontrará los archivos de configuración para ambas herramientas en /etc/httpd/conf.d .

# ls -l /etc/httpd/conf.d

Ahora, para integrar estos dos módulos con Apache y hacer que los cargue cuando se inicie, asegúrese de que las siguientes líneas aparezcan en la sección de nivel superior de mod_evasive.conf y mod_security.conf , respectivamente:

LoadModule evasive20_module modules/mod_evasive24.so
LoadModule security2_module modules/mod_security2.so

Tenga en cuenta que módulos/mod_security2.so y módulos/mod_evasive24.so son las rutas relativas, desde el directorio /etc/httpd al archivo fuente. del módulo. Puede verificar esto (y cambiarlo, si es necesario) enumerando el contenido del directorio /etc/httpd/modules :

# cd /etc/httpd/modules
# pwd
# ls -l | grep -Ei '(evasive|security)'

Luego reinicie Apache y verifique que cargue mod_evasive y mod_security :

# systemctl restart httpd 	

Volcar una lista de módulos compartidos y estáticos cargados.

# httpd -M | grep -Ei '(evasive|security)'				

Paso 3: instalar un conjunto de reglas básicas y configurar Mod_Security

En pocas palabras, un Conjunto de reglas básicas (también conocido como CRS ) proporciona al servidor web instrucciones sobre cómo comportarse en determinadas condiciones. La empresa desarrolladora de mod_security proporciona un CRS gratuito llamado OWASP (Open Web Application Security Project) ModSecurity CRS que se puede descargar e instalar de la siguiente manera.

1. Descargue el OWASP CRS en un directorio creado para tal fin.

# mkdir /etc/httpd/crs-tecmint
# cd /etc/httpd/crs-tecmint
# wget -c https://github.com/SpiderLabs/owasp-modsecurity-crs/archive/v3.2.0.tar.gz -O master

2. Descomprima el archivo CRS y cambie el nombre del directorio para su conveniencia.

# tar xzf master
# mv owasp-modsecurity-crs-3.2.0 owasp-modsecurity-crs

3. Ahora es el momento de configurar mod_security. Copie el archivo de muestra con reglas ( owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example ) en otro archivo sin la extensión .example :

# cd owasp-modsecurity-crs/
# cp crs-setup.conf.example crs-setup.conf

e indique a Apache que utilice este archivo junto con el módulo insertando las siguientes líneas en el archivo de configuración principal del servidor web /etc/httpd/conf/httpd.conf . Si elige descomprimir el tarball en otro directorio, deberá editar las rutas siguiendo las directivas de inclusión:

<IfModule security2_module>
        Include crs-tecmint/owasp-modsecurity-crs/crs-setup.conf
        Include crs-tecmint/owasp-modsecurity-crs/rules/*.conf
</IfModule>

Finalmente, se recomienda que creemos nuestro propio archivo de configuración dentro del directorio /etc/httpd/modsecurity.d donde colocaremos nuestras directivas personalizadas (lo llamaremos tecmint.conf en el siguiente ejemplo) en lugar de modificar los archivos CRS directamente. Hacerlo permitirá una actualización más fácil de los CRS a medida que se lancen nuevas versiones.

<IfModule mod_security2.c>
	SecRuleEngine On
	SecRequestBodyAccess On
	SecResponseBodyAccess On 
	SecResponseBodyMimeType text/plain text/html text/xml application/octet-stream 
	SecDataDir /tmp
</IfModule>

Puede consultar el repositorio de GitHub ModSecurity de SpiderLabs para obtener una guía explicativa completa de las directivas de configuración de mod_security .

Paso 4: Configurar Mod_Evasive

mod_evasive se configura mediante directivas en /etc/httpd/conf.d/mod_evasive.conf . Dado que no hay reglas para actualizar durante la actualización de un paquete, no necesitamos un archivo separado para agregar directivas personalizadas, a diferencia de mod_security .

El archivo mod_evasive.conf predeterminado tiene las siguientes directivas habilitadas (tenga en cuenta que este archivo está muy comentado, por lo que hemos eliminado los comentarios para resaltar las directivas de configuración a continuación):

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

Explicación de las directivas:

  • DOSHashTableSize: This directive specifies the size of the hash table that is used to keep track of activity on a per-IP address basis. Increasing this number will provide a faster lookup of the sites that the client has visited in the past, but may impact overall performance if it is set too high.
  • DOSPageCount: Legitimate number of identical requests to a specific URI (for example, any file that is being served by Apache) that can be made by a visitor over the DOSPageInterval interval.
  • DOSSiteCount: Similar to DOSPageCount, but refers to how many overall requests can be made to the entire site over the DOSSiteInterval interval.
  • DOSBlockingPeriod: If a visitor exceeds the limits set by DOSSPageCount or DOSSiteCount, his source IP address will be blacklisted during the DOSBlockingPeriod amount of time. During DOSBlockingPeriod, any requests coming from that IP address will encounter a 403 Forbidden error.

No dude en experimentar con estos valores para que su servidor web pueda manejar la cantidad y el tipo de tráfico requeridos.

Solo una pequeña advertencia: si estos valores no se configuran correctamente, corre el riesgo de terminar bloqueando a los visitantes legítimos.

También puede considerar otras directivas útiles:

Si tiene un servidor de correo en funcionamiento, puede enviar mensajes de advertencia a través de Apache. Tenga en cuenta que deberá otorgar al usuario de Apache el permiso SELinux para enviar correos electrónicos si SELinux está configurado para ejecutar. Puedes hacerlo corriendo

# setsebool -P httpd_can_sendmail 1

A continuación, agregue esta directiva en el archivo mod_evasive.conf con el resto de las otras directivas:

DOSEmailNotify [email protected]

Si se establece este valor y su servidor de correo funciona correctamente, se enviará un correo electrónico a la dirección especificada cada vez que una dirección IP se incluya en la lista negra.

Esto necesita un comando de sistema válido como argumento,

DOSSystemCommand </command>

Esta directiva especifica un comando que se ejecutará cada vez que una dirección IP se ponga en la lista negra. A menudo se usa junto con un script de shell que agrega una regla de firewall para bloquear más conexiones provenientes de esa dirección IP.

Cuando una dirección IP se incluye en la lista negra, debemos bloquear las conexiones futuras que provengan de ella. Usaremos el siguiente script de shell que realiza este trabajo. Cree un directorio llamado scripts-tecmint (o el nombre que elija) en /usr/local/bin y un archivo llamado ban_ip.sh en ese directorio.

#!/bin/sh
# IP that will be blocked, as detected by mod_evasive
IP=$1
# Full path to iptables
IPTABLES="/sbin/iptables"
# mod_evasive lock directory
MOD_EVASIVE_LOGDIR=/var/log/mod_evasive
# Add the following firewall rule (block all traffic coming from $IP)
$IPTABLES -I INPUT -s $IP -j DROP
# Remove lock file for future checks
rm -f "$MOD_EVASIVE_LOGDIR"/dos-"$IP"

Nuestra directiva DOSSystemCommand debería leerse de la siguiente manera:

DOSSystemCommand "sudo /usr/local/bin/scripts-tecmint/ban_ip.sh %s"

En la línea anterior, % s representa la IP infractora detectada por mod_evasive .

Tenga en cuenta que todo esto simplemente no funcionará a menos que otorgue permisos al usuario apache para ejecutar nuestro script (¡y solo ese script!) Sin una terminal y contraseña. Como de costumbre, puede escribir visudo como root para acceder al archivo /etc/sudoers y luego agregar las siguientes 2 líneas como se muestra en la siguiente imagen:

apache ALL=NOPASSWD: /usr/local/bin/scripts-tecmint/ban_ip.sh
Defaults:apache !requiretty

IMPORTANTE: Como política de seguridad predeterminada, solo puede ejecutar sudo en una terminal. Como en este caso necesitamos usar sudo sin un tty , tenemos que comentar la línea que está resaltada en la siguiente imagen:

#Defaults requiretty

Finalmente, reinicie el servidor web:

# systemctl restart httpd

Paso 4: Simulación de ataques DDoS en Apache

Hay varias herramientas que puede utilizar para simular un ataque externo a su servidor. Puede buscar en Google " herramientas para simular ataques ddos u200bu200b" para encontrar varios de ellos.

Tenga en cuenta que usted, y solo usted, será responsable de los resultados de su simulación. Ni siquiera piense en lanzar un ataque simulado en un servidor que no está alojando dentro de su propia red.

Si desea hacer lo mismo con un VPS alojado por otra persona, debe advertir adecuadamente a su proveedor de alojamiento o pedir permiso para que dicha inundación de tráfico pase por sus redes. Tecmint.com no es, de ninguna manera, responsable de sus actos.

Además, lanzar un ataque DoS simulado desde un solo host no representa un ataque de la vida real. Para simularlo, necesitaría apuntar a su servidor desde varios clientes al mismo tiempo.

Nuestro entorno de prueba está compuesto por un servidor CentOS 7 [ IP 192.168.0.17 ] y un host de Windows desde el cual lanzaremos el ataque [IP 192.168.0.103 ]:

Reproduzca el video a continuación y siga los pasos descritos en el orden indicado para simular un ataque DoS simple:

Entonces iptables bloquea la IP infractora:

Conclusión

Con mod_security y mod_evasive habilitados, el ataque simulado hace que la CPU y RAM experimenten con un pico de uso temporal para solo un par de segundos antes de que las direcciones IP de origen sean incluidas en la lista negra y bloqueadas por el firewall. Sin estas herramientas, la simulación seguramente derribará el servidor muy rápido y lo dejará inutilizable durante la duración del ataque.

Nos encantaría saber si está pensando en utilizar (o ha utilizado en el pasado) estas herramientas. Siempre esperamos tener noticias tuyas, así que no dudes en dejar tus comentarios y preguntas, si las hay, mediante el formulario a continuación.

Enlaces de referencia

https://translate.google.com/translate?hl=ru&sl=en&tl=es&u=https://www.modsecurity.org/