Vai al contenuto

Impostazioni cookie

Scelga per ogni tipo quali cookie consente. Può modificare la sua scelta in qualsiasi momento tramite Impostazioni cookie in fondo a ogni pagina. Informativa sulla privacy

Necessari

Sempre attivi

Servono per accedere, conservare il carrello e ricordare le sue scelte. Sono sempre attivi.

Quali cookie?
  • weboke_sessie, weboke_klant, weboke_remember: la sua sessione e la permanenza dell'accesso
  • weboke_basket: il suo carrello
  • wkBtwIncl: visualizzazione dei prezzi con o senza IVA
  • wok_cookies: la sua scelta sui cookie, 12 mesi

Misurano quale annuncio porta a una visita o a un ordine, così non paghiamo annunci che non funzionano.

Quali cookie?
  • Google Ads tramite Google Tag Manager (_gcl_au, _gcl_aw), fino a 90 giorni
  • OpenAI Ads, annunci in ChatGPT
  • wok_aff: tramite quale partner è arrivato da noi (programma di affiliazione), 60 giorni

4,6

Paese e lingua

Ogni paese ha il suo sito, con i prezzi e l'IVA di quel paese.

Vedi

fail2ban contro i tentativi di indovinare le password

Modulo 5: Proteggere la rete · Tempo di lettura: 10 minuti

Obiettivo della lezione: Al termine di questa lezione Lei saprà configurare fail2ban per SSH, leggerne lo stato e il log, sbloccare di nuovo un indirizzo e spiegare che cosa fail2ban protegge e che cosa no.

Concetti chiave: brute force, jail, filtro, azione (banaction), maxretry, findtime, bantime, bantime.increment, ignoreip, backend systemd, jail.conf, jail.local e jail.d, fail2ban-client, recidive

Chi bussa alle porte di internet

Se guarda il log di SSH un giorno dopo l'installazione, lo vedrà subito: centinaia di tentativi di accesso, con nomi come root, admin, test, ubuntu e oracle, da indirizzi di tutto il mondo.

anna@web1:~$ sudo journalctl -u ssh --since today | grep -c "Invalid user"
412
anna@web1:~$ sudo journalctl -u ssh --since today | grep "Invalid user" | tail -n 3
nov 09 14:02:11 web1 sshd-session[20311]: Invalid user admin from 203.0.113.77 port 51522
nov 09 14:02:13 web1 sshd-session[20313]: Invalid user oracle from 203.0.113.77 port 51544
nov 09 14:02:16 web1 sshd-session[20315]: Invalid user test from 203.0.113.77 port 51560

(Su Ubuntu il servizio si chiama ssh, su AlmaLinux e Rocky sshd. Il nome del processo può essere sshd o sshd-session, a seconda della versione di OpenSSH.) Questo è un attacco brute force: bot che provano semplicemente tutti i nomi utente e le password più comuni. Con l'accesso tramite chiavi e il login con password disattivato (lezione 2.2) non entreranno mai, per quante volte ci provino. Però riempiono il Suo log, consumano un po' di potenza di calcolo e, sui servizi in cui serve comunque una password (una webmail, un pannello di gestione), possono essere davvero pericolosi.

fail2ban legge i log, riconosce i tentativi falliti e blocca per un certo tempo nel firewall un indirizzo che fallisce troppe volte.

Come ragiona fail2ban: le jail

fail2ban lavora con le jail (celle). Una jail combina tre elementi:

  • un filtro: espressioni regolari che riconoscono in un log i tentativi falliti (per esempio la riga "Invalid user ... from <adres>");
  • un'azione: ciò che succede quando i tentativi sono troppi, di solito una regola del firewall che blocca l'indirizzo (banaction, su Debian 13 per impostazione predefinita tramite nftables);
  • le soglie: quanti tentativi falliti (maxretry) entro quale intervallo di tempo (findtime) portano a un blocco di quale durata (bantime).

I valori predefiniti di jail.conf sono: maxretry = 5, findtime = 10m, bantime = 10m. Quindi: cinque tentativi falliti entro dieci minuti comportano dieci minuti di blocco.

Installazione e la trappola di Debian 12

anna@web1:~$ sudo apt install fail2ban
anna@web1:~$ sudo systemctl status fail2ban

