Firewally, bezpečnost

Jan Svoboda, certik(at)fi.muni.cz


Obsah


Co je to firewall

Firewall je v našem případě nějaká pomyslná brána, přes kterou chodí síťový provoz. Může to být například samostatný počítač, který od sebe odděluje celé sítě (např. zabezpečení nějaké vnitřní sítě - intranetu od veřejné, nedůvěryhodné sítě - internetu), nebo jen něco v jádru ip stacku, což umožňuje lepší kontrolu nad pakety, které z/do počítače proudí.


Paketové filtry

Paketové filtry jsou nejjednodušší a nejzákladnější forma firewallu. Rozhodují se pouze na základě hlaviček paketů (zdrojová/cílová adresa/port) - síťová vrstva ISO/OSI.

Výhody a nevýhody:
+ Jsou transparentní, není třeba jakkoli upravovat aplikace
+ Z principu jsou velmi jednoduché, takže i rychlé a nenáročné
+ Obvykle přímo součástí jádra systému
- Umožňují sledovat pouze jednotlivé pakety, neumožňují hlídat návaznosti mezi nimi
- Neumožňují žádnou autentizaci
- Velmi nešikovné logovaní (težko se rozhoduje co logovat, při větším provozu to snadno přeroste přes hlavu)


Stavové firewally

Stavové firewally jsou rozšířením paketových filtrů. Udržují navíc informace o spojeních, takže umožňují hlídat souvislosti mezi jednotlivými pakety.

Výhody a nevýhody:
+ Díky hlídání souvislostí můžeme nastavit lepší bezpečnostní politiky, například zahazování paketů z nedůvěryhodné sítě, které nepatří k žádnému z již navázaných spojení
- Jsou náročnější než paketové filtry, protože musí udržovat informace o spojeních a kontrolovat souvislosti


Aplikační proxy

Aplikační proxy je ochrana na aplikační vrstvě. Je to tedy nějaký program, se kterým komunikují klienti a posílají požadavky na servery přes něj. Příkladem aplikační proxy je http proxy a ftp proxy. Tyto proxy zpravidla nepotřebují podporu jádra systému.

Výhody a nevýhody:
+ Umožňuje autentizaci uživatelů
+ Umožňuje velmi dobře i hlídat obsah přenášených paketů (např. i antivirová kontrola)
+ Má mnohem lepší možnosti logování, než předchozí možnosti (i s informacemi o obsahu)
+ Umožňuje cachování dat
- Není transparentní, její používání se musí nastavit v klientské aplikaci
- Je náročnější na výkon i na paměť
- Není univerzální jako paketové filtry. Pro každou aplikaci musí být zvláštní proxy


Analyzátory paketů

Analyzátory paketů fungují podobně jako aplikační proxy (pracují na aplikační vrstvě), ale jsou pasivní a transparentní. Umožňují pasivní analýzu paketů a případné reakce na podněty. Jedním z příkladů je balík Snort.

Výhody a nevýhody:
+ Narozdíl od aplikační proxy jsou transparentní
+ Jde o pasivní kontrolu přenášených dat s možností definovat reakce na potenciální útok (např. zablokování přijímání paketů z podezřelé IP adresy)
- Náročnost na systémové prostředky, není univerzální


Network Address Translation

Network Address Translation (NAT) slouží k změnám údajů v hlavičkách paketů. To umožňuje přesměrovávat pakety na jiné počítače, nebo "skrýt" víc počítačů pod jednu veřejně přístupnou IP adresu.
NAT můžeme rozdělit na 2 typy:

Výhody a nevýhody:
+ Možnost skrýt celou síť pod jednu nebo několik málo veřejných IP adres, jak z důvodu bezpečnosti (síť vystupuje jako neznámý celek), tak v případě, že nemáme k dispozici dostatek veřejných IP adres pro všechny počítače, které chceme připojit
- Obvykle se dají spojení navazovat pouze směrem ven, dovnitř pouze s explicitním povolením na jednotlivých portech
- Problémy při použití DHCP (při přesměrování portů v NAT musí mít počítač pevnou adresu)


Paketové filtry v linux kernelu

Linuxové jádro obsahuje paketové filtry od verze 1.1. Bylo zde použito ipfw ze systému BSD. Od verze 2.0 přibyl uživatelský nástroj ipfwadm pro konfiguraci tabulek v kernelu. Ve verzi 2.2 (2.1.102) přibyly navíc ipchains (přepsané ipfw), které umožňovaly navíc práci s jinými protokoly, než TCP,UDP a ICMP, a podobně. S jádrem 2.4 přišla opět změna v podobě iptables, které se používají až doteď v řadě 2.6. Je to úplně nový kód, který se navích chová jako stavový firewall (udržuje informace o navázaných spojeních apod.)


iptables/netfilter

iptables/netfilter je standardní součást aktuálních řad linuxového kernelu. Funguje tak, že pakety, které jádro zpracovává prochází různými řetězy (chains) pravidel a podle toho se rozhoduje o jejich osudu.
Řetězů mohou být 3 typy, podle jejich zařazení: filter, nat a mangle

Stručný popis cesty paketu je na následujícím obrázku:
			              _____
Incoming->PREROUTING                 /     \         POSTROUTING->Outgoing
                   -->[Routing ]--->|FORWARD|------->
                      [Decision]     \_____/        ^
                           |                        |
                           v                      ____
                          ___                    /    \
                         /   \                  |OUTPUT|
                        |INPUT|                  \____/
                         \___/                      ^
                           |                        |
                            ----> Local Process ----
