Se gestisci un server Linux, sai che la sicurezza non è opzionale. Ogni giorno, migliaia di bot scansionano la rete alla ricerca di porte aperte, in particolare la porta 22 (SSH), tentando password casuali tramite brute force o dictionary attacks.

Nel nostro articolo precedente abbiamo visto come mettere in sicurezza l'accesso SSH disabilitando le password; oggi copriremo un altro scudo essenziale: Fail2ban.

La procedura copre installazione di Fail2ban, configurazione delle jail e verifica dei ban effettivamente applicati ai servizi esposti.

Cos'è Fail2ban?

Fail2ban è uno strumento di prevenzione delle intrusioni (IPS) scritto in Python.
Il suo compito è scansionare i file di log di sistema (come /var/log/auth.log o /var/log/secure) alla ricerca di pattern che indicano attività sospette, come ripetuti tentativi di login falliti.

Quando rileva un indirizzo IP che ha superato il numero consentito di tentativi, Fail2ban aggiorna le regole del firewall (tipicamente iptables o nftables) per bannare quell'indirizzo per un periodo di tempo prestabilito.

Come funziona

Funziona basandosi su tre concetti chiave:

Filter
Un'espressione regolare (regex) che identifica i tentativi di intrusione nei log.

Action
L'azione intrapresa quando il filtro trova una corrispondenza (ban, email, ecc.).

Jail
La combinazione di un filter e un action. La "prigione" per gli IP ostili.


Installazione su Linux

Fail2ban è disponibile nei repository ufficiali della maggior parte delle distribuzioni.

Debian / Ubuntu / Kali Linux

sudo apt update
sudo apt install fail2ban

CentOS / RHEL / Rocky Linux / AlmaLinux

Abilita prima EPEL:

sudo dnf install epel-release
sudo dnf install fail2ban

Arch Linux / Manjaro

sudo pacman -S fail2ban

Configurazione di base

Non modificare direttamente:

/etc/fail2ban/jail.conf

Viene sovrascritto a ogni aggiornamento.
Usa invece jail.local.

1. Crea il file di configurazione locale

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local

Apri il file:

sudo nano /etc/fail2ban/jail.local

2. Impostazioni generali

Sezione [DEFAULT]:

  • bantime: durata del ban in secondi
  • findtime: finestra temporale di osservazione
  • maxretry: massimo tentativi consentiti

Esempio:

[DEFAULT]
    bantime  = 3600
    findtime = 600
    maxretry = 5

Significato:
5 fallimenti in 10 minuti -> ban di 1 ora.

3. Abilita la protezione per SSH

Sezione [sshd]:

[sshd]
    enabled  = true
    port     = ssh
    filter   = sshd
    logpath  = /var/log/auth.log
    maxretry = 3

Nota: su CentOS/RHEL il log è spesso /var/log/secure.

Avvio e gestione di Fail2ban

sudo systemctl start fail2ban
sudo systemctl enable fail2ban

Controlla lo stato:

sudo systemctl status fail2ban

Comandi utili

Controllare gli IP bannati

sudo fail2ban-client status sshd

Sbloccare un IP

sudo fail2ban-client set sshd unbanip YOUR_PUBLIC_IP

Controllare i log

sudo tail -f /var/log/fail2ban.log

Proteggere altri servizi

Fail2ban può anche proteggere i web server.

Esempio: Nginx

[nginx-http-auth]
    enabled  = true
    filter   = nginx-http-auth
    port     = http,https
    logpath  = /var/log/nginx/error.log

Fail2ban è uno dei primi strumenti che vale la pena configurare su un nuovo server.
Riduce drasticamente i tentativi di intrusione e il rumore non necessario.

La sicurezza funziona a strati (defense in depth).
Fail2ban più SSH keys rimane una combinazione difficile da battere.