Fotografický magazín "iZIN IDIF" každý týden ve Vašem e-mailu.
Co nového ve světě fotografie!
Zadejte Vaši e-mailovou adresu:
Kamarád fotí rád?
Přihlas ho k odběru fotomagazínu!
Zadejte e-mailovou adresu kamaráda:
Agregator
Mac OS X: Bezpečí za dvojitou zdí
pf
18. ledna 2012, 00.00 | V OSX si uživatel může jedním kliknutím vztyčit ochrannou zeď aplikačního firewallu. Někomu to stačí, ale méně lidí tuší, anebo dokonce využívá možnost druhé ochranné zdi, kvalitní a velmi mocné. Lze ji využít k rozličným věcem a její jméno je firewall pf. Naším cílem je se s ním seznámit a vytvořit postup hodící se těm, kteří by rádi dosáhli vyšší bezpečnosti svého stroje.
Pro klidnější a bezpečnější život s naším oblíbeným operačním systémem bychom mohli investovat trochu času do lepšího porozumění a prozkoumání možností, které nám skýtá. Vlastně máme na výběr: cestu do zákoutí příkazové řádky nebo koupi některého nástroje, jako například Little Snitch.
Když už zde mluvíme o zdi druhé, neškodilo by se nejprve zmínit o zdi první. Je jím aplikační firewall, který je vlastně jediný zakomponován do GUI prostřednictvím panelu Security & Privacy v Systémových preferencích.
Na úrovni systému je aplikační firewall realizován modulem jádra neboli rozšířením com.apple.nke.applicationfirewall. Lze ho ovládat binárkou socketfilterfw, což ilustruje následující obrázek.
socketfilterfw na příkazové řádce
Cesta, která zde byla pro vybudování druhé ochranné zdi vybrána, se jeví jako přirozená. Vyžaduje se pouze znalost syntaxe firewallových pravidel a trocha povšechných vědomostí souvisejících s používaným systémem. Po přechodu na Mac se u verzí 10.5 a 10.6 dalo spolehnout na nástroj WaterRoof (WR), který graficky spravoval pravidla firewallu ipwf. Nyní u 10.7 se situace změnila. Ne že by WR nešlo používat, ale firewall ipfw zde byl označen za zastaralý a nahrazen nástrojem pf. Oba původně pocházející z OpenBSD, přičemž pf lze pokládat za to nejlepší z oboru. Jeho možnosti jsou obrovské. Bohatou studnicí informací je kniha The Book of pf od Petera N.M. Hansteena. V OSX 10.7 je pf dokonce implicitně aktivní! Ale bohužel bez aktivních pravidel. V konfiguračním souboru /etc/pf.conf lze sice zahlédnout náznak budoucích pravidel přímo od výrobce, ale skutek utek, možná proto, že nezbyl čas. Snad se někdy dočkáme nativní podpory pf v GUI.
Nyní nezbývá, než se do úprav pustit sami. Jako první krok před námi stojí plná aktivace pf. Toho docílíme prostřednictvím následujících kroků.
- Plnou aktivaci pf docílíme drobnou úpravou souboru /System/Library/LaunchDaemons/com.apple.pfctl.plist, kde v řádku argumentů programu je nutno přidat písmeno e, takže vznikne řetězec
-ef místo původního-f . - Abychom mohli zaznamenávat vybrané události ve filtračních pravidlech, musíme vytvořit patřičné virtuální zařízení, jenž bude pf používat pro potřeby logování. Pomůžeme si pomocí skriptu spouštěného v rámci launchd. Za tímto účelem umístíme do adresáře /Library/LaunchDaemons soubor cz.malina.pflog.plist, který odkazuje na skript pflog.sh pro výrobu logovacího rozhraní. Ten patří do adresáře /usr/local/bin.
Nyní jsme připraveni a můžeme se pustit do tvorby vlastních pravidel pro druhou ochrannou zeď.
Předem je nutno si uvědomit, že pravidla nebývají na různých počítačích stejná, obvykle si je každý přizpůsobuje obrazu svému. Pro desktop jsou podstatně jednodušší než pro server. Pro úpravu pravidel je třeba, abychom věděli něco o službách které nabízíme a vyžadujeme. Má pravidla jsou zaměřena na desktop a snaží se být maximálně jednoduchá. Odpovídají následujícím zásadám.
- Odděl zrno od plev. To jest zahodit pakety, které jsou podvržené, nemají směr návratu, neprojdou normalizací a nebo pocházejí z běžného skenování,
- Povol odchozí pakety, tedy ty, které jsou iniciovány z našeho stroje,
- Povol příchozí pakety směřující ke službám, které vystavuji, například vzdálený přístup pomocí SSH,
- Povol pakety nezbytné pro bezproblémovou existenci v síti. Zde například ICMP, DHCP atd.
Jako další si musíme uvědomit přechodnou rozpolcenost dnešní počítačové komunikace plynoucí z faktu, že svět počítačů je nucen změnit místo pobytu, a přejít ze světa IPv4 do světa IPv6. Máme je oba ve svém stroji, je tedy vhodné je oddělit do dvou separátních souborů. Pravidla pro IPv4 jsou následující.
# Packet normalization scrub in on { en0, en1 } no-df # Basic policy block return log all pass out all keep state # Do not allow garbage in antispoof quick for { lo0, en0, en1 } # Block NMAP scans and scans with weird flags block in log quick from any os "NMAP" to any label ExtNMAPScan block in quick proto tcp flags FUP/WEUAPRSF block in quick proto tcp flags WEUAPRSF/WEUAPRSF block in quick proto tcp flags SRAFU/WEUAPRSF block in quick proto tcp flags /WEUAPRSF block in quick proto tcp flags SR/SR block in quick proto tcp flags SF/SF # Block anything coming form source we have no back routes for block in quick from no-route to any # No rules for localhost set skip on lo0 # Open SSH pass in proto tcp from any to any port = ssh flags S/SA keep state # Open DHCP pass in proto udp from any to any port = bootpc keep state pass in proto udp from any to any port = bootps keep state pass in proto udp from any to any port = ssdp keep state # Netbios pass in proto udp from any to any port = netbios-ns keep state pass in proto udp from any to any port = netbios-dgm keep state pass in proto udp from any to any port 49500:65245 keep state # Zeroconfig pass in proto udp from any to any port = llmnr keep state # mDNS pass in proto udp from any to any port = mdns keep state # ICMP pass in inet proto icmp all icmp-type {echoreq, echorep, unreach, timex, paramprob} # IGMP pass in proto igmp all allow-opts |
A pravidla pro IPv6 jsou pak obdobná.
block return log all pass out inet6 proto udp keep state pass out inet6 proto tcp keep state # Open SSH pass in inet6 proto tcp from any to any port = ssh flags S/SA keep state # Open DHCP pass in inet6 proto udp from any to any port = bootps keep state # DHCPv6 pass in inet6 proto udp from any to fe80::d561 port 547 keep state pass out inet6 proto udp from any to any port 546 keep state # mDNS Bonjour pass in inet6 proto udp from any to any port 5353 keep state pass out inet6 proto udp from any to any port 5353 keep state # ICMP pass in inet6 proto ipv6-icmp all icmp6-type {echoreq, echorep, unreach, timex, paramprob, neighbradv, neighbrsol, routeradv} |
Ovládání druhého valu a jeho konfigurace
Ovládání pf je realizováno pomocí nástroje pfctl, který má celou řadu přepínačů. Nejdůležitější jsou přepínač pro aktivaci –e a přepínač –d pro deaktivaci. Typický příkaz pro zapnutí je pfctl –vvv –ef /etc/pf.conf, kdy pf předkládáme také konfigurační soubor. Tento soubor nám mimo jiné umožňuje rozdělování pravidel dle jmen, kterým se říká kotvy - anchors. Tyto kotvy také dělí pravidla dle účelu na ta pro přesměrování nebo samotnou filtraci a třeba NAT1. My si do něj pouze přidáme definici logovacího zařízení, které pak můžeme všude využít. Dělá se přidáním řádky set loginterface pflog0. Pro vlastní pravidla využijeme kotvu com.apple, která je realizována pomocí stejně pojmenovaného souboru. Po úpravě vypadá ve zkrácené verzi následovně.
... # # Application Firewall anchor point. # anchor "250.ApplicationFirewall/*" anchor "910.CustomLocalRules/*" load anchor "910.CustomLocalRules" from "/etc/pf.anchors/910.CustomLocalRules" anchor "911.CustomLocalRules/*" load anchor "911.CustomIPv6LocalRules" from "/etc/pf.anchors/911.CustomIPv6LocalRules" |
Všimněme si kotev 910 a 911, které nám umožňují definovat lokální pravidla pro IPv4 a IPv6. Jako elementární úvod k pf nám to musí postačit. Ti, kteří budou chtít vědět víc, odkáži na v textu zmiňovanou knihu, manové stránky nebo internet.
K čemu nám to je?
Nyní jsme významně posílili bezpečnost našeho systému. K pozorování chování pf pravidel využijeme logovací zařízení a klasických technik, využitelných pro pozorování síťové komunikace obecně. K dispozici máme různé nástroje. Příznivci příkazové řádky ocení „starý dobrý“ tcpdump, který postačí. Příklad použití (sudo tcpdump -nv -e -ttt -i pflog0) ilustruje následující screenshot.
Pokud máte raději GUI anebo vás pozorování síťové komunikace baví, nainstalujte si program Wireshark z wireshark.org. Běží sice jako X-Window aplikace, ale jeho schopnosti jsou obrovské. Použijeme-li ho pro pozorování logovaných událostí z firewallu, vypadá to následovně.
Wireshark se hodí také pokud například chcete zjistit, co dělá Photoshop při aktivaci atp.
Potíže se stabilitou
Během hrátek s pf a ladění pravidel jsem zaznamenal několik situací, které asi indikují, že portace na OSX není ještě zcela odladěna. Můžeme si všimnout chybějící podpory front, což není ještě tak hrozné. Hrátky s pf v mém případě někdy ovlivňovaly i stabilitu stroje, respektive jeho síťového subsystému. Problémy se projevují náhodně s minimální frekvencí, bohužel však o to fatálněji. I když celý stroj žije, síťová volání nefungují. Pro stroje, které slouží jako pracovní, není tedy popsaný postup zatím vhodný. Doufejme, že s verzí 10.7.3 se situace zlepší a problémy budou odstraněny. Pokud akceptujete popsaná rizika, je uvedený popis použitelný. Osobně ho využívám již několik týdnů. Snad se bude hodit i vám.