Esperienza su firewall LEAF/Bering uClibc ("a due interfacce") |
|
|
|
Per la realizzazione di questo modulo useremo
Netkit4TIC
con la
connettività
con la rete reale (leggere il file README).
Di seguito forniamo la mappa (pdf) della rete dell'esercizio proposto con il relativo schema di numerazione.
Lo scopo di questa esercitazione è quello di testare le funzionalità di una piccola rete locale connessa ad Internet tramite un firewall:
Per quanto riguarda la configurazione del firewall come macchina virtuale rimandiamo alla lettura di Virtual uBering.
Modificando la lista dei pacchetti da caricare al boot e memorizzata
nella variabile
LRP possiamo ottenere un'installazione personalizzata.
Alla classica lista dei pacchetti aggiungiamo:
sshd.lrp: per dare la possibilità
all'amministratore del firewall di
accedere in maniera sicura sia dalla rete privata che da Internet.netutils.lrp e mawk.lrp: per una questione
di comodità visto che sono opzionali ma che ci
offrono i comandi
route, netstat e awk.snmpmibs.lrp, libsnmp.lrp e
netsnmpd.lrp:
per aggiungere la funzionalità di agent SNMP.
Le due interfacce di rete eth0 ed eth1 sono configurate attraverso
l'impostazione del file /etc/network/interfaces.
Inoltre Shorewall è settato
in modalità "two interface" con attivazione
del mascheramento. Per un esempio dei file
di configurazione vai sul progetto
Bering uClibc reale.
Dopo aver settato correttamente l'ambiente Netkit scarica il tarball e lancia lo script che costruisce il firewall, i tre nodi (e relativi hub):
realHost$ lstart net fw proxy loc01
che attiva un server apache sui nodi net,
loc01 e proxy. Inoltre attiva i server squid
e Dansguardian sul nodo proxy
(screenshot).
Il documento si divide nelle seguenti sezioni:
Navigazione in Internet dalla rete LAN |
|
Dal nodo loc01 ricerchiamo la home page su net:
loc01# lynx -dump http://217.57.5.218/ | strings
Benvenuto 217.57.5.217 su 217.57.5.218
Verifichiamo il mascheramento controllando il file di log di apache:
net# tail -f /var/log/apache/access.log
217.57.5.217 - - [25/Aug/2005:18:24:37 +0200] "GET / HTTP/1.0" 200 196 "-" \
"Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.0.16"
Network exploration tool and security scanner |
|
Utilizzando nmap costruiamo
delle richieste di rete che facciano scattare
le regole di DROP o REJECT del firewall, per esempio con:
net# nmap 217.57.5.217 -p 21-22 [...] PORT STATE SERVICE 21/tcp filtered ftp 22/tcp open ssh [...] loc01# nmap 10.10.10.78 -p 21-22 [...] PORT STATE SERVICE 21/tcp closed ftp 22/tcp open ssh [...]
e verifichiamo il risultato nel log del firewall con:
fw# tail -f /var/log/messages
Sep 9 07:23:13 localhost kernel: Shorewall:net2all:DROP:IN=eth0 OUT= \
MAC=fe:fd:d9:39:05:d9:fe:fd:d9:39:05:da:08:00 \
SRC=217.57.5.218 DST=217.57.5.217 LEN=40 TOS=0x10 PREC=0x00 TTL=44 \
ID=5239 PROTO=TCP SPT=60808 DPT=21 WINDOW=1024 RES=0x00 SYN URGP=0
Sep 9 07:23:14 localhost kernel: Shorewall:net2all:DROP:IN=eth0 OUT= \
MAC=fe:fd:d9:39:05:d9:fe:fd:d9:39:05:da:08:00 \
SRC=217.57.5.218 DST=217.57.5.217 LEN=40 TOS=0x10 PREC=0x00 TTL=39 \
ID=924 PROTO=TCP SPT=60809 DPT=21 WINDOW=4096 RES=0x00 SYN URGP=0
Sep 9 08:32:42 localhost kernel: Shorewall:all2all:REJECT:IN=eth1 OUT= \
MAC=fe:fd:0a:0a:0a:4e:fe:fd:0a:0a:0a:41:08:00 \
SRC=10.10.10.65 DST=10.10.10.78 LEN=40 TOS=0x10 PREC=0x00 TTL=56 \
ID=54416 PROTO=TCP SPT=45151 DPT=21 WINDOW=1024 RES=0x00 SYN URGP=0
Facciamo notare che il traffico non ammesso proveniente da Internet subisce DROP e quello da rete locale subisce REJECT.
Navigazione da Internet tramite NAT |
|
Ci connettiamo da net (Internet) al web server
(NAT su 10.10.10.65) sul nodo loc01:
net# lynx -dump http://217.57.5.217/ | strings
Benvenuto 217.57.5.218 su 217.57.5.217
Controlliamo il log del server web della rete privata:
loc01# tail -f /var/log/apache/access.log
217.57.5.218 - - [25/Aug/2005:18:28:15 +0200] "GET /index.php HTTP/1.0" 200 196 "-" \
"Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.0.16"
Alcune catture di traffico |
|
Ecco di seguito le catture di traffico (analizzabili con ethereal):
net e fw
(File ACP):
net# tcpdump -i eth0 -n -s 1518 arp -w /hosthome/firewall-arp.acp loc01# ping -c 1 217.57.5.218
loc01 e net
(File ACP):
net# tcpdump -i eth0 -n -s 1518 icmp -w /hosthome/firewall-icmp.acp loc01# ping -c 1 217.57.5.218
loc01 e net
(File ACP)
net# tcpdump -i eth0 -n -s 1518 port 80 -w /hosthome/firewall-http.acp loc01# lynx -dump http://217.57.5.218/ | strings
Lasciamo al lettore la verifica della connettività al firewall attraverso ssh sia dalla rete interna che da quella esterna.
Configurazione agent SNMP e navigazione MIB tramite snmpwalk |
|
È stato
configurato un agent
ucd-snmp sul firewall e il tool
mrtg sul nodo proxy della rete locale.
Per consultare le informazioni dell'agent possiamo usare il
comando snmpwalk. Ad esempio se vogliamo conoscere
la lista delle interfacce del nodo 10.10.10.78 (lo filtriamo
con un grep per rendere minimo l'output):
loc01# snmpwalk -Os -c public -v 1 10.10.10.78 \ .iso.org.dod.internet.mgmt.mib-2.interfaces.ifTable.ifEntry.ifDescr \ | grep -e "eth0\|eth1" ifDescr.4 = STRING: eth0 ifDescr.5 = STRING: eth1 loc01# snmpwalk -n -Os -c public -v 1 10.10.10.78 \ .1.3.6.1.2.1.2.2.1.2 \ | grep -e "eth0\|eth1" IF-MIB::ifDescr.4 = STRING: eth0 IF-MIB::ifDescr.5 = STRING: eth1
Per consultare le statistiche costruite da mrtg interrogando l'agent snmp basta puntare un browser nel seguente URL:
realHost$ mozilla-firefox http://192.168.77.2/mrtg/firewall.eth[0-1].html
Configurazione e uso di ssh |
|
Per attivare una sessione SSH sul firewall:
loc01# ssh 10.10.10.78 The authenticity of host '10.10.10.78 (10.10.10.78)' can't be established. RSA key fingerprint is 1c:14:d4:b1:16:40:de:d2:42:ea:d4:1c:4a:50:f3:66. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added '10.10.10.78' (RSA) to the list of known hosts. root@10.10.10.78's password: root LEAF Bering-uClibc fw 2.4.26-bs1 #2 Fri Dec 31 11:32:18 CET 2004 Type in help if you are really lost
Proxy server: Squid |
|
La navigazione può essere resa più sicura, veloce e priva di banner mediante l'uso di un server proxy. Nel caso di software Open Source quello più usato è sicuramente squid.
Nel nostro caso per evitare che una dimenticanza di configurazione del browser permetta al browser di navigare senza l'uso del proxy permettiamo al solo server proxy di generare traffico uscente verso Internet che utilizza le porte 80 e 443.
Per prima cosa restringiamo la policy in modo da negare qualsiasi
accesso a Internet da parte della rete interna. Nel file
policy occorre
commentare la precedente regola
di abilitazione alla navigazione e sostituirla con il divieto per tutti:
# /etc/shorewall/policy #SOURCE DEST POLICY LOG LEVELloc net ACCEPTloc net REJECT info
Quindi ora occorre abilitare il traffico per la navigazione della
sola macchina proxy. Cambiamo quindi la riga del file
rules della configurazione di shorewall:
# /etc/shorewall/rules #ACTION SOURCE DEST PROTO DESTWeb/ACCEPT loc netWeb/ACCEPT loc:10.10.10.77 net
Rifacciamo partire shorewall:
fw# /etc/init.d/shorewall restartPossiamo verificare che la regola impedisca la navigazione attraverso un semplice tentativo di accedere al server
net. In seguito
per impostare il proxy per il wget occorre impostare la
variabile d'ambiente http_proxy e riprovare:
loc01# export http_proxy="http://10.10.10.77:3128/"
loc01# lynx -dump http://217.57.5.218/ | strings
Benvenuto 217.57.5.217 su 217.57.5.218
Catturando il
traffico
in Internet generato dal comando lynx
eseguito dal nodo proxy e quello generato dallo stesso
comando eseguito dal nodo loc01 non vediamo alcuna differenza
mentre se controlliamo il
traffico
nella rete locale scopriamo che
il comando HTTP di richiesta home page "GET / HTTP/1.0" diventa
"GET http://217.57.5.218/ HTTP".
Volendo utilizzare il comando nc (netcat) proviamo a richiere
la home page direttamente:
loc01# echo -e "GET / HTTP/1.0\r\n\r\n" | \
nc 217.57.5.218 80
e attraverso il proxy:
loc01# echo -e "GET http://217.57.5.218/ HTTP/1.0\r\n\r\n" | \
nc 10.10.10.77 3128
Un ottimo generatore di report per squid è
Sarg le cui iniziali stanno per
Squid Analysis Report Generator. È un generatore di pagine
Web e quindi ha bisogno di un server Web.
Attraverso cron deve essere lanciato in
esecuzione giornalmente in modo da elaborare
i dati di log di Squid e riportare i report
nella directory /var/www/squid-reports.
Per visualizzarli forziamo una esecuzione di sarg
e poi lanciamo il browser:
proxy# sarg realHost$ mozilla-firefox http://10.10.10.77/squid-reports/
I dati sono molto dettagliati sia per utente/IP address che per ora, traffico generato e siti visitati.
Per i vincoli dovuti alle norme sulla privacy occorre configurare
il server proxy in modo che vengano mantenuti i file di log per
almeno un anno e nel contempo attivare una procedura di backup
e salvataggio degli stessi a livello trimestrale. Il programma
da configurare per il salvataggio dei log si chiama
logrotate che nel caso di squid sarà
configurato come segue:
# /etc/logrotate.d/squid
# Logrotate fragment for squid
/var/log/squid/*.log {
daily
compress
delaycompress
rotate 400
missingok
nocreate
sharedscripts
prerotate
test ! -x /usr/sbin/sarg-maint || /usr/sbin/sarg-maint
endscript
postrotate
test ! -e /var/run/squid.pid || /usr/sbin/squid -k rotate
endscript
}
Per l'analisi delle prestazioni del proxy tramite
il programma sarg è preferibile
settare la raccolta differenziata per mese:
# /etc/cron.monthly/squid #Get current date TODAY=$(date +%d/%m/%Y) #Get current date TD=$(date --date "1 month ago" +%Y-%m) #Get one month ago today YESTERDAY=$(date --date "1 month ago" +%d/%m/%Y) #Get one month ago today (4touch) YD=$(date --date "1 month ago" +%m/%d/%Y) touch -d $YD /tmp/a cat /var/log/squid/access.log.1 > /var/log/squid/monthly/squid-$TD find /var/log/squid/ -newer /tmp/a -name access.log\*gz | \ xargs zcat >> /var/log/squid/monthly/squid-$TD ln -f -s /var/log/squid/monthly/squid-$TD /var/4sarg sarg -o /var/www/squid-reports/monthly -d $YESTERDAY-$TODAY
Attenzione che i log contengono dati sensibili e quindi quelli relativi agli utenti non possono essere consultati senza infrangere la Legge Italiana.
Proxy server: DansGuadian |
|
Un altro proxy server, normalmente usato in cascata a Squid, utile come analizzatore di contenuti è DansGuardian. Questo programma si frappone tra il browser e Squid permettendo di filtrare le pagine visitate attraverso vari metodi: URL, IP address, frasi, estensioni di file e altre caratteristiche.
Esplicitiamo quindi ora il funzionamento dei due proxy server in una configurazione cooperativa. Dansguardian è in attesa di richieste dai vari browser sulla porta TCP 8080. Se la richiesta non è vietata in base all'IP, all'URL o a qualche altro filtro, Dansguardian passa la richiesta a Squid via loopback (quindi locale) sulla porta TCP 3128. Squid ricerca la pagina (inserendola nella cache per successive richieste) e la manda indietro a Dansguardian per l'ispezione del contenuto. Se il contenuto è accettabile, Dansguardian passa la pagina al browser che ne aveva fatto richiesta. Se il contenuto non è accettabile viene visualizzata una pagina web di negazione della richiesta.
Configurazione Transparent Proxy Server |
|
Un altro metodo per configurare l'uso del proxy consiste
nel cambiare il funzionamento del sistema invece che cambiare
il funzionamento delle applicazioni.
Le motivazioni che spingono verso l'utilizzo del
Transparent Proxy sono:
Il meccanismo è schematizzato (pdf) come segue. Il browser manda la richiesta al server web e ha l'illusione di parlare con il server reale. La richiesta viene invece rediretta al server proxy che si incarica di mandare la richiesta al server reale. L'illusione della trasparenza si ferma al client poichè il server si rende conto che è in comunicazione con il proxy. In effetti il server web è illuso di comunicare con client e invece è in dialogo con il proxy.
Un ottimo documento sull'argomento si trova presso Transparent Proxy.
Per prima cosa occorre cambiare la configurazione di squid:
# /etc/squid/squid.conf [...] httpd_accel_host virtual httpd_accel_port 80 httpd_accel_with_proxy on httpd_accel_uses_host_header on [...]
e sempre sul nodo dove è installato squid associare all'attivazione della scheda di rete (eth1 nel nostro caso) il seguente comando di redirezione:
proxy# iptables -t nat -A PREROUTING -i eth1 -d ! 10.10.10.77 \
-p tcp --dport 80 -j REDIRECT --to-ports 3128
Le rimanenti operazioni sono tutte da fare sul router.
Aggiungiamo alla tabella delle tavole una entry www.out:
fw# echo 202 www.out >> /etc/iproute2/rt_tables
Nel file di inizializzazione di shorewall aggiungiamo:
# /etc/shorewall/init
if [ -z "`ip rule list | grep www.out`" ] ; then
ip rule add fwmark 0xCA table www.out # Note 0xCA = 202
ip route add default via 10.10.10.77 dev eth1 table www.out
ip route flush cache
echo 0 > /proc/sys/net/ipv4/conf/eth1/send_redirects
fi
Modifichiamo il file:
# /etc/shorewall/interfaces
[...]
#ZONE INTERFACE BROADCAST OPTIONS
loc eth1 10.10.10.79 routeback
e infine aggiungiamo il file:
# /etc/shorewall/start.d/transpro iptables -t mangle -A PREROUTING -i eth1 -s ! 10.10.10.77 \ -p tcp --dport 80 -j MARK --set-mark 202
Sperimentazione Transparent Proxy Server |
|
Per sperimentare la configurazione con il
transparent proxy a partire dall'esperienza appena illustrata occorre
"sostituire" i due nodi fw e proxy:
realHost$ lcrash fw proxy; \
lstart fwtp proxytp
Invece nel caso in cui si sia salta la sperimentazione precedente basta lanciare:
realHost$ lstart net fwtp proxytp loc01
che costruisce i medesimi nodi con gli stessi servizi elencati precedentemente ma con le configurazioni specializzate.
Attiviamo una sessione di navigazione dal client della rete privata:
loc01# lynx -dump http://217.57.5.218/ | strings
Benvenuto 217.57.5.217 su 217.57.5.218
e controlliamo l'effetto sul proxy e sul web server:
proxytp# tail -n 1 /var/log/squid/access.log 1130753977.005 25 10.10.10.65 TCP_MISS/200 509 \ GET http://217.57.5.218/ - DIRECT/217.57.5.218 text/html net # tail -n 1 /var/log/apache/access.log 217.57.5.217 - - [31/Oct/2005:11:19:36 +0100] \ "GET / HTTP/1.0" 200 196 "-" \ "Lynx/2.8.5rel.1 libwww-FM/2.14 SSL-MM/1.4.1 GNUTLS/1.0.16"
Il file di cattura traffico (File ACP) può essere poi elaborato con un filtro del tipo "http" in modo da evidenziare il "solo traffico http" (screenshot):
No. Source Destination Prot MAC address src MAC address dst Info 5 10.10.10.65 217.57.5.218 HTTP 00:00:00:00:00:65 00:00:00:00:00:78 GET / HTTP/1.0 No. Source Destination Prot MAC address src MAC address dst Info 7 10.10.10.65 217.57.5.218 HTTP 00:00:00:00:00:78 00:00:00:00:00:77 GET / HTTP/1.0 No. Source Destination Prot MAC address src MAC address dst Info 12 10.10.10.77 217.57.5.218 HTTP 00:00:00:00:00:77 00:00:00:00:00:78 GET / HTTP/1.0 No. Source Destination Prot MAC address src MAC address dst Info 14 217.57.5.218 10.10.10.77 HTTP 00:00:00:00:00:78 00:00:00:00:00:77 HTTP/1.1 200 OK No. Source Destination Prot MAC address src MAC address dst Info 17 217.57.5.218 10.10.10.65 HTTP 00:00:00:00:00:77 00:00:00:00:00:65 HTTP/1.0 200 OK
dove, per facilitare la lettura, abbiamo assegnato i MAC address delle schede dei nodi della LAN al valore 00:00:00:00:00:NN dove NN è il quarto numero dell'indirizzo IP.
How Skype & Co. get round firewalls |
|
Read the Jurgen Schmidt's article The hole trick in "heise Security" and than experiment it in our labs. Please startup a subset of lab:
realHost$ lstart net fw loc01
Firstly start a UDP listener on UDP port 14141 on the loc01
node behind the firewall:
loc01# nc -u -l -p 14141 &
An external computer net then attempts to contact it
(fw IP address: 217.57.5.217):
net# echo "Hello" | nc -p 53 -u 217.57.5.217 14141
However, as expected nothing is received on loc01 and,
thanks to the firewall,
nothing is returned to net. Now on a node loc01, hping2,
our universal tool for generating IP packets, punches a hole in the firewall
(net IP address: 217.57.5.218):
loc01# hping2 -c 1 -2 -s 14141 -p 53 217.57.5.218
As long as net is behaving itself, it will send back a
"port unreachable" response via ICMP - however this is of no consequence.
On the second attempt:
net# echo "Hello" | nc -p 53 -u 217.57.5.217 14141
the netcat listener on node loc01 then coughs up a "Hello"
- the UDP packet from outside has passed through the firewall
and arrived at the computer behind it.
|
|
Sandro Doro (email me)