Security

Linux: firewall su misura. Per tutti

Redazione | 29 Giugno 2015

Linux Reti Sicurezza

Le fondamenta dei Firewall Linux: netfilter e iptables Il software che, sotto Linux, gestisce le operazioni elementari essenziali per un […]

Le fondamenta dei Firewall Linux: netfilter e iptables

Il software che, sotto Linux, gestisce le operazioni elementari essenziali per un firewall si chiama netfilter (https://netfilter.org). Le sue librerie contengono funzioni “agganciabili” direttamente ai vari punti del kernel che gestiscono tutti i pacchetti Ip in transito, per filtrarli come desiderato in base alla loro origine, destinazione o natura. Lo strumento che effettua questi “agganci” sotto Linux si chiama iptables. Con questo nome si indicano sia il formato delle tabelle contenenti le istruzioni di filtraggio, sia il programma da riga di comando con cui le si gestisce. Come vedremo nel seguito dell’articolo, non c’è quasi mai bisogno di utilizzarlo direttamente, se non lo si desidera. Anche in quel caso, però, è necessario conoscerne almeno la terminologia e i principi generali di funzionamento per evitare errori.

Il Firewall Configurator di Fedora si basa su tre schede corrispondenti a tre modi di lavorare: zone della rete locale, servizi oppure scrittura diretta di comandi iptables.

Il Firewall Configurator di Fedora si basa su tre schede corrispondenti a tre modi di lavorare: zone della rete locale, servizi oppure scrittura diretta di comandi iptables.

In ogni computer Linux possono esistere cinque tabelle iptables indipendenti (anche se alcune potrebbero essere utilizzabili solo ricompilando o riconfigurando il kernel). Quella usata più frequentemente si chiama Filter: fra le altre citiamo soltanto, per motivi di spazio, quelle chiamate Nat, Mangle e Security: la prima viene utilizzata quasi esclusivamente per condividere una stessa connessione Internet fra più computer, come descritto nel box in queste pagine. La seconda serve per modificare internamente i pacchetti prima che escano dal computer, e l’ultima applica, a livello Ip, le varie procedure di controllo obbligatorio degli accessi impostate con il sistema SELinux.

Ogni tabella può contenere, oltre alle sue “chain” (letteralmente “catena”, in Inglese) predefinite, altre create dall’amministratore. Le catene predefinite della tabella di filtraggio sono Input (per i pacchetti destinati a programmi locali), Forward (per pacchetti provenienti da altri computer, ma non destinati a quello su cui gira iptables) e Output (per pacchetti generati localmente, ma destinati ad altre macchine).

Una catena iptables non è altro che una sequenza di regole, ognuna contenente certe caratteristiche (classificatori) di una connessione Ip e l’azione da compiere (tramite le funzioni di netfilter) su tutti i pacchetti di ogni connessione di quel tipo.

Ogni pacchetto Ip viene confrontato con tutte le regole delle catene che lo riguardano, una alla volta: se non corrisponde a una regola, si passa a quella successiva, finché non si arriva alla fine della catena, nel qual caso si applica l’azione (policy) di default della catena stessa. Quando la descrizione corrisponde, invece, il kernel compie immediatamente l’azione da essa indicata.

Non esiste una policy o gruppo di policy di default validi per tutti i casi: la maggioranza dei desktop ha una configurazione iptables che lascia passare tutti i pacchetti di connessioni che nascono sul desktop stesso, cioè da programmi lanciati dall’utente, ritenuto affidabile fino a prova contraria. Per i server, invece, è molto più frequente il criterio opposto, per comprensibili ragioni di sicurezza: come default, si inizia dicendo a iptables di bloccare qualsiasi trasmissione di pacchetti in entrambi i versi. Dopo si aggiungono regole per lasciar passare alcuni tipi di traffico, e soltanto quelli.

In generale, una singola azione iptables potrebbe anche essere il passaggio a una nuova catena, definita dall’amministratore di sistema, ma quasi sempre consiste in un Accept, Reject o Drop. Nel primo caso, com’è facile intuire, al pacchetto viene consentito di proseguire per la sua destinazione finale, che potrebbe essere qualche programma sullo stesso computer, o un generico host su Internet. Le altre due opzioni portano invece entrambe alla cancellazione del pacchetto, ma con una differenza importante: Reject notifica l’azione al programma che ha inviato il pacchetto, Drop no. Quest’ultima scelta, comunissima, si fa ogni volta che non si vuole soltanto negare un certo tipo di accesso, ma anche nascondere la stessa presenza sulla rete di un computer in grado di fornirlo. Le opzioni standard di iptables permettono di creare o rimuovere catene in ogni tavola con un solo comando, oppure di aggiungere o cancellare regole in qualsiasi posizione all’interno di catene già  esistenti. Per salvare una configurazione appena creata, in modo che venga caricata automaticamente a ogni avvio si deve invece usare un comando separato, chiamato iptables-save.

L'aspetto (e il nome) di Wuurmuur potrebbero incutere molto più timore rispetto ai programmi concorrenti, ma l'interfaccia a caratteri ha il vantaggio di essere utilizzabile anche in remoto, su connessioni cifrate.

L’aspetto (e il nome) di Wuurmuur potrebbero incutere molto più timore rispetto ai programmi concorrenti, ma l’interfaccia a caratteri ha il vantaggio di essere utilizzabile anche in remoto, su connessioni cifrate.

L’ultimo concetto generale di iptables che bisogna conoscere, prima di poter utilizzare con successo questo programma o una qualsiasi delle sue interfacce, è sostanzialmente semplice, anche se ha un nome oscuro. Parliamo del cosiddetto stateful filtering, spesso chiamato anche stateful packet inspection (Spi).

Di per sé, tutte le procedure generali descritte finora sono senza memoria o, in termini più tecnici, “prive di stato” (in Inglese “stateless”): questa espressione significa semplicemente che ogni singolo pacchetto viene modificato, accettato o respinto solo in base alla sua corrispondenza con almeno una delle regole di una qualsiasi catena iptables. Origine, caratteristiche e storia del flusso di traffico di cui quel pacchetto fa parte non fanno alcuna differenza.

Questo modo di procedere, per quanto semplice, ha però un limite gravissimo che renderebbe iptables inutile se non ci fosse il modo di disattivarlo. Moltissime comunicazioni, infatti (incluse tante fra esseri umani), devono infatti consistere per forza di due flussi, distinti e viaggianti in sensi opposti, fra i due enti che comunicano. A livello dei firewall questo significa che bloccare qualsiasi pacchetto di tipo Ftp in ingresso al computer (per rifiutare di farne un server Ftp) impedirebbe anche agli utenti dello stesso computer di scaricare file da altri server Ftp su Internet.

La soluzione è appunto un filtraggio che tenga conto dello stato (“stateful”, appunto) di ogni singola connessione. In sostanza, si deve poter dire a iptables “blocca tutti i pacchetti di questo tipo in ingresso, da qualunque computer siano arrivati, a meno che non siano risposte a connessioni dello stesso tipo, iniziate da questo stesso computer”. Per fare questo bastano due comandi, come mostra questo esempio volutamente incompleto, per ragioni di spazio e semplicità  espositiva:

iptables -A OUTPUT --dport ssh --state NEW,ESTABLISHED -j ACCEPT
iptables -A INPUT --sport ssh --state ESTABLISHED -j ACCEPT

Il primo comando appende (-A) alla catena di uscita della tabella di filtraggio la regola di lasciar passare (Accept) tutti i pacchetti appartenenti a connessioni nuove (“new”) o già  attivate (“established”) per la porta Ssh (trasmissioni cifrate) di qualsiasi altro computer. Il secondo comando appende alla catena di ingresso della stessa tabella una regola speculare quasi identica, che lascia entrare pacchetti Ssh, ma solo se appartengono a connessioni già  attive. È evidente che in questo modo il computer che usa quel firewall potrà  connettersi per primo a qualunque altro computer via Ssh, mentre il contrario sarà  impossibile.

➜ Continua a leggere: le Dmz

< Indietro Successivo >