Su Debian e Ubuntu la jail per SSH ([sshd]) è già attiva dopo l'installazione, tramite il file /etc/fail2ban/jail.d/defaults-debian.conf.

C'è una trappola nota. fail2ban deve sapere dove si trova il log. In passato era il file di testo /var/log/auth.log. Da Debian 12 rsyslog non viene più installato per impostazione predefinita e i messaggi si trovano solo nel journal di systemd (lezione 6.2). Il pacchetto fail2ban di Debian 12 cercava ancora /var/log/auth.log, non lo trovava e non si avviava. Debian 13 ha risolto il problema impostando backend = systemd per SSH in defaults-debian.conf. Su Debian 12 lo risolve Lei stesso (vedi sotto) facendo la stessa cosa. Ubuntu ha ancora rsyslog per impostazione predefinita, ma anche lì backend = systemd funziona.

Le Sue impostazioni: jail.local

Non modifichi mai jail.conf: quel file viene sostituito a ogni aggiornamento. Inserisca le Sue impostazioni in /etc/fail2ban/jail.local oppure in un file in /etc/fail2ban/jail.d/ con l'estensione .local:

# /etc/fail2ban/jail.d/eigen.local
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5
bantime.increment = true
ignoreip = 127.0.0.1/8 ::1 198.51.100.20

[sshd]
enabled = true
backend = systemd

Che cosa fanno le righe:

  • bantime = 1h: un'ora di blocco invece di dieci minuti.
  • bantime.increment = true: chi ritorna dopo un blocco riceve ogni volta un blocco più lungo.
  • ignoreip: indirizzi che non vengono mai bloccati. Inserisca qui l'indirizzo IP fisso del Suo ufficio, se ne ha uno. Non inserisca qui grandi intervalli di indirizzi "per sicurezza".
  • backend = systemd: legge il journal invece di un file di testo (necessario su Debian 12, consigliato ovunque). Per questo deve essere installato il pacchetto python3-systemd; di solito lo è già come dipendenza.

Ricaricare e verificare:

anna@web1:~$ sudo fail2ban-client -t            # testare la configurazione
OK: configuration test is successful
anna@web1:~$ sudo systemctl reload fail2ban
anna@web1:~$ sudo fail2ban-client status
Status
|- Number of jail:      1
`- Jail list:   sshd

Leggere lo stato, bannare e sbloccare

anna@web1:~$ sudo fail2ban-client status sshd
Status for the jail: sshd
|- Filter
|  |- Currently failed: 3
|  |- Total failed:     1288
|  `- Journal matches:  _SYSTEMD_UNIT=ssh.service + _COMM=sshd
`- Actions
   |- Currently banned: 2
   |- Total banned:     117
   `- Banned IP list:   203.0.113.77 198.51.100.140

"Currently failed" indica gli indirizzi che hanno già fatto dei tentativi ma non hanno ancora superato la soglia. "Currently banned" indica gli indirizzi bloccati in questo momento.

Se si è bloccato da solo (per esempio provando un paio di volte con la chiave o il nome utente sbagliati), acceda tramite un'altra rete o tramite la console e sblocchi il Suo indirizzo:

anna@web1:~$ sudo fail2ban-client set sshd unbanip 198.51.100.20

Il log di fail2ban stesso si trova in /var/log/fail2ban.log e mostra quando un indirizzo è stato bloccato e quando sbloccato:

2026-11-09 14:02:16,903 fail2ban.actions [811]: NOTICE  [sshd] Ban 203.0.113.77
2026-11-09 15:02:17,120 fail2ban.actions [811]: NOTICE  [sshd] Unban 203.0.113.77

I recidivi: recidive

Alcuni bot tornano semplicemente dopo ogni blocco. Per questo esistono due strumenti. bantime.increment (vedi sopra) rende il blocco ogni volta più lungo. Inoltre c'è la jail recidive: legge il log di fail2ban stesso e blocca per una settimana, su tutte le porte, un indirizzo che è stato bloccato spesso nell'arco di un giorno. Per attivarla nel Suo file .local:

[recidive]
enabled = true

Che cosa fa e che cosa non fa fail2ban

