Impostazione di un firewall di rete

Prima di leggere questa parte del capitolo bisogna avere già installato iptables come descritto nella sezione precedente.

Introduzione alla creazione di un firewall

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.

Significato della parola "firewall"

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.

Firewall con una zona demilitarizzata [qui non ulteriormente descritto]

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.

Packetfilter

Questo tipo di firewall fa instradamento o mascheramento, ma non mantiene una una tabella pubblica dei flussi entranti di comunicazione. E' veloce, ma piuttosto limitato nella sua abilità di bloccare pacchetti inappropriati senza bloccare i pacchetti desiderati.

Ora si può iniziare a costruire il proprio Firewall

[Attenzione]

Attenzione

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.

[Nota]

Nota

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.

Personal Firewall

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.

Mascheramento del router

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.

[Nota]

Nota

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.

BusyBox

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.

[Nota]

Nota

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.

Conclusione

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.

Informazione extra

Last updated on