Un firewall può essere sia hardware che software, ed ha due funzionalità: tenere fuori chi non è autorizzato (cracker), e tenere dentro la gente che non deve uscire (dipendenti).
Prima di implementare il proprio firewall conviene decidere quale delle due più comuni linee di pensiero utilizzare: "vietare tutto tranne" o "pemettere tutto tranne". Quindi occorre fare mente locale per determinare quali servizi sono necessari e a chi necessitano.
2. iptables
Il sistema operativo Linux dalla versione 2.4 ha un ottimo firewall (netfilter) integrato direttamente nel kernel. Dopo gli ormai vecchi ipfwadm e ipchains, abbiamo ora la possibilità di utilizzare un potente tool (iptables ) per la configurazione delle regole di netfilter.
Iptables è stato completamente riscritto con l'aggiunta di notevoli migliorie: a differenza di ipchains dove c'erano solo tre catene (INPUT, OUTPUT e FORWARD) per la gestione dei pacchetti, in iptables abbiamo tre tabelle (FILTER, NAT, MANGLE). La tabella più importante è sicuramente FILTER che è composta da tre catene INPUT, OUTPUT e FORWARD rispettivamente per il controllo dei pacchetti in ingresso, in uscita e in transito. La tabela NAT si occupa appunto della gestione della Network Address Translaion, ed è composta dalle catene PREROUTING, POSTROUTING e OUTPUT, rispettivamente per la manipolazione dei pacchetti in entrata prima o dopo la decisione di routing, e per i pacchetti generati localmente. L'ultima tabella è la cosidetta MANGLE, che è composta dalle catene PREROUTING e OUTPUT, e si occupa di particolari alterazioni dei pacchetti.
Vediamo quindi come queste catene vengono applicate ai pacchetti in arrivo al sistema: per prima cosa netfilter applica le regole di PREROUTING, quindi i pacchetti vengono dati in gestione alla catena INPUT o FORWARD a seconda che siano diretti al sistema locale o a un sistema remoto. Quindi il controllo successivo viene effettuato dalla catena OUTPUT e quindi vengono applicate le regole di POSTROUTING.
Ogni catena ha un criterio predefinito (DEFAULT) che viene applicato ai pacchetti che non trovano alcuna corrispondenza con le regole della catena stessa. In aggiuna possono essere create delle catene utente per facilitare la gestione di firewall molto complessi.
Sebbene sia possibile gestire il firewall utilizzando i due tool iptables-save e iptables-restore, è preferibile creare un piccolo script che imposti le regole in modo da aver già una certa familiarità quando occorrerà modificare in modo più o meno radicale il firewall.
Per creare uno script è sufficiente aprire un editor di testo contenente:
#! /bin/sh
case "$1" in
start)
echo -n "Attivazione firewall... "
# INSERIRE QUI LE REGOLE DEL FIREWALL #
echo "done"
;;
stop)
echo -n "Disattivazione firewall... "
iptables -t filter -F INPUT ACCEPT
iptables -t filter -F OUTPUT ACCEPT
iptables -t filter -F FORWARD ACCEPT
iptables -t filter -P INPUT ACCPET
iptables -t filter -P OUTPUT ACCEPT
iptables -t filter -P FORWARD ACCEPT
echo "done"
;;
*)
echo "Usage: firewall.sh {start|stop}"
exit 1
;;
esac
exit 0
e salvere il documenti in /sbin/firewall.sh, dando i permessi di root e rendedolo eseguibile:
chown root.root /sbin/firewall.sh
chmod 750 /sbin/firewall.sh
Ad ogni riavvio sarà necessario richiamare lo script firewall.sh con il parametro start. Conviene quindi inserire tale comando in uno dei file esegiti automaticamente all'avvio.
Ad ogni modo per utilizzare i due tools forniti con iptable è sufficiente, una volta impostate tutte le regole del firewall, utilizzare
iptables-save > /etc/iptables.rules
per salvare tutte le regole nel file /etc/iptables.rules, e richiamare ad ogni avvio tale file con il comando
iptables-restore < /etc/iptables.rules
per riattivare il firewall.
Per utilizzare iptables occorre aver cura di avere installato una versione del kernel pari o superiore alla 2.4.0, avendo abilitato l'opzione
CONFIG_NETFILTER
(Network packet filtering) nella compilazilazione del kernel presente nel sottomenu 'Networking options', e tutte le opzioni che si ritengono necessarie nel sottomenu 'IP: Netfilter Configuration'.
3. GESTIONE DELLE CATENE
Prima di tutto occorre impostare la politica di default della tabelle filter con cui netfilter gestirà i pacchetti in arrivo, in uscita o in transito sul sistema locale. Considerando che il traffico in entrata è potenzialmente dannoso è preferibile scegliere di bloccarlo totalmente, salvo altra specificazione:
iptables -t filter -P INPUT DROP
Con questa riga di comando abbiamo invocato il programma (iptables) scegliento (-t) la tabella filter e impostando la politica di default (-P) per la catena INPUT in modo che scarti tutti i pacchetti (DROP). DROP è chiamato target e significa che il pacchetto viene scartato senza nessun avviso al mittente. Altri target possibili sono ACCEPT (lascia passare il pacchetto), QUEUE (invia il pacchetto allo userspace o spazio utente per l'elaborazione) e RETURN (interrompe la catena corrente restituendo il controllo alla catena chiamante). Esistono altri target speciali che verranno trattati nella sezione Opzioni Avanzate.
Analogamente possiamo considerare il traffico in uscita relativamente sicuro, e quindi abilitandolo, riservandoci la possibilità di bloccare indirizzi o particolari porte in un secondo momento:
iptables -t filter -P OUTPUT ACCEPT
A meno che l'host locale non sia utilizzato come router conviene disabilitare il traffico in transito:
iptables -t filter -P FORWARD DROP
Nel caso invece che il sistema locale funga da router, oltre ad abilitare il traffico via iptables:
iptables -t filter -P FORWARD ACCEPT
occorre assicurarsi che sia abilitata anche l'opzione del kernel:
echo 1 > /proc/sys/net/ipv4/conf/all/forwarding
In questo modo tutte le interfacce permettono il transito di pacchetti destinati a host remoti. Alternativamente è possibile specificare singolarmente quale interfacce abilitare all'IP forwarding sostituendo a 'all' il nome dell'interfaccia, esempio:
echo 1 > /proc/sys/net/ipv4/conf/eth0/forwarding
abilita l'IP forwarding sull'interfaccia eth0.
Il passo successivo è decidere cosa può passare nelle catene con politica DROP e cosa non può passare nelle catene con politica impostata a ACCEPT. Iniziamo con la catena INPUT che dovrà permettere tutti i pacchetti generati ad esempio da connessioni http per permettere la visualizzazione di siti internet, o da connessioni smtp e pop3 per permettere la posta in entrata e uscita:
Abbiamo quindi abilitato il traffico di pacchetti che provengono dalla porta 80 (http), 25 (smtp) e 110 (pop3), abilitando di fatto i client protetti dal firewall all'utilizzo della posta e del web. Infatti quando un client dietro al firewall richiede una connessione web lo fa comunicando alla porta 80 del server web, che gli risponde con pacchetti provenienti dalla porta 80 e quindi abilitati a passare attraverso il firewall. Una nota sull'opzione '-p' che permette di specificare il tipo di protocollo tra quelli specificati in /etc/protocols, anche se i più utilizzati sono sicuramente tcp, udp, icmp e il valore speciale all che indica tutti i protocolli ed è il valore predefinito se '-p' non viene specificato:
in questo modo abilitiamo in uscita il servizio di DNS che utilizza sia il protocollo tcp che quello udp. Analogamente:
iptables -t filter -A INPUT -p icmp --icmp-type -j ACCEPT
permette a tutti i pacchetti icmp di arrivare all'host locale. Poichè alcuni ritengono sconveniente che il proprio host risponda alle richieste echo-reply (i cosidetti ping) è possibile disabilitare questa funzione permettendo a tutti gli altri pacchetti icmp di passare:
abbiamo quindi creato (-N) una catena chiamata SERVICES che utilizzeremo per gestire le connessione all'host locale fatte su porte privilegiate (cioè comprese tra 1 e 1024). Questo non è essenziale poichè è possibile gestire le regole tutte su una catena, ma può essere di aiuto per separare firewall troppo lunghi in tabelle diverse e più facilmente mantenibili.
Ulteriori opzioni per la gestione delle catene sono:
Flush '-F': rimuove tutte le regole di una catena, utile per disabilitare il firewall.
iptables -t filter -F INPUT
Zero 'Z': azzera i contatori dei pacchetti e dei byte della catena specificata:
iptables -t services -Z INPUT
Delete '-X': cancella la catena specificata:
iptables -t filter -X SERVICES
Rename '-E': rinomina la catena specificata e aggiorna anche tutti i riferimenti ad essa:
iptables -t filter -E SERVICES SERVIZI
Check '-C': controlla la catena simulando un pacchetto e controllandone la gestione (funzione non ancora implementata)
List '-L': elenca le regole contenute nella catena specificata:
iptables -t filter -L INPUT
4. PARAMETRI AGGIUNTIVI
In ogni regola è possibile specificare sia l'indirizzo sorgente che quello di destinazione del pacchetto da controllare; questo è fattibile tramite le opzioni '-s' e '-d', specificando anche l'indirizzo IP o il nome host rispettivamente sorgente e destinazione:
iptables -t filter -A INPUT -s 192.168.0.1 -j DROP
nega tutti i pacchetti provenienti dall'indirizzo IP 192.168.0.1
iptables -t filter -A INPUT -s 192.168.0.0/16 -j DROP
blocca tutti i pacchetti provenienti da qualsiasi indirizzo di classe C
iptables -t filter -A INPUT -d darkmoon.outworld.pvt -j DROP
blocca tutti i pacchetti destinati all'host darkmoon.outworld.pvt. Il nome dell'host deve essere risolvibile tramite DNS, altrimenti si avrà un errore del tipo 'not found', ovvero host non trovato.
L'opzione '-i' permette di specificare l'interfaccia o le interfaccie uscenti sul quale la regola deve operare. Per le interfacce entranti si utilizza l'opzione '-o':
iptables -t filter -A INPUT -i lo -s ! 127.0.0.0/8 -j DROP
blocca tutti gli IP sull'interfaccia di loopback con indirizzo sorgente diverso dalla classe 127.0.0.0/8. Infatti pacchetti con indirizzo sorgente/destinazione diverso da 127.0.0.0/8 non devono circolare sull'interfaccia di loopback.
E' possibile anche specificare più interfacce utilizzando il metacarattere '+':
iptables -t filter -A INPUT -i eth+ -d 192.168.0.0/16 -j DROP
permette il traffico verso la rete locale su tutte le interfacce che iniziano per eth, quindi eth0, eth1...
L'opzione '-f' permette di applicare la regola solo dal secondo frammento di pacchetto in poi.
5. OPZIONI AVANZATE
Esistono alcune opzioni che influiscono solo la visualizzazione del comando iptables, e in particolare utilizzando '-L': Verbose '-v': visualizza in dettaglio l'operazione richiesta, in particolare con iptables -L mostra il numero dei pacchetti, dei bytes, il nome della catena, il protocollo specificato, le eventuali opzioni, la sorgente e la destinazione comprensivi di eventuali porte.
Numeric '-n': visualizza le regole utilizzando gli indirizzi IP e le porte in formato numerico invece che risolvendoli rispettivamente con il nome host e il tipo di servizio specificato in /etc/services.
Exact '-x': visualizza il valore esatto dei pacchetti e dei bytes in formato esatto invece che arrotondarli.
Line numbers '--line-numbers': mostra il numero identificativo accanto ad ogni regola.
Match '-m': permette di caricare delle estensioni aggiuntive associate al modulo specificato:
'-m mac' utilizzato con l'opzione '--mac-source' permette di specificare l'indirizzo mac sorgente che deve essere fornito in notazione esadecimale separata dal carattere ':' (es. 00:00:E8:E5:7E:C7)
'-m limit' utilizzato con l'opzione '--limit' permette di controllare i pacchetti fino al raggiungimento del limite specificato. Utile in particolare con il target
LOG in modo da non avere i log riempiti inutilmente da pacchetti provenienti dalla stessa connessione. L'opzione '--limit' richiede di specificare un valore in ore (n/h), minuti (n/m) o secondi (n/s):
iptables -t filter -A INPUT -p tcp -m limit --limit 1/s -j LOG '-m limit' utilizzato con l'opzione '--limit-burst', simile all'opzione precedente, permette di controllare i pacchetti fino al raggiungimento del numero specificato:
iptables -t filter -A INPUT -p tcp -m limit --limit-burst 1 -j LOG '-m multiport' utilizzato con l'opzione '--source-port' utilizzato solo con l'opzione '-p' applicata a 'tcp' o 'udp' permette di specificare un elenco di porte sorgente separate da una virgola;
'-m multiport' utilizzato con l'opzione '--destination-port' utilizzato solo con l'opzione '-p' applicata a 'tcp' o 'udp' permette di specificare un elenco di porte destinazione separate da una virgola;
'-m multiport' utilizzato con l'opzione '--port' utilizzato solo con l'opzione '-p' applicata a 'tcp' o 'udp' permette di specificare un elenco di porte che il pacchetto deve avere come porta sorgente e destinazione e tra loro uguali:
'-m mark' utilizzato con l'opzione '--mark' permette di controllare esplicitamente i pacchetti che sono stati marcati nella tabella MANGLE (si veda il target MARK analizzato in seguito):
iptables -t filter -A INPUT -p tcp -m mark --mark 1 -j DROP
E' possibile specificare anche la maschera che il pacchetto deve avere; come maschera s'intende o la mashcera di rete o il numero di bit contati da sinistra che specificano la mschera di rete.
'-m owner' utilizzato con l'opzione '--uid-owner' permette di controllare i pacchetti generati da un processo appartenente all'utente specificato;
'-m owner' utilizzato con l'opzione '--gid-owner' permette di controllare i pacchetti generati da un processo con gruppo uguale a quello specificato;
'-m owner' utilizzato con l'opzione '--pid-owner' permette di controllare i pacchetti generati da un processo con ID specificato;
'-m owner' utilizzato con l'opzione '--sid-owner' permette di controllare i pacchetti generati da un processo con sessionid specificato:
iptables -t filter -A OUTPUT -p tcp -m owner --gid-owner nonet -j DROP
scarta tutti i pacchetti creati da utenti appartenenti al gruppo nonet.
'-m state' utilizzato con l'opzione '--state' permette di controllare i pacchetti in base allo stato della connessione a cui essi appartengono. Gli stati validi sono: INVALID (i pacchetti non appartengono a nessuna connessione precedentemente creata), ESTABLISHED (i pacchetti appartengono ad una connessione già stabilita), NEW (i pacchetti stanno creando una unova connessione) e RELATED (i pacchetti stanno instaurando una nuova connessione ma associata ad una vecchia connessione già stabilita, come può avenire con un tradferimento FTP).
'-m tos' utilizzato con l'opzione '--tos' permette di controllare i pacchetti in base al campo Type Of Service. Per vedere tutti i valori TOS validi utilizzare:
iptables -m tos -h
Similmente a '-m', '-p' premette di caricare delle estensioni agguntive associate al protocollo specificato:
'-p tcp' rende possibile l'utilizzo delle opzioni:
'--sport' che permette di specificare la porta sorgente che il pacchetto deve avere affinchè l'azione vena eseguita;
'--dport' che permette di specificare la porta destinazione che il pacchetto deve avere affinchè l'azione vena eseguita;
'--tcp-flags check compare' che permette di specificare quali opzioni del pacchetto controllare (check) e quali sono richieste (compare) affinchè la regola venga eseguita:
iptables -t filter -A INPUT -p tcp --dport 80 --tcp-flags SYN,RST,ACK SYN -j LOG
che può essere riassunta mediante l'opzione '--syn':
I flag validi all'opzione '--tcp-flags' sono: SYN, ACK, FIN, RST, URG, PSH, ALL e NONE, dove gli ultimi due flag stanno a indicare ripettivamente tutti i flag e nessun flag.
'-p udp' rende possibili le opzioni '--sport' e '--dport' che vengono utilizzate esattamente come nel protocollo tcp.
'-p icmp' permette di specificare quale tipo di pacchetto icmp analizzare:
I nomi dei pacchetti icmp validi sono quelli presenti nella lista data da: 'iptables -p icmp -h'.
Il target LOG viene utilizzato per registrare i pacchetti nei log di sistema. Può essere uttilizzato assieme ad alcune opzioni:
'--log-level' permette di specificare il numero o il nome del livello di log (per maggiori informazioni utilizzare 'man syslog.conf');
'--log-prefix' registra ogni riga di log anteponendo il prefisso specificato in modo distinguerli più velocemente dagli altri log di sistema;
'--log-tcp-sequence' registra i numeri di sequenza TCP.Questo è rischioso se altri utenti hanno accesso ai log.
'--log-tcp-options' registra le opzioni dell'intestazione del pacchetto TCP;
'--log-ip-options' registra le opzioni dell'intestazione del pacchetto IP.
iptables -t filter -A INPUT -p tcp --syn -j LOG --log-prefix "FW: Connessione " --log-level info
Registra tutte le connessioni al sistema locale registrandole a livello info.
Il target MARK permette di contrassegnare i pacchetti con un valore in modo da poterli riconoscere in un secondo momento. Il target MARK viene utilizzato con l'opzione '--set-mark' per specificare il valore con cui marcare i pacchetti, ed è valido solo nella tabella MANCGLE.
iptables -t mangle -A PREROUTING -p tcp --syn -j MARK --set-mark 1
Nell'esempio abbiamo prima marcato i pacchetti che tentano una connessione e poi in un secondo tempo li abbiamo loggati.
Il target REJECT utilizzato con l'opzione '--reject-with' elimina il pacchetto restituendo il messaggio ICMP specificato al mittente.
Il target TOS utilizzato con l'opzione '--set-tos' imposta il campo Type Of Service come specificato, nell'intestazione IP. I valori validi possono essere ottenuto con il comando 'iptables -j TOS -h'.
6. NAT
Network Address Translation dettta comunemente NAT è il nome della pratica comunemente utilizzata da utenti, aziende, provider per modificare l'indirizzo IP e la porta sorgente o destinazione di un pacchetto. NAT si divide in SNAT quando viene alterato l'indirizzo IP sorgente e DNAT quando viene alterato l'indirizzo di destinazione. Tre sono i casi più comuni di utilizzo della NAT:
Masquerading (SNAT): utile quando si necessita di condividere una connessione internet con indirizzo IP singolo ad una intera rete di computer.
In questo caso ogni pacchetto in uscita avrà come indirizzo IP sorgente l'unico IP pubblico al posto dell'IP privato della macchina che ha generato il pacchetto stesso.
IP Redirect (DNAT): utile quando si possiede un firewall per controllare il traffico ma si vuole permettere all'esterno di raggiungere alcuni server interni alla rete. In questo caso i pacchetti inviati a certe porte dell'indirizzo IP del firewall verranno rediretti su altri IP dove saranno in ascolo i server.
Transparent Proxy (DNAT): utile quando si vuole creare un sistema di proxy trasparente. In questo caso tutti i pacchetti in uscita dalla porta 80 (www) verranno rediretti sulla porta dove sarà in ascolto il proxy server.
DNAT viene effettuata nella catena PREROUTING e quindi prima che il sistema decida dove indirizzare i pacchetti in arrivo. DNAT permette di cambiare l'indirizzo IP destinazione con uno o più indirizzi:
iptables -t nat -A PREROUTING -j DNAT --to 192.168.0.5
iptables -t nat -A PREROUTING -j DNAT --to 192.168.0.5-192.168.0.10
Nel primo caso abbiamo rediretto i pacchetti uscenti all'indirizzo 192.168.0.5, nel secondo caso abbiamo specificato un range d'indirizzi possibili, nel terzo caso abbiamo rediretto tutti i pacchetti destinati alla porta 80 (www) alla porta 8080 di un proxy server. Nel caso di proxy server installato sul sistema locale quest'ultimo caso può essere cambiato in:
In questo caso abbiamo cambiato l'indirizzo sorgente IP privato con un indirizzo IP pubblico in modo da permettere all'intera rete di utilizzare internet. Un caso particolare di SNAT è il MASQUERADE che viene utilizzato solitamente quando si ha a che fare con una connessione dialup a indirizzo dinamico:
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
Anche con MASQUERADE è possibile utilizzare l'opzione '--to-ports' già analizzata prima.
7. implementazione di un firewall
Prima di cominciare a scrivere il proprio firewall bisogna avere le idee particolarmente chiare su quello che si vuole fare. Questa implementazione è solo di esempio, può andare benissimo come punto di partenza, e forse è un po' troppo avanzato per semplici sistemi casalinghi.
Ecco come di presenta la rete interna su cui lavorare:
1 - Il traffico verso l'esterno viene considerato sicuro e abilitato per default:
iptables -t filter -P OUTPUT ACCEPT
2 - Il traffico verso l'interno viene considerato pericoloso e negato per default:
iptables -t filter -P INPUT DROP
3 - Il traffico in transito viene abilitato per default:
iptables -t filter -P FORWARD ACCEPT
4 - Tutti i tentativi di connessione devono essere loggati:
iptables -t filter -A INPUT -p tcp --syn -j LOG
5 - Le connessioni generate dalla rete interna 192.168.0.0/24 verso internet non devono essere bloccate.
iptables -t filter -m state --state RELATED,ESTABLISHED -j ACCEPT
6 - La rete 192.168.1/24 (DMZ) non deve avere alcun accesso alla rete 192.168.0.0/24, e meglio ancora devono essere negati tutti i tentativi di connessione verso l'esterno (possibile manomissione della DMZ):
iptables -t filter -A FORWARD -s 192.168.1.0/24 -p tcp --syn -j DROP
7 - I le richieste echo-request (ping) non vengono accettate:
iptables -t filter -A INPUT -p icmp --icmp-type echo-request -j DROP
8 - Viene caricata una lista di IP bloccati (IP pericolosi, vietati o privati):
for ip in blacklist; do
iptables -t filter -A INPUT -s $ip -j DROP
done
9 - La rete è collegata a internet tramite un unico IP pubblico quindi sarà necessario attivare una sorta di mascheramento:
iptables -t filter -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
iptables -t nat -A POSTROUTING -o ppp0 -j MASQUERADE
10 - Attiviamo per la rete 192.168.0.0/24 un proxy trasparente che è in ascolto sulla porta 3128:
iptables -t net -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 3128
11 - Le connessioni http, ftp e mail verso il nostro IP pubblico dovranno essere redirette sulla DMZ.
iptables -t nat -A PREROUTING -p tcp -d IP --dport 80 -j DNAT --to 192.168.1.2
iptables -t nat -A PREROUTING -p tcp -d IP --dport 20 -j DNAT --to 192.168.1.3
iptables -t nat -A PREROUTING -p tcp -d IP --dport 21 -j DNAT --to 192.168.1.3
iptables -t nat -A PREROUTING -p tcp -d IP --dport 25 -j DNAT --to 192.168.1.4
8. Opzioni sperimentali
Esistono alcune opzioni interessanti ma ancora considerate sperimentali:
Il target MIRROR permette di rimbalzare il pacchetto direttamente al mittente;
Il target TCPMSS permette di risolvere alcuni problemi di connessione derivanti da server che bloccano il pacchetto ICMP Fragmention Needed (il sintomo più comune è una connessione al server remoto, senza trasferimento effettivo di dati):
iptables -t filter -A FORWARD -p tcp --tcp-flags SYN,RST SYN -j TCPMSS --clamp-mss-to-pmtu
Securityinfos 2002 Securityinfos, all rights reserved.
Totali
News presenti : 895 News estere presenti : 64352 Articoli presenti : 14 Comunicati Stampa : 306 Tools presenti : 0 Links presenti : 1015 Annunci lavoro : 0 Libri : 120 Eventi presenti : 9 Aziende presenti : 12