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