Firewally, bezpečnost

Petr Malý, xmaly<at>fi.muni.cz


Obsah


Co je firewall

Firewall je zařízení (zpravidla počítač) sídlící mezi dvěma (nebo i více) sítěmi, který omezuje, monitoruje či dokonce upravuje veškeré informace proudící mezi nimi, a to oběma směry. Typické použití firewallu je na hranici lokální sítě a Internetu, kde chceme chránit zejména relativně důvěryhodné prostředí lokální sítě od škodlivých útoků z Internetu.

Typy firewallů

V praxi jsou uvedené typy firewallů kombinovány.

Paketový filtr

Nejdůležitější stupeň každého firewallu. V základní podobě pracují pouze na síťové vrstvě ISO/OSI. V podstatě se chová jako filtrující router, neboť zkoumá procházející pakety na základě IP hlavičky. Podle nastavených pravidel potom rozhoduje jak s pakety naloží, zejména zda daný paket zahodí nebo propustí. Paketové filtry se postupem času vyvíjely a dnes už často zasahují i do jiných vrstev OSI modelu (např. linkové při klasifikaci podle ethernetové adresy).
Výhody:
Jsou velmi rychlé a nenáročné - analýza na základě hlaviček paketů nemá velké nároky na výkon. Navíc je filtrování obvykle zabudováno přímo v jádře systému. Není také třeba uchovávat žádné stavové informace.
Pro uživatele jsou transparentní - není potřeba žádným způsobem upravovat ani nastavovat uživatelské aplikace.
Nevýhody:
Sledují pouze hlavičky paketů - neumí se rozhodovat podle vyšších vrstev, nerozumějí návaznosti jednotlivých paketů.
Nutná velká pozornost při konfiguraci filtrů - pro precizní zabezpečení potřebujeme mít povoleno právě to co používáme a nic navíc.
Nepodporují autentizační mechanizmy (maximálně tak autentizaci podle IP adres ...)
Omezené možnosti logování - náročné na výkon (co vlastně logovat?).

Stavový firewall

Rozšíření paketových filtrů, které umožňuje rozhodování o osudu paketů na základě informací z okolních vrstev OSI modelu. Příkladem je zahazování, paketů které neodpovídají žádnému existujícímu TCP spojení. Náročné na výkon, neboť je třeba analyzovat celý paket a uchovávat si stavové informace. Někdy není bráno jako zvláštní typ firewallu, ale pouze jako nádstavba paketového filtru.

Aplikační proxy

Brána, která pracuje na úrovni aplikační vrstvy. Principem je, že všechny pakety procházející ven ze sítě musí projít touto branou, což je využíváno pro řízení přístupu k vnější síti (např. omezení velikosti stahovaných souborů, žádné porno) a monitorování provozu (např. co kdo stáhl). Komunikace většinou probíhá tak, že lokální klient kontaktuje proxy server, který poté vystupuje jako prostředník (server pro lokálního klienta, a klient pro vnější server) při komunikaci. Příkladem je HTTP proxy, FTP proxy, SMTP proxy apod.
Výhody:
Logování - proxy umožňují precizní logování (až na úrovni uživatelů).
Možnost cacheování - může snížit počet vnějších dotazů a zvýšit výkon.
Umožňují autentizaci - např. pomocí hesla jednotlivé uživatele.
Není potřeba podpora v jádře systému.
Nevýhody:
Pro uživatele není transparentní - je třeba u aplikací nastavit použití proxy serveru (přičemž aplikace to musí umožňovat).
Náročnost na výkon - každá služba potřebuje vlastní proxy.

Analyzátor paketů

Pasivní zařízení, jehož výstupem jsou výstražné, logovací nebo chybové zprávy. Tímto typem se zde nebudeme podrobněji zabývat. Příkladem je nástroj
Snort, jehož funkcionalita se však už blíží IDS.

NAT

NAT (Network Address Translation) je služba sloužící k převodu vnitřních privátních adres na adresy veřejné (nejčastěji na jednu jedinou), které je možno používat v Internetu. NAT lze rozdělit na dva typy: Výhody:
Skrytí vnitřní struktury sítě při pohledu zvenčí.
Jednoduchá konfigurace klientů - stačí nastavit NAT jako bránu (jinak zůstávají beze změny).
Nevýhody:
Zvnějšku není možné do sítě přímo přistupovat - komunikace musí být iniciována zevnitř sítě (možnost použití speciálního software pro přeposílání portů)
Problémy při použití DHCP.

Paketové filtry na Linuxu

Paketový filtr je součástí Linuxu již od verze jádra 1.1 (1994). V těchto nejstarších verzích byl založen na ipfw převzatém ze sytému BSD. Ve verzi 2.0 přibyl uživatelský nástroj ipfwadm pro nastavení filtrovacích pravidel. Ve verzi 2.2 byl rozšířen nástrojem ipchains. V dalších verzích jádra byl kód firewallu zcela přepsán a proto se ve verzích jádra 2.4 a novějších (včetně aktuální řady 2.6.x) pro nastavení filtrovacích pravidel používá nástroj iptables, který je dalším rozšířením ipfwadm a ipchains.

