I firewall sono a tutt’oggi il sistema di protezione più diffuso per le reti di ogni dimensione. Un firewall, se ben configurato, può diminuire notevolmente le probabilità di un attacco da parte di un hacker e non fare in modo che il nostro sistema funga da trampolino di lancio per attacchi ad altre reti. In questo articolo parleremo delle funzionalità di base dei firewall e come evitare di incorrere in errori che potrebbero compromettere la sicurezza della nostra rete.
Un firewall è un apparecchio o più spesso un software collegato a due o più reti, che agisce da filtro per i dati che devono transitare in ingresso ed in uscita. Può essere paragonato ad un vigile che stabilisce il traffico che può transitare attraverso un incrocio ( il nostro firewall ). Per configurare perfettamente un firewall occorre una certa dimestichezza con i protocolli di rete. Tutte le reti TCP/IP sono definite reti a “commutazione di pacchetto”, le comunicazioni avvengono inviando dei pacchetti indipendenti di dati da un computer all’altro. Ogni pacchetto è costituito da un header o intestazione seguito dai dati trasmessi veri e propri. La maggior parte dei firewall si limitano ad analizzare gli header piuttosto che i dati, perché sarebbe un lavoro molto dispendioso analizzare tutto. Nelle intestazioni dei pacchetti infatti abbiamo queste informazioni:
- L’indirizzo della scheda di rete sorgente e di destinazione.
- L’indirizzo IP sorgente e di destinazione.
- In comunicazioni TCP o UDP la porta da cui è partita la connessione e la porta di destinazione. Ogni host ha infatti a disposizione 65535 porte, le prime sono riservate ai servizi standard ( HTTP 80 ad esempio per server web ) e le altre possono essere utilizzate liberamente.
- In caso di pacchetti ICMP, l’errore che si è verificato oppure i messaggi di diagnostica come ping o ping-reply.
I firewall si possono suddividere in due grandi categorie: firewall stateful e firewall stateless. I primi tengono traccia di quasi tutto ciò che passa al fine di ricordarsi i pacchetti che fanno parte di connessioni preesistenti e bloccare o aprire dinamicamente le porte. I secondi non tengono traccia delle connessioni e lasciano più libertà nella configurazione.
La configurazione di un firewall è l’attività principale di un amministratore di rete, che deve creare un filtro ai dati che si scambiano tra la nostra rete e quella esterna. Normalmente si mette un computer a difesa della LAN con un firewall ben configurato, che faccia passare i pacchetti in base al servizio che gli utenti esterni devono sfruttare. La porta sorgente è sempre presa a caso, quindi occorre individuare la destinazione del pacchetto. Una configurazione estremamente efficace è costituita dall’uso di una DMZ che è una zona franca intermedia tra la nostra LAN ed Internet nella quale possiamo permettere l’ingresso di determinati pacchetti, che però non entreranno nella LAN perché ben filtrati. Normalmente la politica più utilizzata è vietare tutto, poi pian piano aprire le porte a determinati servizi che ci occorrono. Altra caratteristica dei firewall è la possibilità di effettuare NAT ( Network Address Translation ) che consiste nel cambiare parti dell’header dei pacchetti che transitano attraverso il nostro firewall per i nostri fini.
Una volta stabilita la posizione del firewall nella rete e pianificati i servizi da mostrare all’esterno arriva il compito di configurare il software, che normalmente dispone di strumenti ed interfacce grafiche per meglio lavorare con le varie parti del componente. Per evitare malfunzionamenti è preferibile avere sempre a disposizione dei file di log, che vengono creati al passaggio dei vari pacchetti.
In Linux il firewall risiede all’interno del kernel e dalla versione 2.4 si parla di iptables, cioè tabelle di IP, comunque tutto il traffico viene suddiviso in tre fasce o catene: la catena di INPUT per tutto ciò che entra, la catena di OUTPUT per tutto ciò che esce e la catena FORWARD per tutto quello che transita attraverso il nostro firewall. Ad ogni catena è possibile aggiungere delle regole e ad ognuna di esse è associata un’azione. Ogni volta che un pacchetto transita per una catena, tutte le regole associate a quella catena vengono controllate in ordine, dalla prima all’ultima. Quando una regola risulta vera viene applicata al pacchetto l’azione specificata e viene interrotto il processo di ricerca. Iptables oltre ad aver mantenuto il sistema delle catene di ipchains, ha introdotto le tabelle multiple. Normalmente ci sono tre tabelle: filter, mangle e nat. In ogni tabella sono mantenute delle catene indipendenti da quelle delle altre tabelle, filter contiene le catene INPUT, OUTPUT e FORWARD, le altre due sono utilizzate per il nat e per sfruttare le funzioni avanzate del kernel. Le azioni che si possono compiere sulle catene sono: DROP per bloccare, ACCEPT per accettare QUEUE per passarlo ad un programma, RETURN per tornare alla catena precedente e LOG per registrare tramite syslog l’avvenimento. Iptables utilizza una struttura estremamente modulare che consente di caricare dei moduli per la gestione dei protocolli particolari o per disporre di nuovi tipi di regole. Ad esempio è possibile filtrare il traffico in base all’utente locale, in base all’indirizzo dell’hardware o limitare traffico ad una certa frequenza. Esiste anche un modulo state che è estremamente potente, infatti permette di discernere tra il traffico facente parte di connessioni esistenti o nuove. Facciamo un semplice esempio:
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
iptables -A INPUT -m state –state ESTABLISHED, RELATED -j ACCEPT
In queste poche istruzioni diciamo al nostro firewall di bloccare tutto il traffico transitante, accettare tutto il traffico in uscita e permettere pacchetti in ingresso solo se la connessione è stata già accettata, quindi da connessioni effettuate da noi. Questa politica permette al nostro sistema di essere praticamente inattaccabile dall’esterno e dovrebbe essere realizzato su ogni computer che non espone servizi verso l’esterno.
Per ora terminiamo qui, altrimenti andremmo ad affrontare temi molto più complessi, però se volete possiamo ritornare sulla configurazione di iptables quando affronteremo la configurazione di un firewall sul nostro sistema Linux che stiamo costruendo tramite delle lezioni in questo blog.