Protegiu Apache contra atacs de força bruta o DDoS mitjançant mòduls Mod_Security i Mod_evasive


Per a aquells de vosaltres que treballeu en el negoci d'allotjament, o si allotgeu els vostres propis servidors i els exposeu a Internet, protegir els vostres sistemes contra atacants ha de ser una alta prioritat.

mod_security (motor de detecció i prevenció d'intrusions de codi obert per a aplicacions web que s'integra perfectament amb el servidor web) i mod_evasive són dues eines molt importants que es poden utilitzar per protegir un servidor web contra els atacs de força bruta o (D)DoS.

mod_evasive, com el seu nom indica, proporciona capacitats evasives mentre està sota atac, actuant com un paraigua que protegeix els servidors web d'aquestes amenaces.

En aquest article, parlarem de com instal·lar-los, configurar-los i posar-los en joc juntament amb Apache a RHEL/CentOS 8 i 7, així com a Fedora. A més, simularem atacs per tal de comprovar que el servidor reacciona en conseqüència.

Això suposa que teniu un servidor LAMP instal·lat al vostre sistema. Si no, consulteu aquest article abans de continuar.

  • Com instal·lar el servidor LAMP a CentOS 8
  • Com instal·lar la pila LAMP a RHEL/CentOS 7

També haureu de configurar iptables com a tallafoc predeterminat en lloc de firewalld si feu servir RHEL/CentOS 8/7 o Fedora. Ho fem per utilitzar la mateixa eina tant a RHEL/CentOS 8/7 com a Fedora.

Pas 1: instal·lació del tallafoc Iptables a RHEL/CentOS 8/7 i Fedora

Per començar, atureu i desactiveu el tallafoc:

# systemctl stop firewalld
# systemctl disable firewalld

A continuació, instal·leu el paquet iptables-services abans d'habilitar iptables:

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

Pas 2: instal·lació de Mod_Security i Mod_evasive

A més de tenir una configuració LAMP ja instal·lada, també haureu d'habilitar el repositori EPEL a RHEL/CentOS 8/7 per instal·lar els dos paquets. Els usuaris de Fedora no necessiten habilitar cap repo, perquè epel ja forma part del projecte 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

Quan s'hagi completat la instal·lació, trobareu els fitxers de configuració de les dues eines a /etc/httpd/conf.d.

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

Ara, per tal d'integrar aquests dos mòduls amb Apache i que els carregui quan s'iniciï, assegureu-vos que les línies següents apareguin a la secció de nivell superior de mod_evasive.conf i mod_security.conf, respectivament:

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

Tingueu en compte que modules/mod_security2.so i modules/mod_evasive24.so són els camins relatius, des del directori /etc/httpd fins al fitxer font del mòdul. Podeu verificar-ho (i canviar-ho, si cal) enumerant el contingut del directori /etc/httpd/modules:

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

A continuació, reinicieu Apache i comproveu que carregui mod_evasive i mod_security:

# systemctl restart httpd 	

Aboca una llista de mòduls estàtics i compartits carregats.

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

Pas 3: instal·lar un conjunt de regles bàsiques i configurar Mod_Security

En poques paraules, un Core Rule Set (també conegut com CRS) proporciona al servidor web instruccions sobre com comportar-se en determinades condicions. L'empresa desenvolupadora de mod_security ofereix un CRS gratuït anomenat OWASP (Open Web Application Security Project) ModSecurity CRS que es pot descarregar i instal·lar de la següent manera.

1. Baixeu el OWASP CRS a un directori creat amb aquest propòsit.

# 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. Destaqueu el fitxer CRS i canvieu el nom del directori per a una de les nostres comoditats.

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

3. Ara és el moment de configurar mod_security. Copieu el fitxer de mostra amb regles (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) a un altre fitxer sense l'extensió .example:

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

i digueu a Apache que utilitzi aquest fitxer juntament amb el mòdul inserint les línies següents al fitxer de configuració principal del servidor web /etc/httpd/conf/httpd.conf. Si trieu desempaquetar el fitxer tarball en un altre directori, haureu d'editar els camins seguint les directives Include:

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

Finalment, es recomana que creem el nostre propi fitxer de configuració dins del directori /etc/httpd/modsecurity.d on col·locarem les nostres directives personalitzades (l'anomenarem tecmint.conf). b> a l'exemple següent) en lloc de modificar directament els fitxers CRS. Fer-ho permetrà actualitzar més fàcilment els CRS a mesura que es publiquin noves versions.

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

Podeu consultar el repositori GitHub de ModSecurity de SpiderLabs per obtenir una guia explicativa completa de les directives de configuració de mod_security.

Pas 4: Configuració de Mod_Evasive

mod_evasive es configura mitjançant directives a /etc/httpd/conf.d/mod_evasive.conf. Com que no hi ha regles per actualitzar durant l'actualització d'un paquet, no necessitem un fitxer separat per afegir directives personalitzades, a diferència de mod_security.

El fitxer mod_evasive.conf predeterminat té les directives següents habilitades (tingueu en compte que aquest fitxer està molt comentat, de manera que hem eliminat els comentaris per destacar les directives de configuració a continuació):

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

