Zaštitite Apache od Brute Force ili DDoS napada pomoću modula Mod_Security i Mod_evasive


Za one od vas koji se bave hostingom ili ako hostirate vlastite poslužitelje i izlažete ih internetu, zaštita vaših sustava od napadača mora biti visoki prioritet.

mod_security (motor otvorenog koda za otkrivanje i sprječavanje upada za web aplikacije koji se neprimjetno integrira s web poslužiteljem) i mod_evasive su dva vrlo važna alata koja se mogu koristiti za zaštitu web poslužitelja protiv grube sile ili (D)DoS napada.

mod_evasive, kao što mu ime govori, pruža mogućnosti izbjegavanja dok je napadnut, djelujući kao kišobran koji štiti web poslužitelje od takvih prijetnji.

U ovom članku raspravljat ćemo o tome kako ih instalirati, konfigurirati i staviti u igru zajedno s Apacheom na RHEL/CentOS 8 i 7 kao kao i Fedora. Osim toga, simulirati ćemo napade kako bismo potvrdili da poslužitelj reagira u skladu s tim.

Ovo pretpostavlja da na vašem sustavu imate instaliran LAMP poslužitelj. Ako ne, provjerite ovaj članak prije nego što nastavite dalje.

  • Kako instalirati LAMP poslužitelj na CentOS 8
  • Kako instalirati LAMP stack u RHEL/CentOS 7

Također ćete morati postaviti iptables kao zadano sučelje vatrozida umjesto firewallda ako koristite RHEL/CentOS 8/7 ili Fedora. Ovo činimo kako bismo koristili isti alat u RHEL/CentOS 8/7 i Fedora.

Korak 1: Instalacija Iptables vatrozida na RHEL/CentOS 8/7 i Fedora

Za početak zaustavite i onemogućite firewalld:

systemctl stop firewalld
systemctl disable firewalld

Zatim instalirajte paket iptables-services prije nego omogućite iptables:

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

Korak 2: Instaliranje Mod_Security i Mod_evasive

Osim što već imate postavljenu LAMP postavku, također ćete morati omogućiti EPEL repozitorij u RHEL/CentOS 8/7 kako bi za instaliranje oba paketa. Fedora korisnici ne moraju omogućiti nikakav repo jer je epel već dio Fedora projekta.

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

Kada instalacija završi, pronaći ćete konfiguracijske datoteke za oba alata u /etc/httpd/conf.d.

ls -l /etc/httpd/conf.d

Sada, kako biste integrirali ova dva modula s Apacheom i omogućili mu da ih učita kada se pokrene, provjerite pojavljuju li se sljedeći redovi u odjeljku najviše razine mod_evasive.conf odnosno mod_security.conf:

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

Imajte na umu da su modules/mod_security2.so i modules/mod_evasive24.so relativne staze, od direktorija /etc/httpd do izvorne datoteke modula. To možete provjeriti (i promijeniti, ako je potrebno) ispisivanjem sadržaja /etc/httpd/modules direktorija:

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

Zatim ponovno pokrenite Apache i provjerite učitava li mod_evasive i mod_security:

systemctl restart httpd 	

Izbacite popis učitanih statičkih i dijeljenih modula.

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

Korak 3: Instaliranje osnovnog skupa pravila i konfiguriranje Mod_Security

U nekoliko riječi, Core Rule Set (aka CRS) pruža web poslužitelju upute o tome kako se ponašati pod određenim uvjetima. Tvrtka za razvojne programere mod_security nudi besplatni CRS pod nazivom OWASP (Open Web Application Security Project) ModSecurity CRS koji se može preuzeti i instalirati na sljedeći način.

1. Preuzmite OWASP CRS u direktorij stvoren za tu svrhu.

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. Otpakujte CRS datoteku i promijenite naziv direktorija za našu pogodnost.

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

3. Sada je vrijeme da konfigurirate mod_security. Kopirajte oglednu datoteku s pravilima (owasp-modsecurity-crs/modsecurity_crs_10_setup.conf.example) u drugu datoteku bez .example ekstenzije:

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

i recite Apacheu da koristi ovu datoteku zajedno s modulom umetanjem sljedećih redaka u datoteku glavne konfiguracijske datoteke web poslužitelja /etc/httpd/conf/httpd.conf. Ako odlučite raspakirati tarball u drugi direktorij, morat ćete urediti staze slijedeći direktive Uključi:

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

Na kraju, preporučuje se da kreiramo vlastitu konfiguracijsku datoteku unutar direktorija /etc/httpd/modsecurity.d gdje ćemo smjestiti naše prilagođene direktive (nazvat ćemo je tecmint.conf u sljedećem primjeru) umjesto da izravno mijenjate CRS datoteke. Na taj ćete način omogućiti lakšu nadogradnju CRS-ova kako budu izdavane nove verzije.

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

Možete se obratiti SpiderLabsovom ModSecurity GitHub repozitoriju za potpuni vodič s objašnjenjem konfiguracijskih direktiva mod_security.

Korak 4: Konfiguriranje Mod_Evasive

mod_evasive je konfiguriran pomoću direktiva u /etc/httpd/conf.d/mod_evasive.conf. Budući da nema pravila za ažuriranje tijekom nadogradnje paketa, ne trebamo zasebnu datoteku za dodavanje prilagođenih direktiva, za razliku od mod_security.

Zadana datoteka mod_evasive.conf ima omogućene sljedeće direktive (imajte na umu da je ova datoteka jako komentirana, pa smo izbacili komentare kako bismo istaknuli konfiguracijske direktive u nastavku):

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

Objašnjenje direktiva:

  • DOSHashTableSize: Ova direktiva određuje veličinu hash tablice koja se koristi za praćenje aktivnosti na temelju IP adrese. Povećanje ovog broja omogućit će brže traženje stranica koje je klijent posjetio u prošlosti, ali može utjecati na ukupnu izvedbu ako je postavljen previsoko.
  • DOSPageCount: Legitiman broj identičnih zahtjeva za određeni URI (na primjer, bilo koja datoteka koju poslužuje Apache) koje posjetitelj može uputiti tijekom intervala DOSPageInterval.
  • DOSSiteCount: Slično DOSPageCountu, ali se odnosi na koliko se ukupnih zahtjeva može uputiti cijeloj web stranici tijekom DOSSiteInterval intervala.
  • DOSBlockingPeriod: Ako posjetitelj prekorači ograničenja postavljena pomoću DOSSPageCount ili DOSSiteCount, njegova će izvorna IP adresa biti na crnoj listi tijekom DOSBlockingPeriod vremena. Tijekom DOSBlockingPeriod, svi zahtjevi koji dolaze s te IP adrese naići će na pogrešku 403 Forbidden.

Slobodno eksperimentirajte s ovim vrijednostima kako bi vaš web poslužitelj mogao podnijeti potrebnu količinu i vrstu prometa.

Samo malo upozorenje: ako ove vrijednosti nisu ispravno postavljene, riskirate blokiranje legitimnih posjetitelja.

Također biste mogli razmotriti i druge korisne upute:

DOSEmailNotify

Ako imate poslužitelj pošte koji radi, možete slati poruke upozorenja putem Apachea. Imajte na umu da ćete korisniku apache SELinuxa morati dati dopuštenje za slanje e-pošte ako je SELinux postavljen na provođenje. To možete učiniti trčanjem

setsebool -P httpd_can_sendmail 1

Zatim dodajte ovu direktivu u datoteku mod_evasive.conf s ostatkom ostalih direktiva:

