Fail2ban: tool per la prevenzione degli attacchi

Conosciamo questo utile strumento per il monitoraggio e la difesa delle infrastrutture ICT
By Admin | Marzo 28, 2023

In questo articolo approfondiremo l'argomento Firewall sotto ambiente Linux conoscendo da vicino il noto Ufw acronimo di Uncomplicated Firewall. Ufw è nato storicamente come un wrapper per comandi ed istruzioni specifici per iptables, il sistema firewall principale e ampiamente diffuso su piattaforme Unix.

Iptables ha avuto ed ha storicamente una sintassi per la scrittura delle regole firewall abbastanza articolata e complessa, notoriamente ostica per chi si avvicina a questo componente per la prima volta. Ufw è nato appunto per superare tale limite, consentire la scrittura di regole intuitive ed auto-esplicative, generalmente comprensibili alla sola lettura e piuttosto facili da ricordare.

Per comodità immaginiamo come sempre di partire da una macchina server equipaggiata con un sistema di derivazione Debian, macchina che quindi ha già installato iptables. Procediamo con l'installazione di Ufw con le consuete istruzioni:

$ apt-get install ufw

Subito dopo l'istallazione, potremmo verificare sempre da root la corretta esecuzione della procedura dando:

$ ufw status

Che restituisce "Status: inactive", Ufw è quindi installato correttamente ma inattivo. Prima di avviare Ufw è importante procedere ad una corretta configurazione dello stesso, onde evitare problemi. Ad esempio la non definizione di una regola per l'accesso, di solito tramite SSH su porta 22 alla macchina su cui stiamo operando, potrebbe buttarci fuori dal sistema all'avvio di Ufw stesso, causando un grosso problema derivante dall'impossibilità di accedere nuovamente alla macchina.

Procediamo quindi con una revisione generale del settaggio tipico che si può operare su Ufw per la prima volta dopo l'installazione, introducendo in dettaglio la sintassi e le modalità per creare regole specifiche su una macchina immaginaria.

Supponiamo di avere la seguente situazione: abbiamo una macchina server che ospita una piattaforma web che risponde sulle classiche porte 80 e 443 (http e https), su questa macchina abbiamo la necessità di accedere tramite SSH (di solito porta 22) per manutenzione e monitoraggio (sia da un IP generico che da un IP specifico).

Chiarite a priori tutte le nostre esigenze possiamo procedere al settaggio di Ufw, ricordiamo sempre che le regole si interpretano in uno scenario top-down, dall'alto verso il basso. Ossia le regole che aggiungiamo dopo le prime vanno ad incidere su quelle precedenti. Per questo motivo, e per tante considerazioni sulla sicurezza generale di un sistema informatico esposto sulla rete, è sempre consigliabile partire dalle regole base di Ufw (possono essere assunte come regole standard), ossia:

$ ufw default deny incoming
$ ufw default allow outgoing

Queste due regole in sequenza dicono ad Ufw (1) blocca di default tutte le connessioni in ingresso al sistema e (2) permetti di default tutte le connessioni in uscita dal sistema. Abbiamo quindi in pratica istruito il sistema a bloccare tutti i tentativi di connessione in ingresso permettendo però la funzionalità della macchina, cioè consentendo l'attività che dalla stessa va verso l'esterno. Ovviamente a questo punto abbiamo messo la macchina in una condizione iniziale di base a cui sono comunque necessarie regole specifiche per le funzionalità. Iniziamo dalle esigenze di manutenzione attraverso cui faremo il deploy del nostro sito web o della nostra piattaforma. Per l'accesso alla nostra macchina useremo in futuro un classico SSH su porta 22 per monitoraggio e manutenzione.

$ ufw allow 22

Che apre la porta 22 usata da SSH a tutto il traffico esterno. Ovviamente questa regola è generica ed espone la porta 22 a qualsiasi dispositivo in rete, supponiamo quindi di voler aprire il nostro server soltanto ad uno specifico IP in quanto, ad esempio, il nostro ufficio è dotato di connessione con IP fisso e siamo sicuri che in futuro ci connetteremo al server solo dal nostro luogo di lavoro. L'istruzione diventa quindi:

$ ufw allow proto tcp from 50.60.70.80 to any port 22

Nell'esempio abbiamo specificato che ci connettiamo al nostro server da uno specifico IP (50.60.70.80) su porta 22 utilizzando il protocollo TCP, abbiamo quindi escluso su tale porta la ricezione di pacchetti UDP. L'esempio qui esposto si riferisce ad SSH ma dobbiamo ricordare che esistono centinaia di protocolli e modalità di comunicazione che utilizzano migliaia di porte diverse, potremmo quindi raffinare le nostre regole per garantire standard di sicurezza più alti possibili.

Solo come riferimento al citato iptables, per toccare con mano il vantaggio dell'utilizzo di Ufw come wrapper, ci basterà comparare l'equivalente istruzione da impartire direttamente a iptables:

$ iptables -A INPUT -p tcp -s 50.60.70.80 --dport 22 -m conntrack --ctstate NEW,ESTABLISHED -j ACCEPT

Continuiamo il nostro viaggio ricordando che sul nostro server ospiteremo una piattaforma web raggiungibile ovviamente tramite HTTP(S), impostiamo quindi due regole:

$ ufw allow 80/tcp comment 'accept HTTP'
$ ufw allow 443/tcp comment 'accept HTTPS'