Explicació de les directrius:

  • DOSHashTableSize: aquesta directiva especifica la mida de la taula hash que s'utilitza per fer un seguiment de l'activitat per adreça IP. Augmentar aquest nombre proporcionarà una cerca més ràpida dels llocs que el client ha visitat en el passat, però pot afectar el rendiment general si s'estableix massa alt.
  • DOSPageCount: nombre legítim de sol·licituds idèntiques a un URI específic (per exemple, qualsevol fitxer que està servint Apache) que pot fer un visitant durant l'interval DOSPageInterval.
  • DOSSiteCount: semblant a DOSPageCount, però fa referència a quantes sol·licituds generals es poden fer a tot el lloc durant l'interval DOSSiteInterval.
  • DOSBlockingPeriod: si un visitant supera els límits establerts per DOSSPageCount o DOSSiteCount, la seva adreça IP d'origen es posarà a la llista negra durant el període de temps DOSBlockingPeriod. Durant el període DOSBlocking, qualsevol sol·licitud procedent d'aquesta adreça IP trobarà un error 403 prohibit.

No dubteu a experimentar amb aquests valors perquè el vostre servidor web pugui gestionar la quantitat i el tipus de trànsit necessaris.

Només una petita advertència: si aquests valors no s'estableixen correctament, corre el risc d'acabar bloquejant els visitants legítims.

És possible que també vulgueu considerar altres directrius útils:

Si teniu un servidor de correu en funcionament, podeu enviar missatges d'advertència mitjançant Apache. Tingueu en compte que haureu de concedir permís a l'usuari apache SELinux per enviar correus electrònics si SELinux està configurat per fer complir. Ho pots fer corrent

# setsebool -P httpd_can_sendmail 1

A continuació, afegiu aquesta directiva al fitxer mod_evasive.conf amb la resta de les altres directives:

DOSEmailNotify [email 

Si s'estableix aquest valor i el vostre servidor de correu funciona correctament, s'enviarà un correu electrònic a l'adreça especificada sempre que una adreça IP s'incorpori a la llista negra.

Això necessita una comanda del sistema vàlida com a argument,

DOSSystemCommand </command>

Aquesta directiva especifica una ordre que s'ha d'executar sempre que una adreça IP passa a la llista negra. Sovint s'utilitza juntament amb un script d'intèrpret d'ordres que afegeix una regla de tallafoc per bloquejar més connexions procedents d'aquesta adreça IP.

Quan una adreça IP passa a la llista negra, hem de bloquejar les connexions futures que en vinguin. Utilitzarem el següent script de shell que realitza aquesta feina. Creeu un directori anomenat scripts-tecmint (o el nom que vulgueu) a /usr/local/bin i un fitxer anomenat ban_ip.sh en aquest directori.

#!/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"

La nostra directiva DOSSystemCommand hauria de llegir el següent:

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

A la línia anterior, %s representa l'IP ofensiva detectada per mod_evasive.

Tingueu en compte que tot això no funcionarà tret que doneu permisos a l'usuari apache per executar el nostre script (i només aquest script!) sense terminal i contrasenya. Com és habitual, només podeu escriure visudo com a root per accedir al fitxer /etc/sudoers i després afegir les dues línies següents, tal com es mostra a la imatge següent:

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

IMPORTANT: com a política de seguretat predeterminada, només podeu executar sudo en un terminal. Com que en aquest cas, hem d'utilitzar sudo sense un tty, hem de comentar la línia que es destaca a la imatge següent:

#Defaults requiretty

Finalment, reinicieu el servidor web:

# systemctl restart httpd

Pas 4: simulació d'atacs DDoS a Apache

Hi ha diverses eines que podeu utilitzar per simular un atac extern al vostre servidor. Només podeu cercar a Google \eines per simular atacs ddos per trobar-ne diverses.

Tingueu en compte que vostè, i només vostè, serà responsable dels resultats de la seva simulació. No us penseu ni a llançar un atac simulat a un servidor que no esteu allotjant a la vostra pròpia xarxa.

Si voleu fer el mateix amb un VPS allotjat per algú altre, heu d'advertir adequadament el vostre proveïdor d'allotjament o demanar permís perquè aquesta inundació de trànsit passi per les seves xarxes. linux-console.net no és, de cap manera, responsable dels vostres actes!

A més, llançar un atac DoS simulat des d'un sol host no representa un atac de la vida real. Per simular-ho, hauríeu d'orientar el vostre servidor des de diversos clients alhora.

El nostre entorn de prova està format per un servidor CentOS 7 [IP 192.168.0.17] i un amfitrió Windows des del qual llançarem l'atac [IP 192.168.0.103]:

Si us plau, reproduïu el vídeo següent i seguiu els passos descrits en l'ordre indicat per simular un atac DoS senzill:

Aleshores, iptables bloqueja la IP ofensiva:

Conclusió

Amb mod_security i mod_evasive activats, l'atac simulat fa que la CPU i la RAM experimentin amb un pic d'ús temporal per a només un parell de segons abans que les IP d'origen siguin a la llista negra i bloquejades pel tallafoc. Sense aquestes eines, la simulació segurament enderrocarà el servidor molt ràpidament i el farà inutilitzable durant la durada de l'atac.

Ens agradaria saber si teniu previst utilitzar (o heu utilitzat en el passat) aquestes eines. Sempre esperem rebre notícies vostres, així que no dubteu a deixar els vostres comentaris i preguntes, si n'hi ha, mitjançant el formulari següent.

Enllaços de referència