Litt strengere

En litt mer komplett og oversiktlig situasjon får vi ved å nekte alt og bare åpne for det vi vet vi trenger[1]. Da får vi se to av de tingene som gjør det behagelig å jobbe med PF, nemlig lister og makroer.

Altså endrer vi litt på /etc/pf.conf og begynner med

block all

Så går vi litt opp i filen, for makroer må være definert før de kan brukes:

tcp_tjenester = "{ ssh, smtp, domain, www, pop3, auth, pop3s }"
udp_tjenester = "{ domain }"

Da har vi vist flere ting på en gang - hvordan makroer ser ut, at makroer godt kan være lister, og at PF forstår regler med protokollnavn like godt som de med portnummer. Navnene er de som er angitt i /etc/services. Da har vi noe som vi kan sette inn i reglene våre, som vi redigerer litt så de ser slik ut:

block all
pass out proto tcp to any port $tcp_tjenester 
pass proto udp to any port $udp_tjenester 

Husk på å legge til keep state i disse reglene hvis systemet du bruker har en PF-versjon som er eldre enn den som kommer fra OpenBSD 4.1.

Her vil sikkert noen innvende at UDP er tilstandsløs, men PF klarer faktisk likevel å ta vare på tilstandsinformasjon. Når du spør en navneserver om et domenenavn, ønsker du nok også å få svaret tilbake.

Siden vi har gjort endringer i pf.conf, laster vi reglene på nytt:

peter@skapet:~$ sudo pfctl -f /etc/pf.conf

og de nye reglene gjelder. Hvis det ikke er syntaksfeil, gir ikke pfctl deg noen meldinger under lastingen. Flagget -v vil gi mer 'verbose' eller ordrik oppførsel.

Hvis du har gjort store endringer i regelsettet ditt, kan det være lurt å sjekke reglene uten å laste dem. Det gjør du i så fall med pfctl -nf /etc/pf.conf. Alternativet -n gjør at reglene bare blir tolket uten å bli lastet, og du kan rette feil hvis du trenger det. Uansett vil det siste gyldige regelsettet du lastet, fortsette å gjelde til du enten deaktiverer PF eller laster et nytt regelsett.

Fotnoter

[1]

Nå spør du kanskje hvorfor jeg skriver regelsettet slik, med å nekte alt i utgangspunktet? Det korte svaret er at det gir deg bedre kontroll, i bytte mot minimalt med tenking. Hele poenget med pakkefiltrering er å ta kontrollen, ikke å jage etter de siste påfunnene som slemmingene kommer med. Marcus Ranum har skrevet en svært underholdende og informativ artikkel om dette, The Six Dumbest Ideas in Computer Security, som er vel verd å lese.