5.14.1. Proteggere il sistema locale con un firewall
Potete usare le regole di un firewall per rendere più sicuro l'accesso al sistema ed anche per limitare le comunicazioni in uscita. Le regole del firewall possono anche essere utilizzate per proteggere i processi che non possono essere adeguatamente configurati per non fornire servizi ad alcune reti, indirizzi IP, etc..
Comunque, questo passaggio viene presentato per ultimo in questo manuale essenzialmente perché è molto meglio non dipendere unicamente dalle capacità di un firewall per proteggere un determinato sistema. La sicurezza in un sistema è data da livelli, in cui il firewall è l'ultimo da includere, una volta che tutti i processi sono stati adeguatamente irrobustiti. Potete facilmente immaginare un'installazione in cui un sistema è protetto solo dal firewall magari incorporato e un amministratore che incautamente rimuove le regole del firewall per qualche motivo (problemi con l'installazione, fastidio, errore umano...), questo sistema sarebbe parecchio esposto ad un attacco se non ci fosse nessun'altra protezione a garantirlo.
D'altra parte, impostare le regole di un firewall sul sistema può anche prevenire il verificarsi di alcuni fatti spiacevoli. Anche se i servizi forniti vengono configurati in modo sicuro, un firewall può proteggere da errate configurazioni o da servizi appena installati che non sono ancora stati configurati. Inoltre, una configurazione sicura previene il funzionamento di trojans che chiamano casa, finché il codice del firewall non viene rimosso. Notate che un intruso non necessita di un accesso superutente per installare un trojan locale che possa essere controllato da remoto (dato che il binding sulle porte è consentito se non si tratta di porte privilegiate e se queste funzionalità non sono state rimosse).
Quindi, il firewall, se impostato correttamente, dovrebbe avere una politica di negazione predefinita, secondo cui:
Le connessioni in ingresso vengono consentite solo ai servizi locali da macchine autorizzate.
outgoing connections are only allowed to services used by your system (DNS, web browsing, POP, email...).
La regola di inoltro nega qualsiasi cosa (a meno che non stiate proteggendo altri sistemi, vedete più in basso).
Tutte le altre connessioni in ingresso o in uscita vengono negate.
5.14.2. Utilizzare un firewall per proteggere altri sistemi
Un firewall Debian può anche essere installato per proteggere, con regole di filtraggio, accessi a sistemi posti dietro ad esso, limitando la loro esposizione su Internet. Il firewall può essere configurato per proteggere i sistemi dall'esterno verso la rete locale per l'accesso a determinati servizi (porte) che non sono pubblici. Per esempio, su un server di posta, solo la porta 25 (che fornisce il servizio di posta) ha bisogno di essere accessibile dall'esterno. Un firewall può essere configurato, anche se ci sono altri servizi di rete oltre a quelli pubblici, per respingere pacchetti (questo è conosciuto come filtraggio) diretti verso di sé.
Potete anche configurare un sistema Debian GNU/Linux come bridge firewall, ad esempio un firewall filtrante privo di indirizzo IP, completamente trasparente alla rete e che quindi non può essere attaccato direttamente. A seconda del kernel che avete installato potreste aver bisogno di installare la patch per il bridge firewall; andate quindi su
802.1d Ethernet Bridging durante la configurazione del kernel e abilitate la nuova opzione
netfilter (firewalling) support. Leggete
Sezione B.4, «Impostare un bridge firewall» per ulteriori informazioni su come meglio sfruttare questa funzionalità sul vostro sistema Debian GNU/Linux.
5.14.3. Configurare il firewall
L'installazione Debian predefinita, contrariamente ad altre distribuzioni Linux, non fornisce ancora all'amministratore un modo per impostare una configurazione per il firewall durante l'installazione, ma è possibile installare alcuni pacchetti per configurare il firewall (vedete
Sezione 5.14.3.1, «Uso dei pacchetti firewall»).
Of course, the configuration of the firewall is always system and network dependant. An administrator must know beforehand what is the network layout and the systems to protect, the services that need to be accessed, and whether or not other network considerations (like NAT or routing) need to be taken into account. Be careful when configuring your firewall, as Laurence J. Lane says in the iptables package:
The tools can easily be misused, causing enormous amounts of grief by completely crippling network access to a system. It is not terribly uncommon for a remote system administrator to accidentally get locked out of a system hundreds or thousands of miles away. You can even manage to get locked out of a computer who's keyboard is under your own fingers. Please, use due caution.
Ricordate: la semplice installazione di iptables (o di altri programmi per gestire firewall) non dà nessuna protezione, fornisce solamente il software. Per poter avere un firewall è necessario configurarlo!
Se non avete idea di come impostare delle regole per un firewall, è opportuno che consultiate il Packet Filtering HOWTO ed il NAT HOWTO, forniti da iptables per la lettura non in linea in /usr/share/doc/iptables/html/
.
5.14.3.1. Uso dei pacchetti firewall
L'impostazione manuale di un firewall può essere complicata per gli amministratori novizi (e talvolta anche per quelli esperti). Comunque, la comunità del free software ha creato un buon numero di strumenti che possono essere usati per configurare facilmente un firewall locale. Sappiate però che alcuni di questi strumenti sono più orientati verso una protezione esclusivamente locale (anche conosciuta come personal firewall) mentre alcuni sono molto più versatili e possono essere usati per configurare regole complesse per proteggere intere reti.
Alcuni software che possono essere usati per impostare regole di firewall in sistemi Debian sono:
Per sistemi desktop:
firestarter, un'applicazione GNOME orientata all'utente finale che include un'utile wizard per impostare velocemente le regole del firewall. L'applicazione comprende un'interfaccia grafica capace di controllare quando una regola del firewall blocca il traffico.
guarddog, un pacchetto di configurazione basato su KDE e rivolto sia ad utenti principianti che avanzati.
knetfilter, un'interfaccia grafica per KDE in grado di gestire le regole firewall e NAT di iptables (è un'alternativa, o concorrente che dir si voglia, del programma guarddog, anche se tende a soddisfare maggiormente le necessità di un utente esperto).
fireflier, un programma interattivo in grado di creare regole per iptables in base al traffico rilevato sul sistema e alle applicazioni presenti sul sistema stesso. È composto da un server e da un client, che vanno installati entrambi; oltre al server (fireflier-server) bisogna quindi anche scegliere uno dei vari client disponibili, ve ne sono per vari ambienti grafici: fireflier-client-gtk (basato sulle Gtk+ ), fireflier-client-kde (per ambiente KDE) e fireflier-client-qt (basato sulle QT ).
Per sistemi ad uso server (senza schermo):
fwbuilder, è un interfaccia grafica, scritta usando la programmazione orientata agli oggetti, che include dei generatori di regole per vari firewall, tra cui netfilter per Linux, pf (usato da OpenBSD, NetBSD, FreeBSD e MacOS X) ed un generatore di liste di accesso per i router. Le sue funzionalità sono paragonabili ai software per la gestione dei firewall comunemente usati dalle aziende. Include anche un'interfaccia a riga di comando che permette di sfruttare tutte le funzionalità del programma.
shorewall, un tool di configurazione per i firewall che fornisce supporto per IPsec così come un supporto limitato per il traffic shaping nonché per le definizioni delle regole di un firewall. La configurazione viene effettuata mediante un semplice insieme di file che vengono usati per generare le regole di iptables.
bastille, questa applicazione di irrobustimento viene descritta in
Capitolo 6, Irrobustimento automatico di un sistema Debian. Uno dei passi di irrobustimento configurabile dall'amministratore è la definizione del traffico di rete ammesso e vietato, che viene usato per generare un insieme di regole del firewall che il sistema eseguirà all'avvio.
In Debian vengono forniti diversi frontend a iptables; un elenco esaustivo che raffronta i differenti pacchetti software presenti viene mantenuta nella pagina
http://wiki.debian.org/Firewalls del wiki di Debian.
Da notare che alcuni dei pacchetti presentati precedentemente, installeranno degli script di firewalling che verranno eseguiti all'avvio del sistema. Testate gli script in maniera approfondita prima di riavviare, altrimenti potreste rimanere chiusi fuori dal sistema. Di solito, mescolando diversi pacchetti di firewalling, si possono ottenere effetti indesiderati, tipo che l'ultimo script ad essere eseguito sarà quello che configura il sistema (comportamento che potrebbe non essere quello desiderato). Consultate la documentazione del pacchetto e usate solo uno di questi setup.
Come già detto, alcuni programmi, come firestarter, guarddog e knetfilter sono interfacce grafiche di amministrazione che usano GNOME o (le ultime due) KDE. Queste applicazioni sono rivolte in particolare all'utente (ossia all'utente comune), a differenza di alcuni degli altri pacchetti dell'elenco, che invece potrebbero essere pensati più per gli amministratori. Alcuni dei programmi già menzionati (come bastille
) sono specializzati nell'impostare le regole del firewall che protegge l'host su cui girano ma non necessariamente per impostare regole di firewall per host che proteggono una rete (come invece fanno shorewall
o fwbuilder
).
Esiste poi un altro tipo di applicazione per firewall, ossia gli application proxy. Se cercate di configurare un firewall aziendale che faccia packet filtering e fornisca un certo numero di transparent proxy che analizzino il traffico in modo dettagliato, potete considerare l'utilizzo di zorp, che fa tutto questo in un unico programma. Potete anche impostare manualmente questo tipo di host per il firewall usando i proxy disponibili in Debian per differenti servizi; per il DNS usando bind (adeguatamente configurato), dnsmasq, pdnsd o totd, per l'FTP usando frox o ftp-proxy, per X11 usando xfwp, per IMAP usando imapproxy, per la mail usando smtpd, o per il POP3 usando p3scan. Per altri protocolli potete usare un proxy TCP generico come simpleproxy o un proxy SOCKS generico come dante-server, tsocks o socks4-server. Nella maggior parte dei casi, bisognerà anche usare un sistema di web caching (come squid) e di filtraggio web (come squidguard o dansguardian).
5.14.3.2. Configurazione manuale di init.d
Un'altra possibilità è quella di configurare manualmente le regole del firewall attraverso uno script in init.d che lanci tutti i comandi
iptables
. È sufficiente seguire la seguente procedura:
Revisionare lo script che segue ed adattarlo alle proprie esigenze.
Collaudare lo script ed esaminare i log di sistema per vedere il tipo di traffico che viene eliminato. Se lo state collaudando in remoto, vorrete lanciare la snippet shell di esempio per rimuovere il firewall (se non digitate nulla per 20 secondi), oppure potreste voler decommentare le definizioni della procedura di default deny (-P INPUT DROP e -P OUTPUT DROP) e verificare poi che il sistema non elimini alcun traffico legittimo.
Spostare lo script in /etc/init.d/myfirewall
.
Questo e' un esempio di uno script per un firewall:
#!/bin/sh
### BEGIN INIT INFO
# Provides: myfirewall
# Required-Start: $local_fs
# Required-Stop: $local_fs
# Default-Start: S
# Default-Stop: 0 6
# X-Start-Before: $network
# X-Stop-After: $network
# Short-Description: My custom firewall.
### END INIT INFO
#
# Simple example firewall configuration.
#
# Caveats:
# - This configuration applies to all network interfaces
# if you want to restrict this to only a given interface use
# '-i INTERFACE' in the iptables calls.
# - Remote access for TCP/UDP services is granted to any host,
# you probably will want to restrict this using '--source'.
#
# chkconfig: 2345 9 91
# description: Activates/Deactivates the firewall at boot time
#
# You can test this script before applying with the following shell
# snippet, if you do not type anything in 10 seconds the firewall
# rules will be cleared.
#---------------------------------------------------------------
# while true; do test=""; read -t 20 -p "OK? " test ; \
# [ -z "$test" ] && /etc/init.d/myfirewall clear ; done
#---------------------------------------------------------------
PATH=/bin:/sbin:/usr/bin:/usr/sbin
# Services that the system will offer to the network
TCP_SERVICES="22" # SSH only
UDP_SERVICES=""
# Services the system will use from the network
REMOTE_TCP_SERVICES="80" # web browsing
REMOTE_UDP_SERVICES="53" # DNS
# Network that will be used for remote mgmt
# (if undefined, no rules will be setup)
# NETWORK_MGMT=192.168.0.0/24
# If you want to setup a management network (i.e. you've uncommented
# the above line) you will need to define the SSH port as well (i.e.
# uncomment the below line.) Remember to remove the SSH port from the
# TCP_SERVICES string.
# SSH_PORT="22"
if ! [ -x /sbin/iptables ]; then
exit 0
fi
fw_start () {
# Input traffic:
/sbin/iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# Services
if [ -n "$TCP_SERVICES" ] ; then
for PORT in $TCP_SERVICES; do
/sbin/iptables -A INPUT -p tcp --dport ${PORT} -j ACCEPT
done
fi
if [ -n "$UDP_SERVICES" ] ; then
for PORT in $UDP_SERVICES; do
/sbin/iptables -A INPUT -p udp --dport ${PORT} -j ACCEPT
done
fi
# Remote management
if [ -n "$NETWORK_MGMT" ] ; then
/sbin/iptables -A INPUT -p tcp --src ${NETWORK_MGMT} --dport ${SSH_PORT} -j ACCEPT
fi
# Remote testing
/sbin/iptables -A INPUT -p icmp -j ACCEPT
/sbin/iptables -A INPUT -i lo -j ACCEPT
/sbin/iptables -P INPUT DROP
/sbin/iptables -A INPUT -j LOG
# Output:
/sbin/iptables -A OUTPUT -j ACCEPT -o lo
/sbin/iptables -A OUTPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# ICMP is permitted:
/sbin/iptables -A OUTPUT -p icmp -j ACCEPT
# So are security package updates:
# Note: You can hardcode the IP address here to prevent DNS spoofing
# and to setup the rules even if DNS does not work but then you
# will not "see" IP changes for this service:
/sbin/iptables -A OUTPUT -p tcp -d security.debian.org --dport 80 -j ACCEPT
# As well as the services we have defined:
if [ -n "$REMOTE_TCP_SERVICES" ] ; then
for PORT in $REMOTE_TCP_SERVICES; do
/sbin/iptables -A OUTPUT -p tcp --dport ${PORT} -j ACCEPT
done
fi
if [ -n "$REMOTE_UDP_SERVICES" ] ; then
for PORT in $REMOTE_UDP_SERVICES; do
/sbin/iptables -A OUTPUT -p udp --dport ${PORT} -j ACCEPT
done
fi
# All other connections are registered in syslog
/sbin/iptables -A OUTPUT -j LOG
/sbin/iptables -A OUTPUT -j REJECT
/sbin/iptables -P OUTPUT DROP
# Other network protections
# (some will only work with some kernel versions)
echo 1 > /proc/sys/net/ipv4/tcp_syncookies
echo 0 > /proc/sys/net/ipv4/ip_forward
echo 1 > /proc/sys/net/ipv4/icmp_echo_ignore_broadcasts
echo 1 > /proc/sys/net/ipv4/conf/all/log_martians
echo 1 > /proc/sys/net/ipv4/ip_always_defrag
echo 1 > /proc/sys/net/ipv4/icmp_ignore_bogus_error_responses
echo 1 > /proc/sys/net/ipv4/conf/all/rp_filter
echo 0 > /proc/sys/net/ipv4/conf/all/send_redirects
echo 0 > /proc/sys/net/ipv4/conf/all/accept_source_route
}
fw_stop () {
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -P INPUT DROP
/sbin/iptables -P FORWARD DROP
/sbin/iptables -P OUTPUT ACCEPT
}
fw_clear () {
/sbin/iptables -F
/sbin/iptables -t nat -F
/sbin/iptables -t mangle -F
/sbin/iptables -P INPUT ACCEPT
/sbin/iptables -P FORWARD ACCEPT
/sbin/iptables -P OUTPUT ACCEPT
}
case "$1" in
start|restart)
echo -n "Starting firewall.."
fw_stop
fw_start
echo "done."
;;
stop)
echo -n "Stopping firewall.."
fw_stop
echo "done."
;;
clear)
echo -n "Clearing firewall rules.."
fw_clear
echo "done."
;;
*)
echo "Usage: $0 {start|stop|restart|clear}"
exit 1
;;
esac
exit 0
Invece di includere tutte le regole di iptables negli script in init.d, potete usare il programma iptables-restore
per ripristinare le regole salvate usando iptables-save
. Per fare questo dovrete definire le vostre regole e salvare il file delle regole creato in una posizione statica (come ad esempio in /etc/default/firewall
).
5.14.3.3. Configurare le regole del firewall tramite ifup
Potete utilizzare anche la configurazione di rete in
/etc/network/interfaces
per determinare le regole del firewall. Per fare questo:
Create il vostro insieme di regole del firewall per quando l'interfaccia è attiva.
Salvate l'insieme di regole con iptables-save
in un file in /etc
, ad esempio /etc/iptables.up.rules
Configurate
/etc/network/interfaces
ed usate l'insieme delle regole appena impostate:
iface eth0 inet static
address x.x.x.x
[.. interface configuration ..]
pre-up iptables-restore < /etc/iptables.up.rules
In aggiunta potete anche configurare un insieme di regole da applicare per quando l'interfaccia di rete è
down, mediante la creazione del suddetto insieme di regole, salvandolo in
/etc/iptables.down.rules
e aggiungendo questa direttiva alla configurazione dell'interfaccia:
post-down iptables-restore < /etc/iptables.down.rules
For more advanced firewall configuration scripts through ifupdown you can use the hooks available to each interface as in the *.d/
directories called with run-parts
(see run-parts(8) manual page).
5.14.3.4. Collaudare la configurazione del firewall
Collaudare la configurazione del firewall è molto facile, e pericoloso, infatti basta eseguire lo script del firewall (o abilitare la configurazione definita nella propria applicazione per la configurazione del firewall). Comunque, se non siete abbastanza cauti e state configurando il vostro firewall da remoto (ad esempio mediante una connessione SSH), potreste trovarvi tagliati fuori.
Ci sono parecchi modi per impedire che questo avvenga. Uno di questi è eseguire uno script in un terminale separato che rimuoverà la configurazione del firewall se non viene recepito un input. Un esempio di questo è:
$ while true; do test=""; read -t 20 -p "OK? " test ; \
[ -z "$test" ] && /etc/init.d/firewall clear ; done
Un'altra strada è quella di introdurre una backdoor nel sistema mediante un meccanismo alternativo che permetta di disattivare il firewall o bucarlo nel caso in cui qualcosa andasse storto. Per fare questo potete usare knockd e configurarlo in modo che una determinata connessione ad una porta disattivi il firewall (o aggiunga una regola temporanea). Anche se i pacchetti verranno rifiutati dal firewall, finché knockd impegna l'interfaccia e vede, potrete aggirare il problema.
Collaudare un firewall che sta proteggendo una rete interna è una questione differente, si può voler conoscere alcuni dei tool usati nella valutazione delle vulnerabilità remote (vedete in
Sezione 8.1, «Strumenti per la valutazione delle vulnerabilità da remoto») per sondare la rete dall'esterno all'interno (o da qualunque altra direzione) per verificare l'efficacia della configurazione del firewall.