Netfilter

Základem nové implementace pro jádra 2.4 a novější je firewallový subsystém
netfilter. Je součástí jádra (možno i v modulech). Jedná se o firewall, který kromě základního paketového filtru podporuje také stavové filtrování a NAT.
Pro jeho provoz potřebujeme mít v konfiguraci jádra zapnuto alespoň (v originálních jádrech distribucí toto již zapnuto je): Pro využití všech možností netfilteru je nutné zapnout i další volby v Networking Options -> IP: Netfilter Configuration.

iptables

Iptables slouží k nastavení a správě tabulek (= tables) filtrovacích pravidel v jádře Linuxu. Tabulky obsahují řetězce (= chains) pravidel. Ty mohou být jednak předdefinované (= implicitní, základní, vestavěné), které nelze smazat, a nebo definované uživatelem. Pro zpřehlednění jsou rozlišovány 3 typy tabulek: Řetězec je pojmenovaný seznam pravidel. Každé pravidlo obsahuje podmínku a akci. Pokud daný paket vyhovuje (match) podmínce, provede se nějaká akce (target, jump). Po některých z možných akcí paket putuje dále řetězcem (př. logování), po jiných v řetězci končí (př. zahození paketu). Seznam možných akcí je uveden dále. Pokud paket podmínce nevyhovuje, přechází se na další pravidlo v řetězci. Implicitní řetězce obsahují na konci také takzvanou policy, což je pravidlo, které se aplikuje na paket, pokud projde všemi předchozími pravidly v řetězci. Standardní nastavení policy je ACCEPT; u bezpečně nastaveného systému by však pravidla v řetězci měla ošetřovat všechny potřebné možnosti a policy by měla být nastavena na DROP.
Obecně mohou být řetězce i prázdné, implicitní však musí obsahovat alespoň policy.
Akce mohou být: Schéma paketového filtru Linuxového firewallu tedy vypadá asi takto:
      network
         |		
         v
  +-------------+
  | PREROUTING  |
  +-------------+
         |
         |
  /-------------\          +-------+
 ( input routing ) ------- | INPUT | -------- +
  \-------------/          +-------+          |
         |                                  local
         |                                 process
  +-------------+                             |
  |   FORWARD   |                         +--------+
  +-------------+                         | OUTPUT |
         |                                +--------+
         |          /--------------\          |	
         + ------- ( output routing ) ------- +
         |          \--------------/
         |
  +-------------+
  | POSTROUTING |
  +-------------+
         |		
         v
      network
V obdelníkových rámečcích jsou vyznačené řetězce, což jsou tedy základní body, ve kterých je paket možno zpracovávat. Řetězce (tabulky filter) INPUT, OUTPUT a FORWARD jsou implicitní. Řetězce PREROUTING a POSTROUTING se používají především pro NAT (tabulka nat), konkrétně PREROUTING pro DNAT (jak je patrno z názvu, uplatní se ještě před routováním, tedy procházejí jím pakety jak pro lokální stroj, tak ty které budou přesměrovány jinam), POSTROUTING pro SNAT (inverzně :).
Základní průchod každého paketu jádrem tedy vypadá asi takto (teď neuvažujeme nat): Poznamenejme, že forwardování paketů "zapneme" pomocí:
 echo "1" > /proc/sys/net/ipv4/ip_forward
Nastavení iptables nepřežije reboot, proto je nutné tabulky plnit ve startovacích skriptech. Pro uložení nakonfigurované tabulky je možné použít příkaz iptables-save(8), který implicitně zapisuje na standardní výstup. Pro opětovné načtení se používá příkaz iptables-restore(8), který načítá ze standardního vstupu.

Konfigurace iptables

Základním příkazem je iptables(8). Po nabootování stroje jsou implicitní řetězy prázdné, s policy nastavenou na ACCEPT. V některých parametrech je možné použít i znak !, což značí negaci pravidla (výhodné obzvláště u -s a -d).
Základní parametry pravidel, které určují podmínky pro pakety: Základní parametry pro manipulaci s řetězy: Základní parametry pro manipulaci s pravidly v řetězech:

Příklady

Základní filtrování

