Nell'ambito delle reti di computer, un firewall (termine inglese dal significato originario di parete refrattaria, muro tagliafuoco) è un componente passivo di difesa perimetrale (quindi un dispositivo hardware) che può anche svolgere funzioni di collegamento tra due o più tronconi di rete. Usualmente la rete viene divisa in due sottoreti: una, detta esterna, comprende l'intera rete Internet mentre l'altra interna, detta LAN (Local Area Network), comprende una sezione più o meno grande di un insieme di computer locali.
In alcuni casi è possibile che si crei l'esigenza di creare una terza sottorete detta DMZ (o zona demilitarizzata) atta a contenere quei sistemi che devono essere isolati dalla rete interna ma devono comunque essere protetti dal firewall. Grazie alla sua posizione strategica, il firewall risulta il posto migliore ove imporre delle logiche di traffico per i pacchetti in transito e/o eseguire un loro monitoraggio. La sua funzionalità principale in sostanza è quella di creare un filtro sulle connessioni entranti ed uscenti, in questo modo il dispositivo innalza il livello di sicurezza della rete e permette sia agli utenti interni che a quelli esterni di operare nel massimo della sicurezza.
Una prima definizione chiusa di firewall è la seguente:
Apparato di rete hardware o software che filtra tutti i
pacchetti entranti ed uscenti, da e verso una rete o un computer, applicando
regole che contribuiscono alla sicurezza della stessa.
In realtà un firewall può essere realizzato con un normale computer (con almeno due schede di rete e software apposito), può essere una funzione inclusa in un router o può essere un apparato specializzato. Esistono inoltre i cosiddetti "firewall personali", che sono programmi installati sui normali calcolatori, che filtrano solamente i pacchetti che entrano ed escono da quel calcolatore.
La funzionalità principale in sostanza è quella di creare un filtro sulle connessioni entranti ed uscenti, in questo modo il dispositivo innalza il livello di sicurezza della rete e permette sia agli utenti interni che a quelli esterni di operare nel massimo della sicurezza. Il firewall agisce sui pacchetti in transito da e per la zona interna potendo eseguire su di essi operazioni di controllo, modifica e monitoraggio.
Questo grazie alla sua capacità di "aprire" il pacchetto IP per leggere le informazioni presenti sul suo header, e in alcuni casi anche di effettuare verifiche sul contenuto del pacchetto.
Oltre al firewall a protezione perimetrale ne esiste un secondo tipo, definito "Personal Firewall", che si installa direttamente sui sistemi da proteggere (per questo motivo è chiamato anche Firewall Software). In tal caso, un buon firewall effettua anche un controllo di tutti i programmi che tentano di accedere ad internet presenti sul computer nel quale è installato, consentendo all'utente di impostare delle regole che possano concedere o negare l'accesso ad internet da parte dei programmi stessi, questo per prevenire la possibilità che un programma malevolo possa connettere il computer all'esterno pregiudicandone la sicurezza.
Il principio di funzionamento differisce rispetto a quello del firewall perimetrale in quanto, in quest'ultimo, le regole che definiscono i flussi di traffico permessi vengono impostate in base all'indirizzo IP sorgente, quello di destinazione e la porta attraverso la quale viene erogato il servizio, mentre nel personal firewall all'utente è sufficiente esprimere il consenso affinchè una determinata applicazione possa interagire con il mondo esterno attraverso il protocollo IP.
Da sottolineare che l'aggiornamento di un firewall è importante ma non è così vitale come invece lo è l'aggiornamento di un antivirus, in quanto le operazioni che il firewall deve compiere sono sostanzialmente sempre le stesse. E' invece importante creare delle regole che siano corrette per decidere quali programmi devono poter accedere alla rete esterna e quali invece non devono.
Rispetto ad un firewall perimetrale, il personal firewall è eseguito sullo stesso sistema operativo che dovrebbe proteggere, ed è quindi soggetto al rischio di venir disabilitato da un software malevolo che prenda il controllo del calcolatore con diritti sufficienti. Inoltre, la sua configurazione è spesso lasciata a utenti finali poco esperti.
A suo favore, il personal firewall ha accesso ad un dato che un firewall perimetrale non può conoscere, ovvero può sapere quale applicazione ha generato un pacchetto o è in ascolto su una determinata porta, e può basare le sue decisioni anche su questo, ad esempio bloccando una connessione SMTP generata da un virus e facendo passare quella generata da un client di posta elettronica autorizzato. Inoltre, può essere installato rapidamente e indipendentemente dagli amministratori di rete.
Un'altra funzione che alcuni firewall prevedono è la possibilità di filtrare ciò che arriva da internet, consentendo per esempio di vietare la visualizzazione di alcuni siti internet contenenti pagine con un contenuto non adatto ai minori, nella maggior parte dei casi però l'attivazione di questa funzionalità è demandata a software aggiuntivi appartenenti alla categoria dell'URL filtering.
Il firewall è solo uno dei componenti di una strategia di sicurezza informatica, e non può in generale essere considerato sufficiente:
Tipologie di firewall, in ordine crescente di complessità:
La sintassi della configurazione di un firewall in molti casi è basata su un meccanismo di lista di controllo degli accessi (ACL), che possono essere statiche (quindi modificabili solo tramite configurazione esplicita) o dinamiche (cioè che possono variare in base allo stato interno del sistema, come ad esempio nel Port knocking).
Una funzione spesso associata al firewall è quella di NAT (traduzione degli indirizzi di rete), che può contribuire a rendere inaccessibili i calcolatori sulla rete interna. Molti firewall possono registrare tutte le operazioni fatte (logging), effettuare registrazioni più o meno selettive (ad esempio, registrare solo i pacchetti che violano una certa regola, non registrare più di N pacchetti al secondo), e tenere statistiche di quali regole sono state più violate.
La registrazione integrale dell'attività di un firewall può facilmente assumere dimensioni ingestibili, per cui spesso si usa il logging solo temporaneamente per diagnosticare problemi, o comunque in modo selettivo (logging dei soli pacchetti rifiutati o solo di alcune regole). Tuttavia, l'analisi dei log di un firewall (o anche dei contatori delle varie regole) può permettere di individuare in tempo reale tentativi di intrusione.
Talvolta ad un firewall è associata anche la funzione di rilevamento delle intrusioni (IDS), un sistema basato su euristiche che analizza il traffico e tenta di riconoscere possibili attacchi alla sicurezza della rete, e può anche scatenare reazioni automatiche da parte del firewall (IPS).
Una delle vulnerabilità più conosciute di un firewall di fascia media è l'HTTP tunneling, che consente di bypassare le restrizioni internet utilizzando comunicazioni HTTP solitamente concesse dai firewall. Altra tipica vulnerabilità è la dll injection, ovvero una tecnica utilizzata da molti trojan, che sovrascrive il codice maligno all'interno di librerie di sistema utilizzate da programmi considerati sicuri. L'informazione riesce ad uscire dal computer in quanto il firewall, che di solito controlla i processi e non le librerie, crede che l'invio ad internet lo stia eseguendo un programma da lui ritenuto sicuro, ma che di fatto utilizza la libreria contaminata. Alcuni firewall hanno anche il controllo sulla variazione delle librerie in memoria ma è difficile capire quando le variazioni sono state fatte da virus.
Implementazioni Software
Appliance
Personal firewalls
Netfilter è un componente del kernel del sistema operativo Linux, che permette l'intercettazione e manipolazione dei pacchetti che attraversano il calcolatore. Netfilter permette di realizzare alcune funzionalità di rete avanzate come la realizzazione di firewall basata sul filtraggio stateful dei pacchetti o configurazioni anche complesse di NAT, un sistema di traduzione automatica degli indirizzi IP, tra cui la condivisione di un'unica connessione Internet tra diversi computer di una rete locale, o ancora la manipolazione dei pacchetti in transito.
Iptables è il programma che permette agli amministratori di sistema di configurare netfilter, definendo le regole per i filtri di rete e il reindirizzamento NAT. Spesso con il termine iptables ci si riferisce all'intera infrastruttura, incluso netfilter.
Iptables è un componente standard di tutte le moderne distribuzioni di Linux. Esso fu introdotto nella versione principale del sistema operativo nel marzo del 2000, durante lo sviluppo della versione 2.4. Nella versione 2.2 si usava un sistema alternativo denominato ipchains, che a sua volta sostituì il sistema ipfwadm, usato nella versione 2.0.
Netfilter trova applicazione sia in calcolatori che vengono usati come host (hanno una sola interfaccia di rete, e non inoltrano pacchetti da un'interfaccia ad un'altra) che per realizzare dei veri e propri router basati su Linux.
Indice |
Il sistema netfilter si basa su regole raggruppate in catene (chain), a loro volta raggruppate in tabelle (tables). Ogni tabella definisce un tipo diverso di operazioni che è possibile effettuare sui pacchetti; ogni catena definisce come vengono trattati i pacchetti nelle diverse fasi della loro elaborazione.
Le catene sono una forma di lista di controllo degli accessi (ACL): ogni regola è costituita da due parti: la specifica delle caratteristiche che un pacchetto deve avere affinchè la regola stessa venga applicata (match) e un obiettivo o target, che indica cosa fare quando il pacchetto rispetta le caratteristiche indicate. A ciascuna catena è anche associata una politica di default, che definisce come vengono trattati i pacchetti che non corrispondono ad alcuna regola.
Le caratteristiche più frequentemente utilizzate per costruire le regole sono l'indirizzo di partenza o di destinazione del pacchetto e il numero di porta associato alla connessione. Ogni pacchetto di rete che arriva o parte dal computer attraversa almeno una catena e ogni regola della catena controlla se il pacchetto ne rispetta la specifica. Se questo accade, il pacchetto seguirà il comportamento descritto nell'obiettivo della regola, e le regole successive della catena verranno ignorate (a parte casi speciali). Se il pacchetto raggiunge la fine della catena senza essere processato da nessuna regola, la politica della catena determina cosa farne.
Uno dei possibili obiettivi è il collegamento a un'altra catena. In questo caso, il pacchetto ricomincia ad essere valutato dalle regole della nuova catena, senza limiti di concatenazione. Una regola può semplicemente essere un collegamento a una catena. Solo se il pacchetto attraversa l'intera catena collegata esso continuerà nella catena principale.
In ogni tabella esistono alcune catene predefinite, ma l'utente può crearne di nuove.
Questa parte di ciascuna regola serve a definire a quali pacchetti verrà applicata la regola. Una specifica è costituita da un insieme di caratteristiche dei pacchetti che devono essere gestite dalla regola stessa. Una regola è identificata dalla sua specifica dall'obiettivo, cioè l'azione da eseguire quando un pacchetto rispetta la regola. Alcune delle opzioni più importanti per specificare una regola sono le seguenti:
Se questa opzione è omessa in una regola, quest'ultima non modifica il destino del pacchetto, tuttavia il contatore della regola verrà ugualmente incrementato.
L'obiettivo di una regola è l'azione da compiere se un pacchetto rispetta la regola. Esso può essere sia il nome di una catena definita dall'utente sia uno degli obiettivi predefiniti. Gli obiettivi predefiniti sono quattro: ACCEPT, DROP, QUEUE e RETURN. Quando l'obiettivo è il nome di una catena definita dall'utente, il pacchetto viene fatto passare per quella catena, un po come avviene per una chiamata di funzione in un linguaggio di programmazione. Se il pacchetto non viene processato da nessuna regola della catena, in quanto non rispetta la specifica di nessuna delle sue regole, esso ritorna ad essere processato dalla catena di partenza.
Ogni obiettivo predefinito indica un'azione da compiere sul pacchetto:
Esistono molti obiettivi aggiuntivi disponibili. Alcuni dei più comuni sono:
Una delle funzionalità più importanti offerte da netfilter è la possibilità di identificare i pacchetti facenti parte di una stessa connessione (stateful packet filtering). Questo permette di creare delle regole basate sulla relazione che un pacchetto ha nei confronti della connessione a cui appartiene. Il NAT si basa su queste informazioni per tradurre allo stesso modo gli indirizzi dei pacchetti di una stessa connessione, e iptables usa queste informazioni per realizzare firewall avanzati.
Netfilter assegna ad ogni pacchetto uno dei seguenti stati:
Un caso comune è che il primo pacchetto visto dal firewall viene classificato come NEW, la risposta viene classificata come ESTABLISHED e un messaggio di errore, ad esempio un errore ICMP, come RELATED. Un errore ICMP che non appartiene a nessuna connessione può essere classificato come INVALID.
Inoltre, attraverso l'uso di moduli aggiuntivi, il monitoraggio della connessione può ottenere la capacità di relazionare tra loro le connessioni che fanno parte di una stessa sessione a livello applicativo. Per esempio, il protocollo FTP stabilisce due tipi di connessione, una per le informazioni di controllo e un'altra per i dati veri e propri. Quando il modulo ip_conntrack_ftp viene caricato nel sistema, il primo pacchetto di una connessione dati sarà classificato come RELATED invice di NEW, in quanto la connessione di controllo è stata già stabilita e la connessione dati ne è una prosecuzione logicamente. Per fare questo, il modulo ip_conntrack_ftp deve analizzare il contenuto della connessione di controllo, per identificare le caratteristiche delle connessioni dati.
Netfilter può utilizzare l'informazione sullo stato dei pacchetti per creare filtri più potenti e più semplici da definire. Per esempio, una regola può lasciar passare i pacchetti NEW solo dall'interno del firewall verso la rete esterna, e i pacchetti RELATED e ESTABLISHED in entrambe le direzioni. Questo permette di inviare delle repliche a connessioni create dall'interno, ma non permette di creare nuove connessioni dall'esterno, il che aumenta la sicurezza di un sistema perchè gli attacchi che vengono dall'esterno non sono in grado di stabilire connessioni. Inoltre, se una sessione FTP crea una connessione dati dall'esterno verso l'interno, la connessione sarà accettata in quanto la connessione dati è in relazione con la connessione di controllo che è stata creata dall'interno verso l'esterno, e quindi i pacchetti della connessione dati saranno classificati come RELATED e non come NEW.
iptables { -A | --append | -D | --delete } nome_catena nome_regola [ opzioni ]
Con queste opzioni si può aggiungere o cancellare una regola dalla catena specificata. Le opzioni -A e --append permettono di aggiungere, -D e --delete di cancellare. Ad esempio, per aggiungere una regola alla catena INPUT nella tabella filtro per scartare tutti i pacchetti UDP, si può usare il seguente comando:
La tabella filtro è la tabella di default, non è quindi necessario specificarla con l'opzione -t. Per cancellare la regola aggiunta dal comando precedente, si può usare il seguente comando:
Questo comando in realtà cancella la prima regola della catena INPUT che ha la specifica "-p udp -j DROP". Se vi sono altre regole con la stessa specifica, solo la prima verr&agrvae cancellata.
iptables { -R | --replace | -I | --insert } nome_catena numero_regola nuova_regola [ opzioni ]
Con questo comando è possibile sostituire, con -R o --replace, una regola esistente o inserire, con -I o --insert, una nuova regola nella catena specificata. Ad esempio, per sostiture la quarta regola della catena INPUT con una regola che scarta tutti i pacchetti ICMP, si può usare il seguente comando:
Per inserire una nuova regola nella seconda posizione della catena OUTPUT per scartare tutto il traffico TCP sulla porta 80, si può usare il comando:
iptables { -D | --delete } nome_catena numero_regola [ opzioni ]
Questa opzione permette di cancellare una regola della catena specificata, indicandone la posizione all'interno della catena. Le regole sono numerate a partire da 1. Per esempio, per cancellare la terza regola dalla catena FORWARD, si usa il comando:
iptables { -L | --list | -F | --flush | -Z | --zero } [ nome_catena ] [ opzioni ]
Queste opzioni permettono di ottenere la lista delle regole di una catena, con -L o --list, cancellare tutte le regole di una catena, con -F o --flush, e azzerare il contatore di byte e pacchetti di una catena, con l'opzione -Z o --zero. Se nessuna catena è specificata, l'operazione è eseguita su tutte le catene. Ad esempio, per elencare tutte le regole della catena OUTPUT, si usa il comando:
Per cancellare tutte le catene:
Per azzerare i contatori dei byte e dei pacchetti della catena PREROUTING nella tabella nat, si usa il comando:
iptables { -N | --new-chain } nome_catena iptables { -X | --delete-chain } [ nome_catena ]
Queste opzioni permettono di creare, con -N o --new-chain, e cancellare, con -X o --delete-chain, catene definite dall'utente. Nel caso della cancellazione, se nessuna catena è specificata, tutte le catene definite dall'utente verranno cancellate. Non è possibile cancellare le catene predefinite, come le catene INPUT o OUTPUT della tabelle filtro.
iptables { -P | --policy } nome_catena nome_politica
Questo comando è usato per assegnare una politica ad una catena predefinita. Ad esempio, per impostare la politica DROP per la catena INPUT, si usa il comando:
iptables { -E | --rename-chain } vecchio_nome_catena nuovo_nome_catena
Questo comando permette di rinominare una catena definita dall'utente.
Ciascuna estensione può essere implementata come un modulo del kernel Linux, e i moduli necessari vengono caricati automaticamente quando viene inserita una regola che li utilizza.
La tabella riportata di seguito mostra un possibile insieme di regole di filtraggio per i pacchetti TCP, UDP e ICMP per mezzo delle quali un firewall personale opera durante le connessioni attive di rete.
*filter
:INPUT ACCEPT [0:0]
:FORWARD ACCEPT [0:0]
:OUTPUT ACCEPT [0:0]
:RH-Firewall-1-INPUT - [0:0]
-A INPUT -j RH-Firewall-1-INPUT
-A FORWARD -j RH-Firewall-1-INPUT
-A RH-Firewall-1-INPUT -i lo -j ACCEPT
-A RH-Firewall-1-INPUT -p icmp --icmp-type any -j ACCEPT
-A RH-Firewall-1-INPUT -p 50 -j ACCEPT
-A RH-Firewall-1-INPUT -p 51 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp --dport 5353 -d 224.0.0.251 -j ACCEPT
-A RH-Firewall-1-INPUT -p udp -m udp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -p tcp -m tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 21 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 25 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 22 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 137 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m udp -p udp --dport 138 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 139 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 445 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 443 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 23 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 941 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 631 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2049 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 764 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 641 -j ACCEPT
-A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
-A RH-Firewall-1-INPUT -j REJECT --reject-with icmp-host-prohibited
COMMIT