Prima di leggere questa parte del capitolo bisogna avere già installato iptables come descritto nella sezione precedente.
In generale lo scopo di un firewall è di proteggere un computer o una rete da accessi maliziosi.
In un mondo perfetto, ogni demone o servizio in ogni macchina è perfettamente configurato e immune da difetti come buffer overflow o altri problemi riguardanti la propria sicurezza. Inoltre si dà fiducia ad ogni utente che accede ai propri servizi. In questo mondo non è necessario avere un firewall.
Tuttavia nel mondo reale i demoni possono essere mal configurati e exploit contro servizi essenziali sono liberamente disponibili. Si potrebbe voler scegliere quali servizi rendere accessibili da certe macchine o si potrebbe voler limitare quelle macchine o applicazioni che permettono un accesso all'esterno. In alternativa si potrebbe semplicemente non dare fiducia ad alcune delle porprie applicazioni o utenti. Probabilmente si è connessi a Internet. In questo mondo un firewall è essenziale.
Non si supponga, tuttavia, che avere un firewall renda superflua un'attenta configurazione o che esso renda innocua ogni configurazione negligente. Non previene da parte di qualcuno l'exploit di un servizio che si è intenzionalmente offerto ma non è stato recentemente aggiornato o patchato dopo che un exploit è divenuto pubblico. Nonostante la presenza di un firewall è necessario mantenere applicazioni e demoni sul proprio sistema correttamente configurati e aggiornati. Un firewall non è la cura per tutto, ma deve essere una parte essenziale della strategia di sicurezza globale.
La parola firewall può avere molti diversi significati.
E' un dispositivo hardware o un programma software venduto commercialmente da compagnie come Symantec che dichiarano che rende sicuro un home o desktop computer con accesso Internet. Questo tipo di firewall è altamente rilevante per utenti che non sanno come ai loro computer si può accedere via Internet o come disabilitare questo accesso, specialmente se essi sono sempre online e connessi attraverso connessioni broadband.
Questo è un sistema messo tra Internet e una intranet. Per minimizzare il rischio di compromettere lo stesso firewall esso generalmente deve avere solo un ruolo: quello di proteggere la intranet. Sebbene non completamente privo di rischi, i lavori di fare l'instradamento e il mascheramento IP (riscrivere gli header IP dei pacchetti che esso instrada da client con indirizzi IP privati nella Internet così che essi sembrino venire dallo stesso firewall) sono comunemente considerati relativamente sicuri.
Si tratta spesso di un vecchio computer che può essere stato accantonato e mai dimenticato, che esegue funzioni di mascheramento o instradamento, ma che offre servizi non firewall come una web-cache o posta. Esso può essere usato per reti casalinghe, ma non è considerato sicuro quanto una macchina solo firewall, poiché la combinazione di server e router/firewall su una macchina aumenta la complessità del setup.
Questa box esegue mascheramento o instradamento, ma garantisce accesso pubblico a certi rami della propria rete che, a causa di IP pbblici e una struttura fisicamente separata, è essenzialmente una rete separata con accesso diretto ad internet. I server su questa rete sono quelli che devono essere facilmente accessibili sia da Internet che da intranet. Il firewall protegge entrambe le reti. Questo tipo di firewall ha un minimo di tre interfacce di rete.
Questa introduzione su come impostare un firewall non è una guida completa alla sicurezza dei sistemi. Un firewall è una questione complessa, che richiede un'attenta configurazione. Gli script riportati qui vogliono semplicemente dare esempi di come funziona un firewall. Essi non sono fatti per adattarsi a nessuna particolare configurazione e potrebbero non fornire una protezione completa da un attacco.
La personalizzazione di questi script per la propria situazione specifica sarà necessaria se si vuole una configurazione ottimale, ma sarà necessario studiare seriamente la documentazione su iptables e la creazione di firewall in generale prima di fare manipolazioni. Dare un'occhiata all'elenco di Links for further reading alla fine di questa sezione per maggiori dettagli. Lì si trova un elenco di URL che contiene informazioni piuttosto complete sulla costruzione del proprio firewall.
Lo script di configurazione del firewall installato nell'ultima sezione differisce dallo script standard di configurazione. Esso ha solo due dei target standard: start e status. Gli altri target sono clear e lock. Per esempio quando si esegue:
/etc/rc.d/init.d/iptables start
il firewall verrà riavviato come all'avvio del sistema. Il target status presenterà un elenco di tutte le regole attualmente implementate. Il target clear disattiva tutte le regole del firewall e il target lock bloccherà tutti i pacchetti in ingresso e uscita dal computer con l'eccezione dell'interfaccia di loopback.
Il firewall principale di avvio si trova nel file /etc/rc.d/rc.iptables. La sezione seguente fornisce tre diversi approcci che possono essere usati per un sistema.
Bisognerebbe sempre eseguire le regole del proprio firewall da uno script. Questo assicura consistenza e una registrazione di ciò che è stato fatto. Esso permette anche l'inserimento di commenti che sono essenziali per la comprensione delle regole molto dopo che esse sono state scritte.
Un Personal Firewall è disegnato per permettere l'accesso a tutti i servizi offerti in Internet, ma mantenendo la propria postazione sicura e i propri dati privati.
Di seguito c'è una versione leggermente modificata delle raccomandazioni di Rusty Russell dal Linux 2.4 Packet Filtering HOWTO. Esse sono applicabili anche ai kernel Linux 2.6.
cat > /etc/rc.d/rc.iptables << "EOF" #!/bin/sh # Begin $rc_base/rc.iptables # Insert connection-tracking modules # (not needed if built into the kernel) modprobe ip_tables modprobe iptable_filter modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ipt_state modprobe ipt_LOG # Enable broadcast echo Protection echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Disable Source Routed Packets echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route # Enable TCP SYN Cookie Protection echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Disable ICMP Redirect Acceptance echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # Don¹t send Redirect Messages echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects # Drop Spoofed Packets coming in on an interface, where responses # would result in the reply going out a different interface. echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter # Log packets with impossible addresses. echo 1 > /proc/sys/net/ipv4/conf/all/log_martians # be verbose on dynamic ip-addresses (not needed in case of static IP) echo 2 > /proc/sys/net/ipv4/ip_dynaddr # disable Explicit Congestion Notification # too many routers are still ignorant echo 0 > /proc/sys/net/ipv4/tcp_ecn # Set a known state iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # These lines are here in case rules are already in place and the # script is ever rerun on the fly. We want to remove all rules and # pre-exisiting user defined chains before we implement new rules. iptables -F iptables -X iptables -Z iptables -t nat -F # Allow local-only connections iptables -A INPUT -i lo -j ACCEPT # Free output on any interface to any ip for any service # (equal to -P ACCEPT) iptables -A OUTPUT -j ACCEPT # Permit answers on already established connections # and permit new connections related to established ones # (e.g. port mode ftp) iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT # Log everything else. What's Windows' latest exploitable vulnerability? iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT " # End $rc_base/rc.iptables EOF
Questo script è piuttosto semplice, esso scarta tutto il traffico in ingresso al proprio computer che non è partito dalla propria postazione, ma nel momento in cui si sta semplicemente navigando in Internet difficilmente si supereranno i suoi limiti.
Se si incontrano di frequente certi rallentamenti nell'accesso a server ftp, dare un'occhiata a BusyBox example number 4.
Anche se si hanno demoni o servizi in funzione sul proprio sistema questi saranno inaccessibili ovunque ma dal proprio stesso computer. Se si vuole permettere l'accesso ai servizi sulla propria macchina, come ssh o ping, dare un'occhiata presso BusyBox.
Un vero firewall ha due interfacce, una connessa a una intranet, in questo esempio eth0, e una connessa a Internet, qui ppp0. Per fornire la massima sicurezza per il firewall stesso assicurarsi che non ci siano server inutili in funzione, come X11 ed altri. Come principio generale il firewall stesso non deve accedere a nessun servizio non sicuro (si pensi a un server remoto che dà risposte che causano un crash del demone sul proprio sistema o, anche peggio, che implementa un worm attraverso un buffer-overflow).
cat > /etc/rc.d/rc.iptables << "EOF" #!/bin/sh # Begin $rc_base/rc.iptables echo echo "You're using the example configuration for a setup of a firewall" echo "from Beyond Linux From Scratch." echo "This example is far from being complete, it is only meant" echo "to be a reference." echo "Firewall security is a complex issue, that exceeds the scope" echo "of the configuration rules below." echo "You can find additional information" echo "about firewalls in Chapter 4 of the BLFS book." echo "http://www.linuxfromscratch.org/blfs" echo # Insert iptables modules (not needed if built into the kernel). modprobe ip_tables modprobe iptable_filter modprobe ip_conntrack modprobe ip_conntrack_ftp modprobe ipt_state modprobe iptable_nat modprobe ip_nat_ftp modprobe ipt_MASQUERADE modprobe ipt_LOG modprobe ipt_REJECT # Enable broadcast echo Protection echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts # Disable Source Routed Packets echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route # Enable TCP SYN Cookie Protection echo 1 > /proc/sys/net/ipv4/tcp_syncookies # Disable ICMP Redirect Acceptance echo 0 > /proc/sys/net/ipv4/conf/all/accept_redirects # Don¹t send Redirect Messages echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects # Drop Spoofed Packets coming in on an interface where responses # would result in the reply going out a different interface. echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter # Log packets with impossible addresses. echo 1 > /proc/sys/net/ipv4/conf/all/log_martians # Be verbose on dynamic ip-addresses (not needed in case of static IP) echo 2 > /proc/sys/net/ipv4/ip_dynaddr # Disable Explicit Congestion Notification # Too many routers are still ignorant echo 0 > /proc/sys/net/ipv4/tcp_ecn # Set a known state iptables -P INPUT DROP iptables -P FORWARD DROP iptables -P OUTPUT DROP # These lines are here in case rules are already in place and the # script is ever rerun on the fly. We want to remove all rules and # pre-exisiting user defined chains before we implement new rules. iptables -F iptables -X iptables -Z iptables -t nat -F # Allow local connections iptables -A INPUT -i lo -j ACCEPT iptables -A OUTPUT -o lo -j ACCEPT # Allow forwarding if the initiated on the intranet iptables -A FORWARD -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A FORWARD -i ! ppp+ -m state --state NEW -j ACCEPT # Do masquerading # (not needed if intranet is not using private ip-addresses) iptables -t nat -A POSTROUTING -o ppp+ -j MASQUERADE # Log everything for debugging # (last of all rules, but before policy rules) iptables -A INPUT -j LOG --log-prefix "FIREWALL:INPUT " iptables -A FORWARD -j LOG --log-prefix "FIREWALL:FORWARD" iptables -A OUTPUT -j LOG --log-prefix "FIREWALL:OUTPUT " # Enable IP Forwarding echo 1 > /proc/sys/net/ipv4/ip_forward EOF
Con questo script la propria intranet dovrebbe essere ragionevolmente sicura contro attacchi esterni. Il fatto che nessuno sia in grado di impostare una nuova connessione a qualunque servizio interno, se esso è mascherato, rende la propria intranet invisibile a Internet. Inoltre il proprio firewall dovrebbe essere relativamente sicuro, poiché non ci sono in funzione servizi che un cracker possa attaccare.
Se l'interfaccia con la quale ci si connette a Internet non si connette via ppp, bisognerà sostituire ppp+ con il nome dell'interfaccia, ad esempio eth1, che si usa.
Questo scenario non è molto differente da Mascheramento del router, ma offre in più alcuni servizi alla propria intranet. Esempi di questo possono essere quando si vuole amministrare il proprio firewall da un altro host sulla propria intranet o usarlo come proxy o name server.
Descrivere un vero concetto di come proteggere un server che offre servizi su Internet va molto oltre lo scopo di questo documento. Vedere i riferimenti al termine di questa sezione per maggiori informazioni.
Siate cauti. Ogni servizio abilitato rende il proprio setup più complesso e il proprio firewall meno sicuro. Si è esposti al rischio di servizi mal configurati o di eseguire un servizio con un bug sfruttabile. Un firewall normalmente non deve eseguire nessun servizio extra. Vedere l'introduzione al Mascheramento del router per alcuni ulteriori dettagli.
Se si vogliono aggiungere servizi come Samba o name server, che non necessitano di per sè un accesso ad Internet, le dichiarazioni aggiuntive sono piuttosto semplici e dovrebbero ancora essere accettabili dal punto di vista della sicurezza. Aggiungere semplicemente le seguenti linee allo script prima delle regole di log.
iptables -A INPUT -i ! ppp+ -j ACCEPT iptables -A OUTPUT -o ! ppp+ -j ACCEPT
Se demoni, come Squid, hanno di per sé accesso ad Internet generalmente si può aprire OUTPUT e restringere INPUT.
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT iptables -A OUTPUT -j ACCEPT
Tuttavia in generale non è consigliabile lasciare OUTPUT senza alcuna restrizione. Si perde qualunque controllo su trojan che vogliono "chiamare casa", e un po' di ridondanza nel caso si abbia (mal-)configurato un servizio in modo che esso annunci al mondo la sua esistenza.
Per raggiungere questo bisogna restringere INPUT e OUTPUT su tutte le porte ad eccezione di quelle che è assolutamente necessario avere aperte. Quali porte si hanno aperte dipende dai propri bisogni: per lo più le si troveranno cercando gli accessi falliti nei propri file di log.
Dare un'occhiata al seguente esempio:
Squid sta facendo il caching del web:
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT iptables -A INPUT -p tcp --sport 80 -m state --state ESTABLISHED \ -j ACCEPT
Il proprio name server di caching (es., named) fa le proprie ricerche via udp:
iptables -A OUTPUT -p udp --dport 53 -j ACCEPT
Si vuole poter fare il ping alla propria macchina per assicurarsi che sia ancora viva:
iptables -A INPUT -p icmp -m icmp --icmp-type echo-request -j ACCEPT iptables -A OUTPUT -p icmp -m icmp --icmp-type echo-reply -j ACCEPT
Se si accede di frequente a server ftp o si ama chattare, si potrebbero notare certi rallentamenti, poiché alcune implementazioni di questi demoni hanno la caratteristica di fare delle query a un identd sul proprio sistema per ottenere degli username. Sebbene in questo non ci sia un gran danno avere un identd in funzione non è raccomandato, poiché molti esperti di sicurezza ritengono che il servizio diffonda troppe informazioni aggiuntive.
Per evitare questi rallentamenti si possono rifiutare le richieste con un 'tcp-reset':
iptables -A INPUT -p tcp --dport 113 -j REJECT --reject-with tcp-reset
Per fare il log e scartare pacchetti non validi (pacchetti arrivati dopo un timeout di netfilter o certi tipi di scansione si rete):
iptables -I INPUT -p tcp -m state --state INVALID \ -j LOG --log-prefix "FIREWALL:INVALID" iptables -I INPUT -p tcp -m state --state INVALID -j DROP
Ogni cosa che venga da fuori non deve avere un indirizzo privato, questo è un attacco comune chiamato IP-spoofing:
iptables -A INPUT -i ppp+ -s 10.0.0.0/8 -j DROP iptables -A INPUT -i ppp+ -s 172.16.0.0/12 -j DROP iptables -A INPUT -i ppp+ -s 192.168.0.0/16 -j DROP
Ci sono altri indirizzi che si potrebbero anche voler scartare: 0.0.0.0/8, 127.0.0.0/8, 224.0.0.0/3 (multicast e sperimentale), 169.254.0.0/16 (Link Local Networks), e 192.0.2.0/24 (test network definito da IANA).
Se il proprio firewall è un client DHCP, bisogna far passare questi pacchetti:
iptables -A INPUT -i ppp0 -p udp -s 0.0.0.0 --sport 67 \ -d 255.255.255.255 --dport 68 -j ACCEPT
Per semplificare il debugging ed essere corretti verso qualcuno che voglia accedere a un servizio che è stato disabilitato, di proposito o per errore, si può fare un REJECT di tutti i pacchetti che vengono scartati.
Ovviamente questo deve essere fatto direttamente dopo il log come ultimissime linee prima che i pacchetti per policy siano scartati:
iptables -A INPUT -j REJECT
Questi sono solo esempi per mostrare alcune delle capacità del codice firewall in Linux. Dare un'occhiata alla man page di iptables. Lì si troveranno molte più informazioni. I numeri delle porte necessari per questo possono essere trovati in /etc/services, nel caso essi non siano stati trovati nel proprio log file.
Infine c'è un fatto che non bisogna dimenticare: lo sforzo speso nell'attacco di un sistema corrisponde al valore che il cracker si aspetta di guadagnare da esso. Se si è responsabili di informazioni di valore è necessario spendere tempo a proteggerle appropriatamente.
www.netfilter.org - Homepage del progetto netfilter/iptables
FAQ su Netfilter
HOWTO su Netfilter
en.tldp.org/LDP/nag2/x-087-2-firewall.html
en.tldp.org/HOWTO/Security-HOWTO.html
en.tldp.org/HOWTO/Firewall-HOWTO.html
www.ibm.com/developerworks/security/library/s-fire.html
www.ibm.com/developerworks/security/library/s-fire2.html
www.interhack.net/pubs/fw-faq/
www.linuxsecurity.com/docs/
www.little-idiot.de/firewall (Tedesco & datato, ma molto completo)
www.linuxgazette.com/issue65/stumpel.html
linux.oreillynet.com/pub/a/linux/2000/03/10/netadmin/ddos.html
staff.washington.edu/dittrich/misc/ddos
www.e-infomax.com/ipmasq
www.circlemud.org/~jelson/writings/security/index.htm
www.securityfocus.com
www.cert.org - tech_tips
security.ittoolbox.com
www.linux-firewall-tools.com/linux/
logi.cc/linux/athome-firewall.php3
www.insecure.org/reading.html
www.robertgraham.com/pubs/firewall-seen.html
Last updated on