Komme igang med brannmur på Mac OSX
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".
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