fail2ban è utile, ma non è la serratura della porta. La serratura è l'accesso con una chiave, con le password disattivate (lezione 2.2). Per questo è bene sapere anche che cosa fail2ban non può fare:

  • Un attacco distribuito da migliaia di indirizzi, ciascuno con uno o due tentativi, non supera mai maxretry.
  • Una password debole resta debole. fail2ban rallenta i tentativi di indovinarla, niente di più.
  • Solo ciò che compare in un log: un servizio che non registra i tentativi falliti, o un log che fail2ban non legge, sfugge al suo controllo.
  • Docker: i blocchi nella normale catena del firewall non valgono per le porte pubblicate dei container (lezione 9.3). Per i servizi nei container serve un'impostazione a parte (azione sulla catena DOCKER-USER).

Ciò che fail2ban fa bene: mantenere tranquillo il log, ridurre il carico causato dai bot e proteggere i servizi in cui usa (ancora) password, come una webmail o un pannello di gestione. Per questi servizi esistono filtri per nginx, Postfix, Dovecot e molti altri.

Su AlmaLinux e Rocky Linux

Lì fail2ban proviene da EPEL: dnf install epel-release e poi dnf install fail2ban. Il pacchetto fail2ban installa anche l'integrazione con firewalld. Il servizio SSH si chiama sshd. Attivi la jail Lei stesso in un file .local; a differenza di Debian, non è attiva automaticamente.

Riepilogo

  • I bot provano ad accedere tutto il giorno; con le chiavi e il login con password disattivato non entrano, e fail2ban li tiene in più a distanza.
  • Una jail è filtro + azione + soglie (maxretry, findtime, bantime); per impostazione predefinita 5 tentativi in 10 minuti, 10 minuti di blocco.
  • Le impostazioni proprie vanno in jail.local o jail.d/*.local, mai in jail.conf; usi backend = systemd (necessario su Debian 12).
  • fail2ban-client status sshd mostra gli indirizzi bannati, set sshd unbanip li sblocca; recidive e bantime.increment si occupano dei recidivi.
  • fail2ban non ferma attacchi distribuiti né password deboli e non vede da solo le porte di Docker.

Quiz

1. Ha installato fail2ban su Debian 12 e non si avvia, con il messaggio che non esiste un file di log per la jail sshd. Qual è la causa?



2. Perché si inseriscono le impostazioni in jail.local e non in jail.conf?



3. Le impostazioni predefinite sono maxretry = 5, findtime = 10m, bantime = 10m. Un indirizzo fa un tentativo fallito alle 14:00, 14:03, 14:05, 14:08 e 14:09. Che cosa succede?



4. Il Suo server riceve ogni giorno migliaia di tentativi di accesso, distribuiti su decine di migliaia di indirizzi, ciascuno con un solo tentativo. Che cosa fa fail2ban contro questo?



5. Si è bloccato da solo digitando un paio di volte il nome utente sbagliato. Qual è la soluzione corretta?



Esercizio

Esercizio Z5.3: Leggere un log di intrusione. Il file di esempio ssh-journal-1.txt contiene un estratto del journal di un server SSH con fail2ban, più l'output di fail2ban-client status sshd. Risponda: quale indirizzo ha provato più nomi utente, quale indirizzo è riuscito ad accedere con una chiave e con quale utente, quale indirizzo è stato bannato e a che ora, e quell'indirizzo sarebbe stato bannato anche con le impostazioni predefinite (maxretry = 5, findtime = 10m)? Il programma confronta le risposte con la soluzione fissa. Se ha un server proprio con fail2ban, controlli lì anche fail2ban-client status sshd.

Esercizio Z5.3: Leggere un log di intrusione

File relativo a questo esercizio: ssh-journal-1.txt








Quello che inserisce e quello che rileviamo non vengono salvati. Il Suo browser ricorda le Sue risposte e se ha superato l'esercizio. Se ha effettuato l'accesso, conserviamo in I miei corsi solo il fatto che l'esercizio era (quasi) corretto; anche lì può eliminarlo.

Per approfondire

Un momento…

Configuri i suoi domini

Per ogni dominio imposti i nameserver, il collegamento al suo hosting e chi ne diventa l'intestatario.

Caricamento dei suoi domini…