Combattere gli attacchi brute force

Così tanti cattivoni in giro. Paranoia dite? Beh, date un’occhiata al vostro mail.log. Mentre preparavo questa guida potevo a malapena seguirla. Il server di posta usato per i test non era assolutamente pronto ma già ricevevo visite da un mucchio di indirizzi IP cinesi che cercavano di indovinare gli account degli utenti email. Queste canaglie scansionano costantemente internet per i server di posta e non si stancano mai di cercare un modo per abusarne. Facciamo qualcosa a riguardo prima che indovinino gli account email con successo.

Schemi di attacchi

C’era uno schema che mi è saltato all’occhio:

Jan 24 23:59:34 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242]
Jan 24 23:59:35 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242]
Jan 24 23:59:36 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242]
Jan 24 23:59:37 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242]
Jan 24 23:59:38 jen postfix/smtpd[31879]: lost connection after AUTH from unknown[122.231.43.242]

Qualche sistema cinese sta cercando ripetutamente di autenticarsi sul mio Postfix. E che ci crediate o meno – lo stava facendo per giorni. Il mio file log è cresciuto di 500 MB al giorno solo per questi cazzoni. Mettiamo la parola fine a questa farsa.

Installazione

Un pezzo di software che installa sui server per questo scopo è fail2ban. Installiamolo sul server:

apt install fail2ban

Conosce molti schemi nei file di log che riportano qualcosa di dannoso. Il software gira in background e segue vari file di log. Ogni nuova linea nel log è confrontata con espressioni regolari. Se viene trovata un corrispondenza, blocca l’indirizzo IP menzionato nel log.

Aggiungere un filtro

Siccome fail2ban non sa che “lost connection after AUTH” non va bene, dobbiamo aggiungere questo schema. Creiamo un nuovo file /etc/fail2ban/filter.d/postfix-ispmail.conf con questo contenuto:

[INCLUDES]
before = common.conf
[Definition]
_daemon = postfix(-w+)?/(?:submission/|smtps/)?smtp[ds]
failregex = ^%(__prefix_line)slost connection after AUTH from S+[]$
ignoreregex =
[Init]
journalmatch = _SYSTEMD_UNIT=postfix.service

Questo definisce un nuovo filtro chiamato “postfix-ispmail”. Il nome deriva dal nome del filtro. La linea importante è failregex. Descrive una espressione regolare – una descrizione leggibile dalla macchina su cosa stiamo cercando. %(…)s espande una variabile. E __prefix_line è uno schema che descrive la parte sinistra di ogni linea del log: “Jan 25 00:32:01 jen postfix/smtpd[32600]: “. La parte “postfix/smtpd” è definita dalla variabile _daemon. “S+” significa che qui ci aspettiamo uno o più caratteri che non sono spazi. Le parentesi quadre vanno indicate con la barra inversa perché hanno un significato speciale nelle espressioni regolari. E <HOST> è uno schema integrato di fail2ban che sta per un indirizzo IP. Dovreste prendere dimestichezza con le espressioni regolari anche se possono intimidire all’inizio. In realtà sono più potenti che spaventose. 🙂

Aggiungere una jail

fail2ban può ora capire lo schema che stiamo cercando. Ma dove guardiamo? E cosa facciamo se troviamo una corrispondenza? Questo è il nostro prossimo compito. Creiamo un altro file /etc/fail2ban/jail.d/postfix-ispmail.conf con questo contenuto:

[postfix-ispmail]
logpath = %(syslog_mail)s
enabled = true
port = smtp,submission
  • La prima linea si riferisce al nome del filtro. Abbiamo chiamato il filtro “postfix-ispmail.conf”, quindi questo è il nome del filtro (il “.conf” è ignorato).
  • Il file log che vogliamo seguire è definito nella variabile syslog_mail definita altrove (nel file paths-debian.conf). Punta a /var/log/mail.log.
  • Vogliamo rendere questa jail enabled perché di default è disabilitata in /etc/fail2ban/jail.conf.
  • Infine definiamo quali porte di rete bloccare per fermare l’aggressore.

Facciamolo