Přijatý paket
Dále můžeme v iptables definovat uživatelské řetězy, do kterých můžeme pakety "přehazovat" (například si můžeme napsat řetěz, který akceptuje pouze spojení navázaná směrem ven a pakety k nim příslušící a dát ho do řetězů INPUT a FORWARD)
Všechny řetězy, které jsou definovány přímo v jádře mají tzv. "výchozí pravidlo" - to je pravidlo, které se na paket aplikuje v případě, že nevyhovuje žádné podmínce, která byla definována v tabulce řetězu. Tato pravidla jsou implicitně nastavena na ACCEPT.

Pozor na to, že iptables jsou pouze tabulky v paměti kernelu, při (re)bootu jsou všechny tabulky prázdné a jsou nastaveny implicitní hodnoty výchozích pravidel. Pro ukládání/načítání můžeme využít příkazy iptables-save/iptables-restore, které pracují se standardním vstupem a výstupem (viz manuálové stránky)

Tabulky v kernelu se v linuxu ovládají příkazem iptables. Pomocí různých parametrů mužeme přidávat další řetězy, přidávat do nich záznamy (podle cílových/zdrojových adres a portů a podobně)

Pro provoz iptables musí být v konfiguraci jádra povoleny minimálně tyto volby: Další (rožšiřující možnosti), jako NAT a connection tracking se povolují v Networking Options -> IP: Netfilter Configuration.


Příklady konfigurace iptables

Musíme mít na paměti 2 nejdůležitější věci:

Nějaké příklady, jak asi by mělo nastavení firewallu vypadat:
Náš modelový firewall má tyto síťová rozhraní
lo - local loopback
eth0 - vnější síť (internet), statická IP adresa 1.2.3.4
eth1 - vnitřní síť (intranet), pridelovani adres v bloku 192.168.1.0/24
ppp[n] - vnější síť (internet), alternativní připojení, dynamická IP adresa

1) Nastavíme implicitní zahazování paketů:
iptables -P INPUT DROP
iptables -P OUTPUT DROP
iptables -P FORWARD DROP
2) Povolíme základní ICMP pakety (icmp echo, traceroute)
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
3) Povolíme příjem paketů bez omezení z vnitřních sítí
iptables -A INPUT -p ALL -i lo -j ACCEPT
iptables -A INPUT -p ALL -i eth1 -j ACCEPT
4) Definujeme překlad adres, který umožní přístup vnitřních počítačů do vnější sítě
Nejdřív pro rozhraní eth0 (se statickou adresou) a potom pro případná rozhraní ppp[n] s dynamickými adresami
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 1.2.3.4
iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o ppp+ -j MASQUERADE
Pokud máme statickou adresu, měli bychom používat možnost se SNAT

5) Můžeme povolit přesměrování některého z portů na vnějším rozhraní na počítač uvnitř sítě (např. www server)
iptables -t nat -A PREROUTING -p tcp -d 1.2.3.4 --dport 80 -i eth0 -j DNAT --to 192.168.1.2:80
Případně přesměrovávat pakety z vnitřní sítě do internetu na nějakou lokální transparentní proxy
iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 8080
6) Definujeme si vlastní řetěz pro explicitní povolení příjmu paketů z nedůvěryhodné sítě, pokud náleží existujícímu spojení
iptables -N my_est
iptables -A my_est -m state --state ESTABLISHED,RELATED -j ACCEPT
iptables -A my_est -j DROP
Odkaz na tento řetěz vložíme do řetězů INPUT a FORWARD (měl by být na konci)
iptables -A INPUT -j my_est
iptables -A FORWARD -j my_est
Pravidel by v tabulkách nemělo být příliš moc, aby se jádro při přijetí každého paketu zbytečně nezatěžovalo zpracováním filtrů.


Paketové filtry na BSD

Pod systémy BSD jsou tyto druhy firewallů:

Na OpenBSD se používá PacketFilter, na FreeBSD ipfw, případně novější ipfw2, možnostmi srovnatelný s iptables/netfilter z linuxu.
O ipfw si můžete něco přečíst zde, nebo např. zde. O pf si můžete něco přečíst např. zde.


Další informace

Na linuxovém firwallu s NAT můžeme využít také Connection Tracking. Ten umožňuje hlídat navázaná spojení a na jejich základě měnit obsah paketů a nat tabulek tak, aby fungovaly i protokoly, které otevírají porty dynamicky a mohou navazovat spojení směrem ke klientovi (například FTP v aktivním režimu). K tomu slouží moduly ip_nat_* a ip_conntrack_*. Po jejich zavedení kernel hlídá provoz na určitých portech a kontroluje obsah paketů. Pokud např. ve FTP protokolu posle jedna ze stran udaje o IP adrese a portu na kterou se bude navazovat spojení, tak kernel paket změní, odešle dál a pro takové spojení pak povolí přesměrování paketu do vnitřní sítě.


UPnP

UPnP je jedna z dalších možností, jak si aplikace může zařídit možnost příchozích spojení přes implicitně zavřený firewall. Beží na výchozí bráně pro klienty a klienti jí mohou posílat požadavky o přesměrování některého z portů na jejich IP adresy.
Tento protokol podporuje například program MSN Messenger, ve kterém díky UPnP může fungovat například přenos hlasu zpoza firewallu.
Velikou nevýhodou však je, že tento způsob je značným bezpečnostním rizikem pro síť, kde se používá. Proto je lepší pro takové věci hledat jiné rozumnější řešení.


Reference

Linux 2.4 Packet Filtering HOWTO
UPnP
manuálové stránky
http://www.netfilter.org/