DOSEmailNotify [email 

Ako je ova vrijednost postavljena i vaš poslužitelj e-pošte radi ispravno, e-pošta će biti poslana na navedenu adresu kad god neka IP adresa bude na crnoj listi.

DOSSystemCommand

Ovo treba valjanu sistemsku naredbu kao argument,

DOSSystemCommand </command>

Ova direktiva specificira naredbu koja će se izvršiti kad god neka IP adresa bude na crnoj listi. Često se koristi u kombinaciji sa skriptom ljuske koja dodaje pravilo vatrozida za blokiranje daljnjih veza koje dolaze s te IP adrese.

Napišite skriptu ljuske koja obrađuje IP crnu listu na razini vatrozida

Kada se IP adresa nađe na crnoj listi, moramo blokirati buduće veze koje dolaze s nje. Koristit ćemo sljedeću skriptu ljuske koja obavlja ovaj posao. Napravite direktorij pod nazivom scripts-tecmint (ili bilo koji naziv po vašem izboru) u /usr/local/bin i datoteku pod nazivom ban_ip.sh u tom imeniku.

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

Naša bi direktiva DOSSystemCommand trebala glasiti kako slijedi:

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

U retku iznad, %s predstavlja uvredljivi IP kako ga je otkrio mod_evasive.

Dodajte apache korisnika u datoteku sudoers

Imajte na umu da sve ovo jednostavno neće funkcionirati ako korisniku apache ne date dozvole za pokretanje naše skripte (i samo te skripte!) bez terminala i lozinke. Kao i obično, možete jednostavno upisati visudo kao root za pristup datoteci /etc/sudoers i zatim dodati sljedeća 2 retka kao što je prikazano na slici ispod:

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

VAŽNO: Kao zadana sigurnosna politika, sudo možete pokrenuti samo na terminalu. Budući da u ovom slučaju moramo koristiti sudo bez tty, moramo komentirati liniju koja je označena na sljedećoj slici:

#Defaults requiretty

Na kraju ponovno pokrenite web poslužitelj:

systemctl restart httpd

Korak 4: Simulacija DDoS napada na Apache

Postoji nekoliko alata koje možete koristiti za simulaciju vanjskog napada na vaš poslužitelj. Možete samo guglati za “alate za simulaciju ddos napada” da pronađete nekoliko njih.

Imajte na umu da ćete vi, i samo vi, biti odgovorni za rezultate vaše simulacije. Nemojte ni pomišljati na pokretanje simuliranog napada na poslužitelj koji ne hostirate unutar vlastite mreže.

Ako želite učiniti isto s VPS-om koji hostira netko drugi, trebate na odgovarajući način upozoriti svog pružatelja usluga hostinga ili zatražiti dopuštenje da takva poplava prometa prođe kroz njihove mreže. linux-console.net ni na koji način nije odgovoran za vaše postupke!

Osim toga, pokretanje simuliranog DoS napada sa samo jednog hosta ne predstavlja napad u stvarnom životu. Da biste to simulirali, trebali biste ciljati svoj poslužitelj s nekoliko klijenata u isto vrijeme.

Naše testno okruženje sastoji se od poslužitelja CentOS 7 [IP 192.168.0.17] i Windows hosta s kojeg ćemo pokrenuti napad [IP 192.168.0.103]:

Pustite videozapis u nastavku i slijedite korake navedene navedenim redoslijedom za simulaciju jednostavnog DoS napada:

Zatim se IP tablica blokira od strane iptables:

Zaključak

Uz omogućene mod_security i mod_evasive, simulirani napad uzrokuje da CPU i RAM eksperimentiraju s privremenim vršnim korištenjem za samo nekoliko sekundi prije nego što izvorne IP adrese budu stavljene na crnu listu i blokirane od strane vatrozida. Bez ovih alata, simulacija će sigurno vrlo brzo srušiti poslužitelj i učiniti ga neupotrebljivim tijekom trajanja napada.

Voljeli bismo čuti planirate li koristiti (ili ste koristili u prošlosti) ove alate. Uvijek se radujemo što ćemo vam se javiti, stoga ne oklijevajte ostaviti svoje komentare i pitanja, ako ih ima, koristeći obrazac u nastavku.

Referentne veze

https://www.modsecurity.org/