Tempo di agire. Riavviamo fail2ban per caricare le modifiche della configurazione:

service fail2ban restart

Per vedere cosa fail2ban ha fatto guardiamo in /var/log/fail2ban.log. Nel mio caso c’è:

2018-01-24 23:59:34,443 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242
2018-01-24 23:59:35,430 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242
2018-01-24 23:59:36,434 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242
2018-01-24 23:59:37,427 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242
2018-01-24 23:59:38,413 fail2ban.filter [32003]: INFO [postfix-ispmail] Found 122.231.43.242
2018-01-24 23:59:38,781 fail2ban.actions [32003]: NOTICE [postfix-ispmail] Ban 122.231.43.242

Ha trovato la linea “lost connection after AUTH” indicando quell’indirizzo IP cinese cinque volte e ha deciso di bannarlo. La ragione è nella configurazione in /etc/fail2ban/jail.conf:

# “bantime” is the number of seconds that a host is banned.
bantime = 600
# A host is banned if it has generated “maxretry” during the last “findtime”
# seconds.
findtime = 600
# “maxretry” is the number of failures before a host get banned.
maxretry = 5

Quindi di default se questo schema malvagio capita almeno maxretry volte entro findtime secondi l’IP verrà bannato per bantime secondi. E’ possibile personalizzare questi valori ma non editate jail.conf. Invece create il file jail.local dome descritto in “man 5 jail.conf”.

La magia del bannare

Vi chiedete come funziona il ban? fail2ban aggiunge nuove regole al nostro firewall usando iptables. La lista delle attuali regole di iptables può essere vista usando…

iptables -nvL

Mostrerà le regole del firewall. fail2ban crea una nuova catena per ogni jail che configurate. Ho chiamato la mia jail “ispmail-postfix” quindi le mie regole sono così:

Chain f2b-postfix-ispmail (1 references)
pkts bytes target prot opt in out source destination
3 152 REJECT all -- * * 125.106.22.171 …
22 972 REJECT all -- * * 115.213.146.75 …
3 152 REJECT all -- * * 1.195.252.154 …
837 39050 RETURN all -- * * 0.0.0.0/0 0.0.0.0/0

Ma c’è un modo più carino per vedere lo stato attuale di una jail:

fail2ban-client status postfix-ispmail

Mostrerà qualcosa del tipo:

Status for the jail: postfix-ispmail
|- Filter
| |- Currently failed: 1
| |- Total failed: 168
| `- File list: /var/log/mail.log
`- Actions
|- Currently banned: 14
|- Total banned: 36
`- Banned IP list: 1.199.191.44 125.106.250.51 115.213.233.184 …

Più jail

Potreste voler dare un’occhiata ai filtri predefiniti in /etc/fail2ban/jail.conf o nei file in /etc/fail2ban/filter.d/. Di default solo il filtro “sshd” è attivato in /etc/fail2ban/jail.d/defaults-debian.conf. Ma non esitate ad aggiungere file per abilitare…

  • dovecot
  • postfix
  • postfix-sasl
  • roundcube-auth

Questo porrà fine agli attacchi brute force una volta per sempre. Curiosità: due giorni dopo aver scritto questo avevo già bannato 1645 indirizzi IP.

Altri schemi?
Se saltano fuori più schemi che fail2ban non conosce ancora li aggiungerò. Ne avete trovato qualcuno?

Supporto IPv6

Molti ISP supportano IPv6 oggigiorno. Sfortunatamente la versione di fail2ban in Debian Stretch no. Il supporto a IPv6 è stato aggiunto nella versione 0.10 ma ora c’è la versione 0.9.6. Non c’è un backport ufficiale della nuova versione al momento. Ma almeno posso offrirvi un veloce backport cosicché possiate usare la versione 0.10 in Debian Stretch.

Download fail2ban_0.10.2-1_all.deb

Installatelo usando…

dpkg -i fail2ban_0.10.2-1_all.deb

…e assicuratevi che tutte le dipendenze mancanti siano installate…

apt -f install

Ora fail2ban sarà in grado di bloccare gli indirizzi IPv6.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *