(vedi anche parte 1)
Ban manuale indirizzi IP
Tutto è iniziato in ottobre 2024 con Meta. Per quanto fossimo sorpresi (forse nemmeno più di tanto, in realtà) che un’azienda con una certa reputazione nell’ambiente informatico, potesse mettersi a fare simili cose, tale comportamento non era per niente accettabile. Perciò, non ci abbiamo pensato due volte a bannare tutti i loro indirizzi IP.
Adesso non è più possibile nemmeno vedere l’anteprima del sito del GOLEM quando si condivide un post su Facebook o Instagram, ma ce ne siamo fatti una ragione (e forse, tutto sommato, non c’è voluto nemmeno molto).
Hack con fail2ban
In questo marasma, alcuni bot comunque continuano ad essere del tipo tradizionale, e si collegano da un ristretto numero di indirizzi IP (o addirittura da uno soltanto), perciò, c’è ragione di credere che questi bot appartengano ad altre piccole entità o singoli individui, come Università, piccoli enti di ricerca, e singoli individui.
Tuttavia, se prima potevamo trascurare questi maleducati occasionali, visto che adesso bisogna cercare di ripararsi da più fronti possibili, noi li banneremo, e loro si dovranno adeguare, banalmente aumentando l’intervallo di tempo che intercorre tra una richiesta e l’altra. Il lato positivo di questi bot è che sono facilmente individuabili da un sistema automatico, come qualsiasi proxy web, e come fail2ban.
fail2ban è uno strumento che tiene sotto controllo i log di un servizio, e se rileva troppi accessi falliti in un breve lasso di tempo, aggiunge una regola al firewall, in modo tale da bloccare il malintenzionato. L’obiettivo di fail2ban è di proteggere alcuni servizi, come ssh, da attacchi dizionario ed esaustivi, non da denial of service.
La sua protezione infatti entra in azione:
- solo quando viene rilevato un tentativo di accesso fallito
- solo quando più accessi fallimentari provengono dallo stesso indirizzo IP
Pur non essendo lo strumento più adatto a proteggersi dalla situazione di DDoS precedentemente descritta, fail2ban può essere configurato a piacere per proteggersi almeno da una sottocategoria di attacchi DoS. In particolare è possibile:
- specificare un’espressione regolare personalizzata, per riconoscere situazioni problematiche a piacimento. Per esempio, un accesso a una pagina HTML statica in
/assetsè ben diverso dall’accesso di un endpoint dispendioso del tipo/git/blame/hash-del-commit, per cui si può fare in modo che fail2ban consideri problematici accessi temporalmente ravvicinati a URL del secondo tipo. - la regola di ban può essere estesa per comprendere più del solo IP malevolo, per esempio per bannare a prescindere tutta una sottorete a cui appartiene, grande a scelta (es. tutta una
/16). Si tratta di una sorta di brutale pesca a strascico, che potrebbe accidentalmente coinvolgere anche utenti legittimi, ma è efficace e, come vedremo presto, comunque nessun sistema che abbiamo provato è completamente immune da effetti collaterali.
In linea di massima, un simile sistema, ad esempio per Gitea, può essere imbastito nel seguente modo (da affinare).
- Aggiungere una regola di fallimento personalizzata che identifichi gli IP dannosi, a gruppi di 64k per volta, nel log di gitea:
# /etc/fail2ban/filter.d/gitea-crawler.local
[Definition]
failregex = router: completed GET .* for <F-ID>\d+\.\d+</F-ID>\.\d+.\d+:
- Bannare l’intera sottorete
/16che circonda l’IP malevolo, arrotondato al blocco. (come dicevo, la tecnica va affinata)
# /etc/fail2ban/action.d/nftables-subnet.local
[INCLUDES]
before = nftables-allports.conf
[Definition]
actionban = <nftables> add element <table_family> <table> <addr_set> \{ <F-ID>.0.0/16 \}
actionunban = <nftables> delete element <table_family> <table> <addr_set> \{ <F-ID>.0.0/16 \}
Questo sistema ha attenuato il problema, ma era chiaro fin da subito che non era la soluzione. I bot più sofisticati e più forniti di risorse, in poco tempo sono diventati in grado di eluderla, cambiando dinamicamente la sottorete di indirizzi IP di provenienza, oppure, semplicemente spalmando le richieste su un numero di indirizzi IP esageratamente più grande, risorsa che solo Stati e grandi multinazionali possono permettersi.
fail2ban on steroids
Ciò che ci serviva era uno strumento come fail2ban, ma che fosse in grado di aggregare le richieste non solo per un indirizzo IP, ma per una intera sottorete, però in modo un po’ più furbo.
Ci è dunque venuto in mente di sfruttare il servizio whois. Tramite protocollo whois è possibile recuperare informazioni circa il proprietario di un determinato indirizzo IP, almeno in forma aggregata, e, di nuovo, un po’ approssimativa. Non solo: è anche possibile sapere quanto è grande la sua sottorete.
Per esempio, effettuando una richiesta whois sull’indirizzo IP di questo sito, si ottengono le seguenti utili informazioni:
$ whois 152.228.140.73
[...]
NetRange: 152.228.128.0 - 152.228.255.255
CIDR: 152.228.128.0/17
OrgName: RIPE Network Coordination Centre
Entities: OVH SAS
Country: FR
[...]
In questo modo, bannando l’intera sottorete, è possibile difendersi in maniera molto più efficace da attacchi provenienti non da un singolo, ma da un’entità che gestisce interi datacenter. Il rovescio della medaglia è che, così facendo, si rischia di bannare anche utenti legittimi, che magari hanno solo affittato una macchina virtuale in quel datacenter, ignari delle cattive intenzioni dei vicini di cui si sono circondati.
Inoltre, whois presenta numerosi problemi, che lo rendono uno strumento tutto sommato inefficace.
- età: la prima versione di
whoisè di poco successiva al 1980, ed è un protocollo che è invecchiato piuttosto male. Abbiamo dato un’occhiata al suo successore RDAP, ma nel mentre abbiamo capito che, ancora una volta, stavamo affrontando il problema nel modo sbagliato. - human readable: l’output di
whoisè facilmente interpretabile da un essere umano, ma molto difficilmente da una macchina: record di testo liberi, incongruenza tra i vari registri, … - aggregazione: alcuni registri mostrano le informazioni
whoisin modo molto aggregato, tanto che un solo record può contenere spazi di indirizzamento enormi, grandi come interi Stati. - IPv6: i registri IPv4 sono piuttosto inconsistenti e presentano lacune: quelli IPv6, lasciamo perdere.
Perciò, dopo un breve esperimento, si è optato per vie alternative.
(segue parte 3)