Anche in queste due regole abbiamo stabilito a priori che le due porte saranno raggiungibili da qualsiasi IP, esclusivamente tramite TCP specificando in forma breve porta/protocollo, aggiungendo anche un commento che ci permetterà in futuro di riconoscere subito la regola.

Per ottenere un summary di quello che abbiamo impostato fino ad ora ci basterà digitare:

$ ufw status

Per ottenere:

Satus: active

To                         Action      From
--                         ------      ----
22/tcp                     ALLOW       50.60.70.80
80/tcp                     ALLOW       Anywhere                 # accept HTTP
443/tcp                    ALLOW       Anywhere                 # accept HTTPS

La schermata ci conferma che sulla nostra macchina le uniche porte aperte, raggiungibili con modalità diverse, sono quindi 22, 80 e 443.

Compresa quindi la sintassi base di Ufw vediamo una carrellata di comando più specifici per altre esigenze.

Apertura intervallo specifico di porte (1999:2010), sia TCP che in UCP:

$ ufw allow 1999:2010/tcp
$ ufw allow 1999:2010/udp

Blocco accesso alla macchina da uno specifico IP oppure (di seguito) ad una sua subnet (classe /24):

$ ufw deny from 199.199.199.199
$ ufw deny from 199.199.199.199/24

Oppure blocco da specifico IP su specifica porta e protocollo:

$ ufw deny from 199.199.199.199 to any port 22 proto tcp

Supponendo che il nostro server sia localizzato in una rete aziendale interna avendo la necessità di gestire dei database MySQL possiamo impostare:

$ ufw allow in on eth1 to any port 3306

Istruendo il server a rispondere sulla porta 3306 solo sugli IP relativi all'interfaccia eth1.

Da specificare infine che Ufw possiede anche un modo (per i meno smaliziati a livello di porte e protocolli) per indicare testualmente le configurazioni da settare. Dando il comando:

$ ufw app list

Il sistema riconoscerà quali servizi sono installati di default, ad esempio per un sistema remoto otterremo un output:

Output

Available applications:
OpenSSH

Che ci informa della presenza di SSH sulla macchina, se fosse già installato e presente un server Apache o nginx, ad esempio, otterremo le relative stringhe.

Per aggiungere quindi regole pre-impostate da Ufw riferendoci al sistema di nostro interesse, nel nsotro caso accesso in SSH sulla porta 22 di default, ci basterà dare:

$ ufw allow "OpenSSH"

E successivamente, per esempio:

$ ufw allow "Apache"
$ ufw allow "Apache Full"

Ottenendo tramite il comando status:

Status: active

To                         Action      From
--                         ------      ----
OpenSSH                    ALLOW       Anywhere
Apache                     ALLOW       Anywhere
Apache Full                ALLOW       Anywhere
OpenSSH (v6)               ALLOW       Anywhere (v6)
Apache  (v6)               ALLOW       Anywhere (v6)
Apache Full (v6)           ALLOW       Anywhere (v6)

Queste istruzioni sono equivalenti a quelle che abbiamo dato in precedenza specificando le porte 22, 80 e 443.

Due ultime considerazioni prima di concludere questa breve guida, supponiamo per mutate esigenze di voler cancellare una regola, eventualmente per modificarla successivamente. Ci basterà dare il seguente comando per ottenere una lista di regole numerate su cui è facile intervenire:

$ ufw status numbered

Supponendo ora adesso di voler cancellare, ad esempio, la regola 4 che otteniamo nella tabella di summary dovremo dare il comando:

$ ufw delete 4

Se invece vogliamo resettare TUTTE le regole impostate, operazione comunque da soppesare per bene valutando le conseguenze, ci basterà digitare:

$ ufw reset

Che cancellerà ogni regola. Volendo inoltre disabilitare Ufw, circostanza che potrebbe essere necessaria per esigenze di manutenzione o altro dovremo digitare:

$ ufw disable

Ottenendo:

Firewall stopped and disabled on system startup

Ricordando sempre di riattivarlo e di verificare quali regole sono attive secondo le nostre esigenze.

Ogni operazione svolta da Ufw viene opportunamente loggata nel file /var/log/ufw.log che costituisce una importante fornte di informazione per opportune verifiche in caso vengano riscontrati problemi.

Infine, per completezza ricordiamo che Ufw è dotato anche di una interfaccia grafica GUI che è stata battezzata per l'appunto Gufw. La stessa semplifica molte delle operazioni per la creazione / visualizzazione delle regole ma appunto è utilizzabile in quei contesti in cui si ha preferibilmente accesso fisico alle macchine che devono essere dotate di ambiente grafico.

Questa breve guida rappresenta solo la punta dell'iceberg dei possibili comandi che Ufw mette a disposizione per una configurazione avanzata delle reti, permettendo di stabilire regole molto robuste per routing, filtraggio del traffico e questioni annesse. Come sempre una grande fonde di informazioni si può reperire nel manuale di Ufw.

Qualsivoglia richiesta può essere inviata a NAOSDATA che offre servizi di consulenza, implementazione e managment specifico sulle infrastrutture ICT.

Ci auguriamo che questo articolo vi sia piaciuto e vi possa essere d'aiuto nell'orientarvi nel mondo di Ufw. Se apprezzate il nostro lavoro seguite i nostri profili su Facebook e LinkedIn.

Creative Commons License
Questo lavoro è offerto tramite licenza Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.


Risorse e Link: