Komme igang med brannmur på Mac OSX

Fri 02 May 2014

I denne posten vil jeg gi deg den informasjonen du trenger for å få opp en effektiv brannmur på din Mac. OS X kommer med to typer brannmurer, hvor den ene fungerer på applikasjonslaget, og den andre på nettverkslaget. Jeg gir en kort innføring i begge variantene.

Introduksjon til ALF

Application Level Firewall (ALF) lar deg blokkere innkommende tilkoblinger til maskinen din. Jeg anbefaler at du skrur på denne brannmuren, noe som kan gjøres via det grafiske konfigurasjonsverktøy som du finner under:

"Systemvalg" -> "Sikkerhet og personvern" -> "Brannmur".

OS X Application Level Firewall Settings OSX Application Level Firewall Settings

Du kan også skru på ALF via kommandolinjen:

# defaults write /Library/Preferences/com.apple.alf globalstate -int 1

# launchctl load /System/Library/LaunchDaemons/com.apple.alf.agent.plist

# launchctl load /System/Library/LaunchDaemons/com.apple.alf.agent.plist

eventuelt skru av ALF via kommandolinjen:

# defaults write /Library/Preferences/com.apple.alf globalstate -int 0

# launchctl unload /System/Library/LaunchDaemons/com.apple.alf.agent.plist

# launchctl unload /System/Library/LaunchDaemons/com.apple.alf.agent.plist

Du kan også redigere de fleste innstillingene i ALF fra kommandolinjen:

# cd /usr/libexec/ApplicationFirewall

# ./socketfilterfw --help

Du kan lese den gjeldende ALF konfigurasjonen v.h.a defaults kommandoen:

# defaults read /Library/Preferences/com.apple.alf.plist

Du kan gjenopprette standard ALF konfigurasjon:

# cp /usr/libexec/ApplicationFirewall/com.apple.alf.plist /Library/Preferences/

Introduksjon til PacketFilter

Packet Filter (PF) er brannmuren fra operativsystemet OpenBSD. PF ble lansert 1 desember 2001, og brukes idag blant annet i OpenBSD, FreeBSD, NetBSD, Apple MacOSX + iOS (FreeBSD), Blackberry (NetBSD).

  • Fra og med Mac OS X 10.7 Lion har Apple byttet ut ipfw med pf
  • Mac OS X versjonen av pf er portet fra FreeBSD, og bruker pre-OpenBSD 4.6 syntaks

For å komme igang med pf trenger vi to ting:

  • pf konfigurasjonsfil(er).
  • en launchd oppføring for pf sånn at den starter opp ved booting av maskinen.

Som standard i operativsystemet finner vi en tom konfigurasjonsfil i: /etc/pf.anchors/com.apple , noe som gir oss to muligheter:

  • Ta utangspunkt i den eksisterende tomme konfigurasjonsfilen
  • Overse den eksisterende konfigurasjonsfilen og lag en ny

Ulempen med det første alternativet er at du vil miste konfigurasjonen din dersom Apple finner det for godt å gjøre noe med denne filen under en systemoppdatering.

pfctl har også litt issues med å laste reglene fra denne standard konfigurasjonsfilen.

Jeg velger å gå for alternativ 2 her siden mine erfaringer med oppdateringer fra Apple ikke er helt topp.

Komme igang

For å komme godt igang trenger starter vi med følgende fire filer:

  • pf konfigurasjonsfilen som leses ved oppstart
  • en ankerfil som inneholder regler og opsjoner som vi laster inn i pf ved oppstart
  • en makrofil som inneholder variabler som vi kan bruke i reglene våre
  • en launchdaemon som sørger for at pf kommer igang når vi starter maskinen

Vi oppretter filene med følgende innhold:

/etc/pf.anchors/no.visualisere.pf.conf

anchor “no.visualisere.pf"load anchor “no.visualisere.pf" from "/etc/pf.anchors/no.visualisere.pf.rules"
/etc/pf.anchors/no.visualisere.pf.rules

include "/etc/pf.anchors/no.uib.visualisere.pf.macros"

# Don't filter on the loopback interface
set skip on lo0

set ruleset-optimization basic

# Return blocked packet so that the other entity can free up its resources without waiting for timeouts
set block-policy return

# Scrub incoming packets, with no-df to prevent nfs from malfunctioning
scrub in all no-df

# Antispoof, with logging
antispoof log for $ext_if
antispoof log for $int_if

# Block by default, without log
block in

# Allow outgoing, without log
pass out

# Allow DHCP, without log
pass in inet proto udp from any port 67 to any port 68

# Allow ICMP, and log it
pass in log inet proto icmp

# Allow all from trusted servers, and log it
pass in log from $trusted_servers

/etc/pf.anchors/no.visualisere.pf.macros

icmp_types = "{ echoreq, unreach }"
ext_if = "{ en0 }"
int_if = "{ lo0 }"
trusted_servers = "{ 10.10.12.12, 10.10.13.13 }"

/Library/LaunchDaemons/no.visualisere.pf.plist


<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE plist PUBLIC "-//Apple Computer/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>no.uib.visualisere.pf</string>
<key>WorkingDirectory</key>
<string>/var/run</string>
<key>UserName</key>
<string>root</string>
<key>GroupName</key>
<string>wheel</string>
<key>Program</key>
<string>/sbin/pfctl</string>
<key>ProgramArguments</key>
<array>
<string>/sbin/pfctl</string>
<string>-e</string>
<string>-f</string>
<string>/etc/pf.anchors/no.uib.visualisere.pf.conf</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceDescription</key>
<string>FreeBSD Packet Filter (pf) daemon</string>
<key>StandardErrorPath</key>
<string>/var/log/pf.log</string>
<key>StandardOutPath</key>
<string>/var/log/pf.log</string>
</dict>
</plist>

Dette er et enkelt oppsett som blokkerer det meste av innkommende trafikk utenom DHCP og ICMP. Vi åpner også for trusted ip-adresser sånn at vi kan nå maskinen via ssh og lignende.

Om du vil lære deg PF finnes det lenker til artikler og bøker som du kan kikke nærmere på.

Noen kjekke kommandoer


pfctl -sa , gir oss full statusinformasjon
pfctl -v -n -f <path to configuration file> , parser konfigurasjonsfilen og eventuelle ankerfiler som refereres til

Skru på logging

For å logge hva som skjer kan vi bruke tcpdump for å lytte på interfacet som pf logger til.

Først oppretter vi interfacet:


# ifconfig pflog0 create

, så kan vi lytte på det:

# tcpdump -n -e -ttt -i pflog0

Lenker

  • http://home.nuug.no/~peter/pf/
  • http://www.openbsd.org/faq/pf/
  • https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man8/pfctl.8.html
  • https://developer.apple.com/library/mac/documentation/Darwin/Reference/Manpages/man5/pf.conf.5.html#//apple_ref/doc/man/5/pf.conf

Comments