Proteggere la rete: firewall

Transcript

Proteggere la rete: firewall
Università degli Studi di Milano
Facoltà di Scienze Matematiche, Fisiche e Naturali
Anno Accademico 2012/2013
Proteggere la rete: firewall
Srdjan Matic, Aristide Fattori
7 Giugno 2013
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
1 / 41
Firewall - Cosa è?
Firewall
Per firewall solitamente si intende un’applicazione posizionata tra
una rete pubblica ed una rete privata; il compito di questa
applicazione è di gestire e controllare il traffico tra le due reti
intercomunicanti.
Il firewall non è un “security device”, il suo scopo è semplicemente
assicurare il rispetto di una determinata policy.
Il firewall non rende sicura un’applicazione/servizio; ma si limita a
restringere o prevenire l’accesso ad esso.
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
2 / 41
Firewall - Tipologie
Solo il traffico autorizzato potrà entrare o uscire dalla rete.
Esistono diverse tipologie:
packet filtering
circuit-level gateway
application-level gateway
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
3 / 41
Firewall - Packet Filtering
Nella sua versione piú semplice consente di abilitare/disabilitare il
trasferimento di pacchetti (e quindi di dati) tra due reti basandosi su:
IP del mittente
IP del destinatario
tipo di protocollo usato + numero di porta nel caso di TCP/UDP
Svantaggi
Vantaggi
Semplice
Opera ad alta
velocità
Srdjan Matic, Aristide Fattori
Difficoltà di configurazione: come gestire i
meccanismi di autenticazione?
Problemi per servizi non in esecuzione su
porte standard: traffico su porta 7654 non
posso in alcun modo ’supporre’ sua HTTP
&& devo consentire ad ogni host che invia
dati da porta 80 di mandare traffico in LAN
Proteggere la rete: firewall
7 Giugno 2013
4 / 41
Firewall - Circuit level gateway
Sono i firewall di “seconda generazione”, che generalmente operano a
livello 4 (transport). I pacchetti vengono gestiti facendo riferimento agli
“stati”.
la validità delle connessioni viene controllata utilizzando un’apposita
tabella delle connessioni prima di creare una nuova sessione
regole descrivono la validità di una sessione (user, password, data,
protocollo, porta sorgente/destinazione, etc.)
disponibili proxy per la maggior parte dei servizi di rete
Svantaggi
Vantaggi
nascondono le informazioni
riguardo alla rete interna
Srdjan Matic, Aristide Fattori
non viene effettuato il filtraggio
dei singoli pacchetti
maggiore overhead rispetto a
Packet Filtering
Proteggere la rete: firewall
7 Giugno 2013
5 / 41
Firewall - Application level gateway
Svolge le funzioni di relay tra il traffico a livello applicazione; si
interpone tra i client ed il server di un’applicazione:
opera a livello applicazione
intercetta, analizza ed inoltra i messaggi client ↔ server
chiamati anche ’proxy firewall’
Vantaggi
controlli piú sofisticati del
packet filtering
operazioni di logging piú
granulari
Svantaggi
molto piú lento del packet
filtering
maggiore richiesta di risorse
caching (di pagine web)
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
6 / 41
OpenBSD’s stateful Packet Filter
PF
“The packet filter’s main function is, as the name suggests, to
filter network packets by matching the properties of individual
packets and the network connections built from those packets
against the filtering criteria defined in its configuration files. The
packet filter is responsible for deciding what to do with those
packets. That could mean passing them through or rejecting them,
or triggering events that other parts of the operating system or
external applications are set up to handle.”a
a
Fonte: “The Book of PF: A No-Nonsense Guide to The OpenBSD
Firewall”, Peter N. M. Hansteen, ed. No Starch Press, 2010
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
7 / 41
Da Linux a BSD
Alcune precisazioni utili:
Linux e BSD utilizzano convenzioni differenti per i nomi delle
interfacce di rete.
1
2
Linux: ethX e wlanX;
BSD: emX, snX, . . . → nome scelto in base al driver utilizzato
dall’interfaccia
in OpenBSD la configurazione di ciascuna interfaccia di rete si
ottiene modificando il file /etc/hostname.<IF> (dove <IF>
identifica una specifica interfaccia)
in OpenBSD la configurazione del sistema avviene utilizzando
il file /etc/rc.conf
Le personalizzazioni di tale file avvengono apportando le
modifiche al file /etc/rc.conf.local
noi ci focalizzeremo principalmente sul file /etc/pf.conf
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
8 / 41
PF - Comandi di base
pfctl
Per amministrare PF si utilizza il comando pfctl.
Per disabilitare PF:
openpita$ pfctl -d
Per attivare PF:
openpita$ pfctl -e
È possibile combinare assieme più comandi; ad esempio per
attivare PF e caricare il ruleset corrente si può utilizzare:
openpita$ pfctl - ef / etc / pf . conf
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
9 / 41
PF - Esempio di configurazione
Contenuto di /etc/pf.conf
block in all
pass out all # keep state
Ipotetica configurazione per una macchina che non ha servizi attivi
e comunica con un’unica rete (es. Internet)
PF legge ed applica le regole dall’alto verso il basso: l’ultima
regola letta, che risulta essere valida per un particolare pacchetto,
è quella che viene applicata.
Per le regole contenenti “keep state”1 vengono utilizzate
informazioni, riguardanti le connessioni esistenti, che sono
memorizzate all’interno della state table.
1
dalla versione 4.1 di OpenBSD di default a tutte le regole di tipo “pass”
viene applicato keep state
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
10 / 41
PF - Applicare e testare le nuove regole
Dopo avere modificato il file /etc/pf.conf è possibile istruire PF
per utilizzare le nuove regole invocando il comando:
openpita$ pfctl -f / etc / pf . conf
Se non sono presenti errori, le regole vengono applicate e PF viene
re-impostato per utilizzare le nuove regole.
Suggerimento: ogni volta che vengono aggiunte/modificate nuove
regole è buona norma assicurarsi che funzionino come ci si
aspetterebbe.23
Per verificare la sintassi delle regole immesse:
openpita$ pfctl - nf / etc / pf . conf
Per informazioni aggiuntive e statistiche:
openpita$ pfctl -s info
2
3
EX: openpita$ host corriere.it
EX: openslave$ nmap -PN -p 80 172.16.1.1
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
11 / 41
pf.conf
Il file pf.conf si compone di 5 parti:
macro: variabili definite dagli utenti per identificare indirizzi
IP, interfacce, . . .
tabelle: strutture utilizzare per memorizzare liste di indirizzi IP
opzioni: varie opzioni per personalizzare la configurazione di
PF
queueing: controllo della banda e prioritizzazione dei pacchetti
filtering rules: filtraggio dei pacchetti che passano attraverso
le interfacce di rete
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
12 / 41
Liste e macro
Lista
Una lista è un insieme di due o più oggetti dello stesso tipo.
Ad esempio possiamo utilizzare una lista per indicare un insieme di porte:
pass proto tcp to port {22 80 443}
Prima di venire applicate, le regole contenenti liste vengono espanse.
Macro
Analogamente al linguaggio C (e agli alias di bash) è possibile definire
delle macro. Ad esempio:
mail_server = " 192.168.56.200 "
pass proto tcp to $mail_server port 25
Per applicare le nuove regole e vedere come le macro vengano espanse,
utilizzare il comando:
openpita$ pfctl - vf / etc / pf . conf
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
13 / 41
ESEMPIO ex1-pf.conf
Per servizi noti è possibile utilizzare le informazioni (nome servizio, porta,
protocollo, aliases) presenti nel file /etc/services.
# # MACROS
tcp_services =
udp_services =
# # RULES
block all
pass out proto
pass out proto
" { ssh , www , domain , ms - sql -s , ms - sql - m } "
" { domain } "
tcp to port $tcp_services keep state
udp to port $udp_services keep state
Domande:
1
openslave$ nmap -nv -sS 172.16.1.1 -p 500-550 OUTPUT?
2
openslave$ nmap -nv -sS 172.16.1.1 -p 1-100 OUTPUT?
3
openpita$ host google.com OUTPUT?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
14 / 41
ESEMPIO ex1-pf.conf
Per servizi noti è possibile utilizzare le informazioni (nome servizio, porta,
protocollo, aliases) presenti nel file /etc/services.
# # MACROS
tcp_services =
udp_services =
# # RULES
block all
pass out proto
pass out proto
" { ssh , www , domain , ms - sql -s , ms - sql - m } "
" { domain } "
tcp to port $tcp_services keep state
udp to port $udp_services keep state
Domande:
1
openslave$ nmap -nv -sS 172.16.1.1 -p 500-550 OUTPUT? filtered
2
openslave$ nmap -nv -sS 172.16.1.1 -p 1-100 OUTPUT?
3
openpita$ host google.com OUTPUT?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
14 / 41
ESEMPIO ex1-pf.conf
Per servizi noti è possibile utilizzare le informazioni (nome servizio, porta,
protocollo, aliases) presenti nel file /etc/services.
# # MACROS
tcp_services =
udp_services =
# # RULES
block all
pass out proto
pass out proto
" { ssh , www , domain , ms - sql -s , ms - sql - m } "
" { domain } "
tcp to port $tcp_services keep state
udp to port $udp_services keep state
Domande:
1
openslave$ nmap -nv -sS 172.16.1.1 -p 500-550 OUTPUT? filtered
2
openslave$ nmap -nv -sS 172.16.1.1 -p 1-100 OUTPUT? filtered
3
openpita$ host google.com OUTPUT?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
14 / 41
ESEMPIO ex1-pf.conf
Per servizi noti è possibile utilizzare le informazioni (nome servizio, porta,
protocollo, aliases) presenti nel file /etc/services.
# # MACROS
tcp_services =
udp_services =
# # RULES
block all
pass out proto
pass out proto
" { ssh , www , domain , ms - sql -s , ms - sql - m } "
" { domain } "
tcp to port $tcp_services keep state
udp to port $udp_services keep state
Domande:
1
openslave$ nmap -nv -sS 172.16.1.1 -p 500-550 OUTPUT? filtered
2
openslave$ nmap -nv -sS 172.16.1.1 -p 1-100 OUTPUT? filtered
3
openpita$ host google.com OUTPUT?
google.com has address 173.194.35.46
google.com has address 173.194.35.32 . . .
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
14 / 41
ESEMPIO ex2-pf.conf ex3-pf.conf
Liste annidate
triple = " { 172.16.1.3 172.16.1.4 172.16.1.5 } "
pass in inet proto tcp from {172.16.1.2 $triple } to port 25
Liste “negate”
# GOALS :
# 1 - restrict access to our subnet
# 2 - block only address 172.16.20.20
pass in on em1 from { 172.16.0.0/16 !176.16.20.20 }
Come viene espanso il precedente comando?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
15 / 41
ESEMPIO ex2-pf.conf ex3-pf.conf
Liste annidate
triple = " { 172.16.1.3 172.16.1.4 172.16.1.5 } "
pass in inet proto tcp from {172.16.1.2 $triple } to port 25
Liste “negate”
# GOALS :
# 1 - restrict access to our subnet
# 2 - block only address 172.16.20.20
pass in on em1 from { 172.16.0.0/16 !176.16.20.20 }
Come viene espanso il precedente comando?
pass in on em1 from 172.16.0.0/16
pass in on em1 from !172.16.20.20
Qualsiasi indirizzo diverso da 172.16.20.20 può accedere (ad esempio alla
porta 80) in quanto manca la regola per bloccare le connessioni!
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
15 / 41
Tabelle
Tabelle in /etc/pf.conf
Attributi utilizzabili nelle tabelle:
const: il contenuto della tabella non può più venire modificato dopo
la sua creazione
persist: il kernel mantiene caricata in memoria la tabella anche
quando non vi sono regole che fanno riferimento ad essa
table < trusted_ips > { 127.0.0.1 sec1 openslave }
table < rfc1918 > const { 19 2.168. 0.0/1 6 172.16.0.0/12 \
10.0.0.0/8 }
table < spammers > persist file /etc/spammers
block in on em0 from < spammers > to any
pass in on em1 from { < trusted_ips > , < rfc1918 > } to any
Il file /etc/spammers contiene una lista di IP (o indirizzi nel formato
CIDR).
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
16 / 41
Tabelle
La ricerca di un indirizzo all’interno della tabella restituirà l’entry “più
vicina” all’indirizzo cercato.
Esempio di utilizzo tabelle nel file /etc/pf.conf
table < test > const { 172.16.0.0/16 ! 17 2 .1 6. 2 0. 0/ 24 \
172.16.20.101 }
block in on dc0
pass in on dc0 from < test >
Esempio di ricerca di un indirizzo nella tabella
1
ip 172.16.30.20 “matcha” entry?
2
ip 172.16.20.20 “matcha” entry?
3
ip 172.16.20.101 “matcha” entry?
4
ip 192.168.1.1 “matcha” entry?
⇒ passano tutti tranne il pacchetto #2, ossia quello proveniente
dall’indirizzo 172.16.20.20
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
17 / 41
Tabelle
La ricerca di un indirizzo all’interno della tabella restituirà l’entry “più
vicina” all’indirizzo cercato.
Esempio di utilizzo tabelle nel file /etc/pf.conf
table < test > const { 172.16.0.0/16 ! 17 2 .1 6. 2 0. 0/ 24 \
172.16.20.101 }
block in on dc0
pass in on dc0 from < test >
Esempio di ricerca di un indirizzo nella tabella
1
ip 172.16.30.20 “matcha” entry? 172.16.0.0/16
2
ip 172.16.20.20 “matcha” entry?
3
ip 172.16.20.101 “matcha” entry?
4
ip 192.168.1.1 “matcha” entry?
⇒ passano tutti tranne il pacchetto #2, ossia quello proveniente
dall’indirizzo 172.16.20.20
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
17 / 41
Tabelle
La ricerca di un indirizzo all’interno della tabella restituirà l’entry “più
vicina” all’indirizzo cercato.
Esempio di utilizzo tabelle nel file /etc/pf.conf
table < test > const { 172.16.0.0/16 ! 17 2 .1 6. 2 0. 0/ 24 \
172.16.20.101 }
block in on dc0
pass in on dc0 from < test >
Esempio di ricerca di un indirizzo nella tabella
1
ip 172.16.30.20 “matcha” entry? 172.16.0.0/16
2
ip 172.16.20.20 “matcha” entry? !172.16.20.0/24
3
ip 172.16.20.101 “matcha” entry?
4
ip 192.168.1.1 “matcha” entry?
⇒ passano tutti tranne il pacchetto #2, ossia quello proveniente
dall’indirizzo 172.16.20.20
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
17 / 41
Tabelle
La ricerca di un indirizzo all’interno della tabella restituirà l’entry “più
vicina” all’indirizzo cercato.
Esempio di utilizzo tabelle nel file /etc/pf.conf
table < test > const { 172.16.0.0/16 ! 17 2 .1 6. 2 0. 0/ 24 \
172.16.20.101 }
block in on dc0
pass in on dc0 from < test >
Esempio di ricerca di un indirizzo nella tabella
1
ip 172.16.30.20 “matcha” entry? 172.16.0.0/16
2
ip 172.16.20.20 “matcha” entry? !172.16.20.0/24
3
ip 172.16.20.101 “matcha” entry? 172.16.20.101
4
ip 192.168.1.1 “matcha” entry?
⇒ passano tutti tranne il pacchetto #2, ossia quello proveniente
dall’indirizzo 172.16.20.20
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
17 / 41
Tabelle
La ricerca di un indirizzo all’interno della tabella restituirà l’entry “più
vicina” all’indirizzo cercato.
Esempio di utilizzo tabelle nel file /etc/pf.conf
table < test > const { 172.16.0.0/16 ! 17 2 .1 6. 2 0. 0/ 24 \
172.16.20.101 }
block in on dc0
pass in on dc0 from < test >
Esempio di ricerca di un indirizzo nella tabella
1
ip 172.16.30.20 “matcha” entry? 172.16.0.0/16
2
ip 172.16.20.20 “matcha” entry? !172.16.20.0/24
3
ip 172.16.20.101 “matcha” entry? 172.16.20.101
4
ip 192.168.1.1 “matcha” entry? !172.16.20.0/24
⇒ passano tutti tranne il pacchetto #2, ossia quello proveniente
dall’indirizzo 172.16.20.20
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
17 / 41
Funzionamento del Packet Filtering
Sintassi
action [direction] [ log ] [ quick ] [ on interface] [af] \
[ proto protocol] [ from src addr [ port src port]] \
[ to dst addr [ port dst port]] [ flags tpc flags] [ state ]
La keyword quick
Il pacchetto in ingresso/uscita viene ispezionato facendo matching con tutte le
regole, dalla prima all’ultima (→ “last matching rule wins”).
In presenza della keyword quick, se una regola matcha il pacchetto non
vengono effettuati ulteriori controlli utilizzando le regole rimanenti.
Come usare quick (ex4-pf.conf)
block out quick on em0 proto tcp to port www
pass out all
Cosa succede con il la precedente configurazione? Senza quick avrebbe
funzionato lo stesso? Se no, come lo avrei dovuto modificare?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
18 / 41
Funzionamento del Packet Filtering
Sintassi
action [direction] [ log ] [ quick ] [ on interface] [af] \
[ proto protocol] [ from src addr [ port src port]] \
[ to dst addr [ port dst port]] [ flags tpc flags] [ state ]
La keyword quick
Il pacchetto in ingresso/uscita viene ispezionato facendo matching con tutte le
regole, dalla prima all’ultima (→ “last matching rule wins”).
In presenza della keyword quick, se una regola matcha il pacchetto non
vengono effettuati ulteriori controlli utilizzando le regole rimanenti.
Come usare quick (ex4-pf.conf)
block out quick on em0 proto tcp to port www
pass out all
Cosa succede con il la precedente configurazione? Senza quick avrebbe
funzionato lo stesso? Se no, come lo avrei dovuto modificare?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
18 / 41
Funzionamento del Packet Filtering
Stateful inspection
PF è in gradi di tenere traccia degli stati e delle connessioni che
vengono stabilite. Un pacchetto appartenente ad una connessione
esistente, passa automaticamente dal firewall senza venire
analizzato tramite il ruleset.
Il tracciamento degli stati, viene effettuato per pacchetti che
transitano in entrambe le direzioni.a
Di default, tutte le regole pass automaticamente creano uno stato
non appena un pacchetto matcha una regola (→ è come se tutte
le regole terminassero con la stringa “keep state”).
modulate state funziona analogamente a keep state, con
l’aggiunta che il Initial Sequence Number delle connessioni in
uscita, viene randomizzato. b
a
b
EX: DOMANDA: vantaggi nell’utilizzare gli stati?
EX: DOMANDA: Qualche idea a cosa potrebbe servire?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
19 / 41
Funzionamento del Packet Filtering
... e UDP ...
Ha senso tenere traccia degli stati per le sessioni UDP?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
20 / 41
Funzionamento del Packet Filtering
... e UDP ...
Ha senso tenere traccia degli stati per le sessioni UDP?
ESEMPIO ex5-pf.conf
block in all
pass out inet proto udp from em0:network to \
{ !172.16.1.1 !127.0.0.1 } port domain no state
a
a
EX: openpita$ host google.com + tcpdump −vvni em0
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
20 / 41
Funzionamento del Packet Filtering
... e UDP ...
Ha senso tenere traccia degli stati per le sessioni UDP?
ESEMPIO ex5-pf.conf
block in all
pass out inet proto udp from em0:network to \
{ !172.16.1.1 !127.0.0.1 } port domain no state
a
a
EX: openpita$ host google.com + tcpdump −vvni em0
Stati
In presenza di protocolli che non possiedono pacchetti “start” ed
“end”, PF tiene traccia del tempo trascorso dall’ultima volta che
un pacchetto ha matchato una regola.
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
20 / 41
Funzionamento del Packet Filtering
Opzioni per gli stati
È possibile utilizzare delle opzioni per per gli la gestione degli stati
in PF. http://www.openbsd.org/faq/pf/filter.html →
“Stateful Tracking Options”.
Esempio di regole con utilizzo di opzioni:
$mail_serv = " 172.16.2.2 "
$web_serv = " { 172.16.3.3 172.16.4.4 } "
pass in on em0 proto { tcp , udp } to $mail_serv port ntp
keep state ( max 500 , source - track - rule , \
max - src - nodes 300 , max - src - states 2)
table < dosers > persist
block in quick < dosers >
pass in on em0 proto tcp to $web_serv port www \
( max - src - conn 200 , max - src - conn - rate 10/1 ,
overload < dosers > flush )
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
21 / 41
Funzionamento del Packet Filtering
TCP SYN proxy
Tramite l’opzione “synproxy state” il firewall completa il
3-way-handshake sia con client che con il server.
Utile contro? Eventuali svantaggi?
TCP SYN flood attack (con spoofed addresses).
Antispoof
openpita$ ifconfig em1
Output:
inet 172.16.1.1 netmask 0 xfff00000 broadcast 17 2.31.255. 255
antispoof for em1 inet
Come funziona?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
22 / 41
Funzionamento del Packet Filtering
TCP SYN proxy
Tramite l’opzione “synproxy state” il firewall completa il
3-way-handshake sia con client che con il server.
Utile contro? Eventuali svantaggi?
TCP SYN flood attack (con spoofed addresses).
Antispoof
openpita$ ifconfig em1
Output:
inet 172.16.1.1 netmask 0 xfff00000 broadcast 17 2.31.255. 255
antispoof for em1 inet
Come funziona?
La precedente regola viene espansa come:
block drop in on ! em1 inet from 172.16.0.0/12 to any
block drop in inet from 172.16.1.1 to any prio 0
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
22 / 41
Funzionamento del Packet Filtering
Passive OS Fingerprinting
Utilizzando i pacchetti SYN TCP è possibile stabilire il sistema operativo.
Il file /etc/pf.os contiene una lista di sistemi operativi “noti”.
ex6-pf.conf
host_only_if = " em1 "
pass in on $host_only_if proto tcp \
from any os " OpenBSD " to any port www
pass in on $host_only_if proto tcp \
from any os " Linux " to any port www
block in on $host_only_if proto tcp from any os unknown
Domande:
Su connessioni già stabilite, se aggiungo nuova regola per “OS
fingerprinting”, come si comporta?
OS finferprinting funziona sempre?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
23 / 41
Funzionamento del Packet Filtering
Passive OS Fingerprinting
Utilizzando i pacchetti SYN TCP è possibile stabilire il sistema operativo.
Il file /etc/pf.os contiene una lista di sistemi operativi “noti”.
ex6-pf.conf
host_only_if = " em1 "
pass in on $host_only_if proto tcp \
from any os " OpenBSD " to any port www
pass in on $host_only_if proto tcp \
from any os " Linux " to any port www
block in on $host_only_if proto tcp from any os unknown
Domande:
Su connessioni già stabilite, se aggiungo nuova regola per “OS
fingerprinting”, come si comporta?
OS finferprinting funziona sempre?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
23 / 41
Realizzare un gateway
Gateway
Una macchina che fa da gateway per, almeno, un’altra macchina. Il suo
compito principale è effettuare il forward dei pacchetti da una rete
all’altra.
Tipicamente un gateway è dotato di diverse interfacce di rete, ciascuna
connessa ad una particolare rete.
IP Forwarding
Per inviare pacchetti da un interfaccia ad un’altra è necessario attivare il
forward dei pacchetti. Questo si ottiene modificando il file
/etc/sysctl.conf:
net . inet . ip . forwarding =1
net . inet6 . ip6 . forwarding =1
È anche possibile utilizzare il comando sysctl:
openpita$ sysctl net . inet . ip . forwarding =1
openpita$ sysctl net . inet6 . ip6 . forwarding =1
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
24 / 41
Realizzare un gateway
Bisogna stare sempre estremamente attenti quando si scrivono
delle regole di forward, in quanto può capitare di omettere delle
parti fondamentali per il funzionamento
Esempio incompleto di forward...
pass in proto tcp on em1 from em1 : network
to em0 : network port $ports keep state
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
25 / 41
Realizzare un gateway
Bisogna stare sempre estremamente attenti quando si scrivono
delle regole di forward, in quanto può capitare di omettere delle
parti fondamentali per il funzionamento
Esempio incompleto di forward...
pass in proto tcp on em1 from em1 : network
to em0 : network port $ports keep state
La precedente regola consente al traffico/pacchetti di essere
forwardati dall’interfaccia em1 a em0; manca la regola che consenta
al traffico di passare attraverso l’interfaccia em0!
pass out proto tcp on em0 from em1 : network
to em0 : network keep state
pass proto tcp from em1 : network to port $ports keep state
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
25 / 41
Realizzare un gateway - ex7-pf.conf
Su openpita
pass in proto { tcp , udp , icmp } from em1 : network \
to em0 : network keep state
pass out on em0 proto { tcp , udp } keep state
pass in proto { tcp , udp , icmp } from em0 : network \
to em1 : network keep state
pass out on em1 proto { tcp , udp } keep state
Impostiamo il gateway:
openslave$ echo " 172.16.1.1 " > / etc / mygate
openslave$ sh / etc / netstart
Eseguiamo quindi:a :
openslave$ wget 89.31.55.101
Output ?b
a
b
EX: 89.31.55.101 == corriere.it
EX: tcpdump SIA di em1 CHE DI em0
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
26 / 41
Realizzare un gateway - NAT
Network Address Translation
Prima immettere un pacchetto sulla rete B, il gateway modifica i
pacchetti, provenienti dalla rete A, in modo che sembri che questi
provengano direttamente dal gateway. Un eventuale pacchetto di
risposta, subisce un procedimento analogo.
Sintassi
match out on interface [ af ] from src adr to dst adr
nat - to ext adr [ pool_type ] [ static - port ]
pass out [ log ] on interface [ af ] [ proto protocol]
from ext adr [ port src port] to dst adr [ port dst port]
match fa in modo che le opzioni presenti nelle regole che matcha
vengano memorizzate per uso futuro.
nat-to può venire utilizzato solo con direzione di transito out
port solitamente non viene utilizzato quando si fa NAT
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
27 / 41
Realizzare un gateway - NAT
Esempio di NAT - ex8-pf.conf
match out on em0 from 172.16.20.20 to any nat - to em0
pass on em0 from 172.16.20.20 to any
# # SAME AS
# pass on em0 from 172.16.20.0 to any nat - to em0
Esempi di NAT
pass on em0 from 172.16.1.1/12 to any nat - to em0
pass on em0 from em1 : network to any nat - to em0
Quale preferite?
Senza parentesi l’indirizzi IP associato ad em0 viene impostato
quando vengono caricate le regole.
pass on em0 from em1 : network to any nat - to (em0)
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
28 / 41
Realizzare un gateway - NAT
Esempio di NAT - ex8-pf.conf
match out on em0 from 172.16.20.20 to any nat - to em0
pass on em0 from 172.16.20.20 to any
# # SAME AS
# pass on em0 from 172.16.20.0 to any nat - to em0
Esempi di NAT
pass on em0 from 172.16.1.1/12 to any nat - to em0
pass on em0 from em1 : network to any nat - to em0
Quale preferite?
Senza parentesi l’indirizzi IP associato ad em0 viene impostato
quando vengono caricate le regole.
pass on em0 from em1 : network to any nat - to (em0)
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
28 / 41
Realizzare un gateway - Port Forwarding
Per accedere alla rete interna, dall’esterno dobbiamo utilizzare il
meccanismo del port forwarding.
Esempio di port forwarding
ext_if = " em0 "
home_ip = " 82.84.130.130 "
kadmin_ip = " 172.16.20.20 "
pass in on $ext_if proto { tcp , udp } from $home_ip
to any port 749:760 rdr-to $kadmin_ip
pass in on $ext_if proto tcp from $home_ip
to any port 50:500 rdr-to $kadmin_ip port 80
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
29 / 41
Logging
pflog
Le informazioni di logging generate da PF vengono inviate
all’interfaccia pflog. Grazie a questa interfaccia le applicazioni
user-space possono raccogliere ed analizzare informazioni
provenienti dal kernel.
Le informazioni di log vengono memorizzate in /var/log/pflog.
Esistono differenti opzioni per il logging:
all: tutti i pacchetti verranno loggati (e non solo quelli
iniziali).
to pflogN: i pacchetti verranno inviati all’interfaccia pflogN
(tramite ifconfig è possibile creare diverse interfacce).
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
30 / 41
Logging
Port forward con logging
ext_if = " em0 "
home_ip = " 82.84.130.130 "
kadmin_ip = " 172.16.20.20 "
pass in log (all , to pflog3) on $ext_if proto { tcp , udp }
from $home_ip to any port 749:760 rdr - to $kadmin_ip
Controllo dei log
Per controllare il contenuto del file:
openpita$ tcpdump -n -e - ttt -r / var / log / pflog
Per logging “LIVE” come potremmo fare?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
31 / 41
Logging
Port forward con logging
ext_if = " em0 "
home_ip = " 82.84.130.130 "
kadmin_ip = " 172.16.20.20 "
pass in log (all , to pflog3) on $ext_if proto { tcp , udp }
from $home_ip to any port 749:760 rdr - to $kadmin_ip
Controllo dei log
Per controllare il contenuto del file:
openpita$ tcpdump -n -e - ttt -r / var / log / pflog
Per logging “LIVE” come potremmo fare?
openpita$ tcpdump -n -e - ttt -i pflog0
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
31 / 41
Logging
NOTA-1:
“When examining the logs, special care should be taken with tcpdump’s
verbose protocol decoding (activated via the -v command line option).
Tcpdump’s protocol decoders do not have a perfect security history. At
least in theory, a delayed attack could be possible via the partial packet
payloads recorded by the logging device. It is recommended practice to
move the log files off of the firewall machine before examining them in
this way.”
NOTA-2:
“Additional care should also be taken to secure access to the logs. By
default, pflogd will record 160 bytes of the packet in the log file. Access
to the logs could provide partial access to sensitive packet payloads (like
telnet(1) or ftp(1) usernames and passwords).”
Fonte: http://www.openbsd.org/faq/pf/logging.html
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
32 / 41
Nota sulle slides
le parole di colore blu, indicano di volta in volta nuovi
elementi (introdotti a lezione), o nel caso di “sintassi di
comandi”, marcatori che devono venire rispettivamente
sostituiti da altre parole
EX. action == block | pass
EX. aff == inet | inet6
nelle regole visibili nelle slide, che devono venire scritte nel file
di configurazione /etc/pf.conf, il carattere di \ è utilizzato
per indicare un “a capo” dettato da mancanza di spazio nella
slide; nel file di configurazione, la riga contenente tale
carattere e la successiva devono venire riportate su un’unica
riga del ruleset
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
33 / 41
Note sulle macchine virtuali
Dopo avere clonato la macchina virtuale openpita, per convertirla in
openslave, effettuare il loging come utente root ed invocare i seguenti
comandi:
cd ; bash c o n fi g _ as _ o pe n s la v e ; reboot
su openpita sono presenti 2 interfacce:
em0 (configurata in modalità “NAT” su VirtualBox)
em1 (configurata in modalità “Host-only Adapter” su
VirtualBox) a cui è assegnato l’indirizzo statico
172.12.1.1./12
su openslave sono presenti 2 interfacce:
em0 (configurata in modalità “NAT” su VirtualBox) ma non
attiva sulla macchina virtuale
em1 (configurata in modalità “Host-only Adapter” su
VirtualBox) a cui è assegnato l’indirizzo statico
172.12.20.20./12
CURIOSITÀ: per spegnere la macchina virtuale OpenBSD, utilizzare:
shutdown −ph now
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
34 / 41
Nota sugli esercizi
PRECISAZIONE:
Nei seguenti esercizi i termini “PF”, “$openpita”, “firewall” e
“gateway” verranno utilizzati in maniera intercambiabile, in quanto
si suppone che tutti gli esercizi vengano svolti con il supporto
VirtualBox e della macchina virtuale “openpita”.
Questa è la macchina che funge da firewall/gateway, le altre
macchine virtuali (clonate o aggiunge alla rete virtuale) possono
venire utilizzate per simulare altri elementi della sotto-rete.
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
35 / 41
Esercizio
0x00
Configurare PF in modo da:
Accettare in ingresso solo pacchetti provenienti dalla sottorete
172.16.0.0 - 172.31.255.255
consentire il transito dei soli pacchetti in ingresso destinati alle
porte 80 ed 8080
limitare a 4 il massimo numero di stati gestibili da PF
limitare a 2 il massimo numero massimo di indirizzi che
possono contemporaneamente creare uno stato
impostare il massimo numero di stati simultanei per ciascun
IP sorgente a 3
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
36 / 41
Esercizio
0x01
Modificare la configurazione realizzata nell’esercizio precedente in
modo da:
impostare a 2 il numero massimo di di connessioni, che hanno
completato correttamente il 3-way-handshake, che ogni host
può istanziare
memorizzare gli IP che non si adattano a tale regola nella
tabella <dosers>
impostare a 30 connessioni ogni 5 secondi il rate con cui è
possibile creare nuove connessioni
killare tutti gli stati associati ad un host che non “si attiene
alle regole” (crea troppe connessioni)
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
37 / 41
Esercizio
0x02
Configurare PF per venire utilizzato come un gateway, in grado di gestire
le connessioni peer-to-peer per una particolare macchina all’interno della
propria sottorete.
La macchina H che intende utilizzare l’applicazione P2P ha indirizzo
172.12.56.101
Il gateway comunica con Internet attraverso l’interfaccia em0, il cui
indirizzo viene assegnato tramite DHCP
La macchina gateway è dotata di un’ulteriore interfaccia em1, con
indirizzo IP 172.12.1.1, adibita alla comunicazione con gli host
della sotto-rete
Configurare il gateway in modo che:
dall’esterno sia possibile raggiungere solo la porta 4662 (TCP) di H
dall’esterno sia possibile raggiungere solo la porta 4672 (UDP) di H
H possa accedere ai webserver (porte 80 ed 8080)
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
38 / 41
Esercizio
0x03
Configurare PF per utilizzare nat per tutte le macchine all’interno della
sotto-rete, consentendo verso l’esterno l’accesso ai soli servizi: $(cat
/etc/services | grep −i sql).
Vietare l’accesso agli host nel range 172.16.20.0-172.16.20.100
abilitando anche il logging utilizzando una apposita interfaccia pflog2.
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
39 / 41
Esercizio
0x04
Aggiungere un secondo host (hostname “hacker”) alla sotto-rete ed assegnargli
indirizzo (172.16.50.50).
Modificare il file pf.conf per consentire le connessioni in ingresso, tramite ssh, solo al
hostname “openslave”.
Utilizzando hping effettuare uno spoofing del hostname, per inviare pacchetti SYN
come “openslave” dall’indirizzo IP (172.16.50.50 associato alla macchina “hacker”.
Modificare la precedente regola per consentire solo al solo indirizzo IP 172.16.20.20
di connettersi in ssh sul firewall. Utilizzando nmap sul host “hacker”, (172.16.50.50
modificare il proprio indirizzo IP nei pacchetti ed inviarli al gateway impersonando cosı̀
l’host “openslave”.
Abilitare antispoof nel file pf.conf.
L’attacco funziona ancora? Perchè?
Supponendo che l’host “hacker” abbia OS “Windows 2000” e quello di “openslave”
sia “OpenBSD”, modificare PF il file pf.conf aggiungendo una regola che consentire
il passaggio dei soli pacchetti provenienti da una macchina “OpenBSD”.
Si è definitivamente risolto il problema con questo stratagemma?
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
40 / 41
Link e materiale utile
man pf
man pf.conf
man pfctl
“PF: The OpenBSD Packet Filter”,
http://www.openbsd.org/faq/pf/
“The Book of PF: A No-Nonsense Guide to The OpenBSD
Firewall”, Peter N. M. Hansteen, ed. No Starch Press 2012
“Design and Performance of the OpenBSD Stateful Packet
Filter (pf)”, Daniel Hartmeier, USENIX 2002, LINK:
http://static.usenix.org/event/usenix02/tech/
freenix/full_papers/hartmeier/hartmeier.pdf
Srdjan Matic, Aristide Fattori
Proteggere la rete: firewall
7 Giugno 2013
41 / 41