Pokud se budeme řídit podle pravidla, že "co není výslovně dovoleno, je zakázáno", měl by náš firewallový skript začínat asi takto:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
Povolíme základní ICMP pakety potřebné alespoň pro ping a traceroute (0 - Echo reply, 3 - Destination unreachable, 8 - Echo request, 11 - Time exceeded):
iptables -A INPUT -p ICMP -i eth0 --icmp-type 0 -j ACCEPT
iptables -A INPUT -p ICMP -i eth0 --icmp-type 3 -j ACCEPT
iptables -A INPUT -p ICMP -i eth0 --icmp-type 8 -j ACCEPT
iptables -A INPUT -p ICMP -i eth0 --icmp-type 11 -j ACCEPT
Povolíme také systémový loopback. Dále předpokládejme, že např. máme počítač připojený jedním rozhraním do důvěryhodné sítě. Pak použijeme:
iptables -A INPUT -p ALL -i lo -j ACCEPT
iptables -A INPUT -p ALL -i eth1 -j ACCEPT
Pokud má být např. na našem počítači ze strany internetu dostupné WWW a SMTP rozhraní, použijeme:
iptables -N tcp_segmenty
iptables -A INPUT -p TCP -i eth0 -j tcp_segmenty
iptables -A tcp_segmenty -p TCP --dport 80 -j ACCEPT
iptables -A tcp_segmenty -p TCP --dport 25 -j ACCEPT
Zde je pěkně vidět tvorba uživatelského řetězce.

Stavové filtrování

Jak již bylo řečeno, při filtrování dokáže netfilter zohledňovat také stavové informace. Rozlišujeme tyto stavy: Tohoto lze s výhodou využít, pokud chceme například povolit neomezené směrování paketů z vnitřní sítě, ale z vnějšku dovnitř pouze již existující spojení:
iptables -A FORWARD -i eth1 -j ACCEPT
iptables -A FORWARD -i eth0 -o eth1 -m state --state ESTABLISHED,RELATED -j ACCEPT

NAT

O NAT jsme si již něco pověděli. Nejčastějším použitím SNAT je IP maškaráda, neboli zamaskování IP adresy routovaných paketů adresou routeru. Používá se například pokud máme od poskytovatele přidělenu jedinou IP adresu, a chceme připojit k síti větší množství počítačů. Veřejnou adresu dáme routeru, ostatním dáme adresy privátní, a použijeme např.:
iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to 1.2.3.4
U všech paketů dojde tedy při opuštění naší vnitřní sítě přes eth0 k přepsání původní IP adresy na adresu 1.2.3.4. Lze také uvádět rozsahy adres, což se využívá při rozdělení zátěže (load balancing - vybere se nejdéle nepoužitá). Pokud vnější adresu v okamžiku zavádění pravidla ještě neznáme, například proto, že ji teprve získáme z DHCP serveru, uvedeme trošku jednodušeji:
iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
Příkladem pro DNAT je například přesměrování všech požadavků na jediný WWW server v naší vnitřní síti, řekněme:
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to 192.168.0.2:8080
Speciálním případem DNAT je přesměrování. Například:
iptables -t nat -A PREROUTING -i eth1 -p tcp --dport 80 -j REDIRECT --to-port 3128
dovoluje přeposílat příchozí HTTP pakety na transparentní proxy (squid) v naší síti.
Rozdíl mezi filtrovací tabulkou a NAT tabulkou je také v tom, že zatímco filtrovací tabulkou prochází každý paket bez rozdílu, tak NAT tabulka je aktivní pouze pro první paket nového spojení. Proto tedy není vhodné používat NAT tabulku pro nějaké složité filtrování. S výhodou však můžeme NAT tabulku často použít prostě proto, že pravidla stačí zapsat jen jednou a nemusíme je zdvojovat v INPUT a FORWARD. Následující pravidla nám například zakážou pakety s nesmyslnou zdrojovou adresou přicházející zvenčí naší sítě:
iptables -t nat -A PREROUTING -i eth0 -s 192.168.0.0/16 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 172.16.0.0/12 -j DROP
iptables -t nat -A PREROUTING -i eth0 -s 10.0.0.0/8 -j DROP
Nesmíme zapomínat, že pokud paket vyhověl v tabulce nat, ještě to neznamená, že má volný průchod tabulkou filter. Obzvlášť při restriktivní politice (policy DROP) je nutné dané spojení vždy ještě povolit v tabulce filter.

Mangle

Tabulka mangle zavádí nový prostředek pro výběr paketu - označení paketu pomocí MARK. To může být použito v následujících pravidlech. Příklad:
iptables -t mangle -A PREROUTING -p tcp --dport 22 -j MARK --set-mark 1
Mangle také dovoluje měnit například TTL (podobně také TOS) paketu:
iptables -t mangle -A PREROUTING -i eth0 -j TTL --ttl-dec 64

Paketový filtr na BSD

Na BSD zajišťuje nastavení firewallu utilita ipfw. V současné době je k dispozici vylepšená verze ipfw2, která přináší řadu rozšíření. Funkcionalita je podobná jako u netfilteru. Po instalaci je firewall defaultně velmi restriktivně nastaven, což je nutné brát v úvahu při instalaci na dálku (k nastavení se nedostaneme :). Pěkný návod je
zde.

Odkazy:

Linux 2.4 Packet Filtering HOWTO
Linux 2.4 NAT HOWTO
Linux netfilter Hacking HOWTO
Seriál "Stavíme firewall" na Rootu
Seriál "iptables - jak na to" na undergroundu

xmaly<at>fi.muni.cz, 14.12.2004