Fail2ban è uno strumento di sicurezza versatile. Sebbene sia utilizzato principalmente per prevenire attacchi di forza bruta contro SSH, può essere utilizzato anche per proteggere altri servizi.
Esistono bot che scansionano Internet e inviano migliaia di richieste ai server Web nella speranza di trovare vulnerabilità. Questo post riguarda il blocco di tali bot con Fail2ban.
Assumiamo che tu stia utilizzando Apache come server web. Tuttavia, queste istruzioni possono essere facilmente personalizzate per nginx o qualsiasi altro server web.
Tuttavia, tieni presente che Fail2ban non è un firewall per applicazioni Web (WAF) e non può bloccare le richieste dannose se passano. Questo perché fail2ban interviene monitorando i log; Pertanto, prima che Fail2ban possa intraprendere qualsiasi azione, deve essere registrato almeno un tentativo dannoso.
Cos'è comunque un bot cattivo?
In questo post, ci concentreremo sul blocco dei bot che eseguono una delle seguenti operazioni:
- Cerca nel sito Web un proxy aperto
- Invia una richiesta GET con parametri che. contengono payload SQL injection
- Invia una richiesta GET con parametri che. contengono carichi utili di nevrosi
Ovviamente puoi bloccare anche altri tipi di attacchi. Tuttavia, ci limitiamo ai tre casi sopra menzionati per questo articolo.
Installa Fail2ban
Fail2ban è disponibile nel repository della maggior parte delle distribuzioni.
Per installarlo su Debian / Ubuntu esegui:
sudo apt-get update sudo apt-get install fail2ban
Sotto CentOS dovresti prima usare il repository EPEL; Quindi dovresti attivarlo e avviarlo.
sudo yum -y install epel-release sudo yum -y install fail2ban sudo systemctl enable fail2ban sudo systemctl start fail2ban
Nozioni di base su Fail2ban
Al centro del meccanismo di lavoro di Fail2ban ci sono un certo numero di prigioni. In poche parole, una jail istruisce Fail2ban a guardare un certo numero di log e ad applicarvi un filtro ogni volta che il log cambia. Se il numero di corrispondenze per il filtro è uguale al numero massimo di corrispondenze consentite dalla jail, viene eseguita un'azione specificata nella jail.
Quindi devi definire due cose:un filtro e una prigione. La jail è configurata per esaminare i log di Apache alla ricerca di richieste dannose.
Definisci filtri
Un filtro è semplicemente una raccolta di espressioni regolari Python che vengono verificate rispetto a un registro. Qui dovremmo definire filtri per i criteri sopra descritti.
Ma diamo prima un'occhiata a una voce nei log di Apache:
66.249.79.189 - - [17/Jan/2017:14:10:41 +0000] "GET /robots.txt HTTP/1.1" 200 3494 "-" "Mozilla/5.0 (compatible; Googlebot/2.1; +https: //www.google.com/bot.html)"
Si noti che l'intestazione della richiesta GET /robots.txt HTTP/1.1
è tra virgolette doppie. Se si progettano tali regole da soli, è necessario prestare sufficiente attenzione per garantire che solo l'intestazione della richiesta corrisponda. In caso contrario, rischi di bloccare gli utenti legittimi.
I payload di SQL injection generalmente contengono stringhe del formato union select(...)
o select concat (...)
. Quindi puoi provare a far corrispondere questo modello con la seguente espressione regolare:
(?i)^<HOST> -.*"[^"]+(?:union[^"]+select[^"]*|select[^"]+concat[^"]*)(?:%%2[8C]|[,(])
il <HOST>
La parte definisce la posizione dell'indirizzo IP nella voce di registro e il (?i)
indica che l'espressione regolare non fa distinzione tra maiuscole e minuscole.
il [^"]
nella regex assicura che il testo corrispondente sia racchiuso tra virgolette. Ciò garantisce che l'espressione regolare corrisponda solo all'intestazione della richiesta e nient'altro. il (?:%%2[8C]|[,(])
indica che il union select
o select concat
segue di conseguenza una virgola (,
) o una parentesi ((
), direttamente o nella loro forma codificata in percentuale.
Spesso i bot che cercano proxy aperti inviano richieste sotto forma di:
101.33.59.9 - - [17/Jan/2017:14:10:41 +0000] "GET https://google.com/ HTTP/1.1" 400 3494 "-" "Mozilla" 101.33.59.9 - - [17/Jan/2017:14:10:44 +0000] "CONNECT yahoo.com:80" 400 3499 "-" "Mozilla"
Un'espressione regolare come la seguente può facilmente corrispondere a queste:
(?i)^<HOST> -.*"(?:(?:GET|POST|HEAD) https?:|CONNECT [a-z0-9.-]+:[0-9]+)
L'espressione regolare (?:(?:GET|POST|HEAD) https?:
soddisfa i requisiti del primo tipo, mentre l'espressione regolare CONNECT [a-z0-9.-]+:[0-9]+
soddisfa i requisiti del secondo tipo.
I bot che scansionano Shellshock spesso inviano richieste come:
10.11.12.13 - - [17/Jan/2016:16:00:00 +0000] "GET /cgi-bin/printenv.cgi HTTP/1.0" 200 1 "-" "() { test;};echo "Content-type: text/plain"; echo; echo; /bin/rm -rf /var/www/"
Un'espressione regolare come questa corrisponde al modello di Shellshock:
<HOST> -.*"()s*{[^;"]+[^}"]+}s*;
Qui li controlliamo () { <command>; }
Pattern e il s
tiene conto degli spazi che potrebbero essere inclusi nella richiesta dannosa.
Se li combiniamo ora possiamo scrivere il nostro filtro:
[Definition] failregex = <HOST> -.*"()s*{[^;"]+[^}"]+}s*; (?i)^<HOST> -.*"[^"]+(?:union[^"]+select[^"]*|select[^"]+concat[^"]*)(?:%%2[8C]|[,(]) (?i)^<HOST> -.*"(?:(?:GET|POST|HEAD) https?:|CONNECT [a-z0-9.-]+:[0-9]+) ignoreregex =
il ignoreregex
ti consente di inserire nella whitelist gli elementi. Puoi aggiungere espressioni regolari ignorate proprio come è stato fatto per failregex.
Salva il filtro sopra in /etc/fail2ban/filter.d/badbot.local
Definisci la prigione
Ora che hai definito il filtro, è il momento di definire la prigione. Qui blocchiamo l'indirizzo IP per sei minuti se invia tre di queste richieste entro sei minuti.
Aggiungi questo al tuo /etc/fail2ban/jail.local
File:
[badbot] enabled = true port = http,https filter = badbot logpath = /var/log/apache*/*access.log maxretry = 3 banaction = iptables-multiport findtime = 360 bantime = 360
Dopo aver configurato la jail, dovresti riavviare fail2ban affinché queste modifiche abbiano effetto. A seconda della tua distribuzione, per riavviarla sarà necessario uno di questi comandi:
sudo systemctl restart fail2ban sudo service fail2ban restart
fail2ban ora blocca tutti i tentativi di bot dannosi che tentano di attaccare il tuo server web. Puoi estendere queste regole al tuo altro server web o a qualsiasi altro tipo di attacco che potresti vedere.