PF ed OpenBSD:
Tecniche di base
Intervento tenuto da
Gabriele Biondo
([email protected])
per
id (sostituisce il vecchio, deprecato whoami)
GABRIELE BIONDO
•Amministratore di sistema per più facoltà dell’Università di Bologna
•Tecnico coinvolto nel progetto Unisys Hotline
•Formatore per Corsi del Fondo Sociale Europeo
•Collaboratore con OpenBEER
•Certificato ISECOM OPST
Interessi
•Firewalling e sicurezza di rete
•Modelli matematici e ottimizzazione di algoritmi
•Programmazione in C e Perl
Le domande fondamentali
Perché OpenBSD
•Sistema “sicuro per default”, facilmente hardenizzabile
•Sistema Free (o quasi)
•Sistema OpenSource
•Sistema in continua evoluzione
•Sistema veramente stabile
OpenBSD risulta essere la piattaforma di partenza ideale
per costruire un firewall
Le domande fondamentali
Perché PF
•Grammatica veramente semplice
•Sistema di regole molto pratico
•Configurazione modificabile a runtime
•Stabilità assoluta del firewall
•Caratteristiche avanzatissime (es: scrubbing)
•Abbondanza di documentazione free o a basso costo
PF è un software assai potente,
che offre caratteristiche presenti soltanto in
prodotti commerciali di notevole caratura,
ad un prezzo esiguo.
Le domande fondamentali
Chi usa OpenBSD + PF
•Adobe Systems
•INFN (Istituto Nazionale Fisica Nucleare) di Firenze
•Azienda Ospedaliera “Carlo Poma” di Mantova
Solo tre nomi, la cui rilevanza dovrebbe far pensare
La lista potrebbe essere arbitrariamente allungata…
PF – questo sconosciuto
Dove risiede PF
PF è un pacchetto integrato nel Kernel di OpenBSD,
A partire dalla versione 3.0 in poi.
PF – questo sconosciuto
Cosa è PF
PF è un programma – ad un input costituito da un file di regole
ed un traffico di rete, associa un output costituito da un file di log
e dal comportamento del nuovo traffico “shaped”
Configurare PF
Il file di configurazione di PF
•/etc/pf.conf
•Composto di più sezioni
•L’ordine delle sezioni è prefissato, ma modificabile
•Le regole vengono valutate in sequenza
Configurare PF
Le sezioni di pf.conf
1. macro
2. tabelle
3. opzioni
4. regole di scrub
5. regole di queuing
6. regole di redirezione/NAT
7. regole di filtraggio
Configurare PF
pf.conf – un esempio di configurazione
Supponiamo di trovarci nella seguente condizione:
•Macchina intel compatibile
•2 schede di rete Realtek
rl0:
rl1:
•Connessa alla rete interna (192.168.1.0/24)
•ip: 192.168.1.1
•web server: 192.168.1.2
•mail server: 192.168.1.3
•Connessa alla WAN
•ip fisso: aaa.bbb.ccc.ddd/28
•Connessa ad un router che lega la rete ad una parte
non protetta dal firewall e ad internet
Configurare PF
Modelliamo la rete interna con delle semplici macro
# MACRO
# Interfaccia di rete interna
int_if = “rl0”
int_ip=“192.168.1.1”
int_net=“192.168.1.0/24”
# Interfaccia di rete esterna
ext_if = “rl1”
ext_ip=“aaa.bbb.ccc.ddd”
ext_net=“aaa.bbb.ccc.ddd/28”
# altre macro utili
mebserver=“192.168.1.2”
mailserver=“192.168.1.3”
Configurare PF
Anatomia generale di una regola:
Configurare PF
VERBI
pass
Fa passare il pacchetto
block
Blocca il pacchetto
nat
Specifica come fare NATting
rdr
Specifica come “incrociare” le porte
log
Specifica di scrivere la entry sul file di log
Configurare PF
DIREZIONI
Configurare PF
SORGENTE/DESTINAZIONE
Indirizzo IPv4/IPv6 singolo:
192.168.0.33/32
FEC0:A702:0000:0000:0000:448A:0000:0005
Sottorete:
192.168.0.0/28
FEC0:A702::::448A::0005/64
Possibilità di aggiungere un servizio:
192.168.1.10 port 80
Possibilità di specificare un protocollo:
proto tcp
proto {tcp,udp}
Configurare PF
Le prime regole di default
Siamo ora in grado di potere scrivere le prime regole.
Come default, ammettiamo di tenere chiuso ogni tipo di comunicazione,
da e verso l’esterno. Apriremo poi quello che decideremo utile.
block in all
block out all
Una policy migliore, sebbene costosa, potrebbe essere:
block in log all
block out log all
Anche in questo caso, avremmo potuto utilizzare altre direttive che, per
esempio, permettono di filtrare sul protocollo. Ciò va comunque oltre lo
scopo di questa presentazione.
Configurare PF
Situazione attuale
Il firewall ha isolato la LAN da internet.
Configurare PF
Un paio di idee…
In primo luogo, è necessario impostare i settaggi del natting:
nat on $ext_if from $int_net to any ->($ext_if)
Poi è importante ridirigere agli host giusti le chiamate www e smtp:
rdr on $ext_if proto tcp from any to $ext_ip \
port www -> $webserver port www
rdr on $ext_if proto smtp from any to $ext_ip \
port smtp -> $mailserver port smtp
Configurare PF
Un paio di idee…
In primo luogo, vorremo aprire le connessioni provenienti da internet e
dirette al nostro server di posta ed al server web:
pass in on $ext_if proto tcp from any to $webserver \
port www keep state
pass in on $ext_if proto tcp from any to $mailserver \
port smtp keep state
Configurare PF
Situazione attuale
Tutte le chiamate al web ed al mail server provenienti dall’esterno vengono
ora soddisfatte
Configurare PF
Apriamo le porte…
Vogliamo permettere ai nostri utenti di connettersi, da dentro la rete a qualsiasi
host presente su internet
pass in on $ext_if from $int_net to any keep state
pass out in $ext_if from $int_net to $ext_net \
modulate state
Configurare PF
Situazione attuale
La situazione attuale è più complicata.
•Il firewall permette agli host interni alla rete di connettersi a qualsiasi
servizio di qualsiasi host presente su internet
•Il firewall rifiuta connessioni provenienti da internet, eccetto quelle dirette
al mail server ed al server web.
•Il firewall permette la connessione agli host nella rete esterna.
Una nota – questa configurazione è altamente insicura ed è presentata qui
soltanto per motivi concernenti l’illustrazione del funzionamento delle regole
in pf.
Esplicitamente, sottolineiamo di non implementare questa configurazione nel
proprio laboratorio, se non per fini didattici.
Configurare PF
Situazione finale
Prendendo tutte le regole viste sinora, e mettendole insieme, abbiamo un
file /etc/pf.conf teoricamente funzionante.
Configurare PF
Situazione finale
# MACRO
# Interfaccia di rete interna
int_if = “rl0”
int_ip=“192.168.1.1”
int_net=“192.168.1.0/24”
# Interfaccia di rete esterna
ext_if = “rl1”
ext_ip=“aaa.bbb.ccc.ddd”
ext_net=“aaa.bbb.ccc.ddd/28”
# altre macro utili
mebserver=“192.168.1.2”
mailserver=“192.168.1.3”
scrub in all
Configurare PF
Situazione finale (continua)
scrub in all
#natting e redirezionamento
nat on $ext_if from $int_net to any ->($ext_if)
rdr on $ext_if proto tcp from any to $ext_ip \
port www -> $webserver port www
rdr on $ext_if proto smtp from any to $ext_ip \
port smtp -> $mailserver port smtp
Configurare PF
Situazione finale (continua)
block in log all
block out log all
pass in on $ext_if proto tcp from any to $webserver \
port www keep state
pass in on $ext_if proto tcp from any to $mailserver \
port smtp keep state
pass in on $ext_if from $int_net to any keep state
pass out in $ext_if from $int_net to $ext_net \
modulate state
antispoof for $int_if
antispoof for $ext_if
Risorse aggiuntive
web
www.openbsd.org
http://www.benzedrine.cx/pf.html
www.i-nfinity.com
www.openbeer.it
Risorse aggiuntive
web
www.openbsd.org
http://www.benzedrine.cx/pf.html
www.i-nfinity.com
www.openbeer.it
Risorse aggiuntive
Libri che aiutano
Risorse aggiuntive
Libri che aiutano
Risorse aggiuntive
Libri che aiutano
Loose Leaves
Ringraziamenti
Matteo Cantoni, aka goony
Franco e tutto lo staff di Proxima Solutions, Rimini
Ilary Airoldi
Lo staff del webbit
Me stesso e la mia famiglia
E per Elisa, che mi ha dimostrato che la saggezza non ha età:
“Ci sono occasioni in cui un semplice ‘grazie’ non è abbastanza”
Scarica

PF ed OpenBSD: Tecniche di base