Firewally, bezpečnost

Miroslav Franc, xfranc2(at)fi.muni.cz


Obsah


Co je firewall?

Původní význam slova firewall je „protipožární stěna“. Pro nás je to počítač (software) který odděluje 2 sítě (typicky Internet a Intranet), provádí logování, filtrování či upravování dat, jež mezi sítěmi protékají, zajišťuje autentizaci uživatelů nebo strojů. Firewall může chránit třeba i jen jeden počítač. Jde o tzv. „host-based firewall“. Firewall nás na jednu stranu chrání před útoky zvenku a snižuje riziko zneužití chyb v softwaru síťových služeb, ale na druhou stranu obtěžuje a může vézt k podcenění útoku zevnitř.

Zpět na obsah

Typy firewallů

Paketový filtr

Rozhoduje se pouze podle IP hlaviček. Nezkoumá nic nad 3 vrstvu OSI modelu. Tzn. nerozumí souvislostem mezi pakety. Neumí určit, které pakety patří do jednoho spojení.

Aplikační brána

Funguje na aplikační vrstvě. Zájímá ho význam paketu v kontextu spojení. Autentizuje každé připojení zvlášť.

Stavový firewall

Kombinace obou přístupů. Obvykle budován jako nádstavba paketového filtru.

Analyzátor paketů

Analyzuje procházející pakety a podává varovná nebo chybová hlášení.

Zpět na obsah

Network Address Translation (NAT)

Jak vyplývá z názvu, jde o překlad adres. Rozděluje se na DNAT a SNAT. Destination NAT je přepísování cílových adres a cílových portů v paketech a Source NAT je analogie pro zdrojové adresy a zdrojové porty. Nejčastěji se využívá tzv. „maškaráda“ (druh SNATu), kdy se v paketech odcházejících z vnitřní sítě přepisuje zdrojová IP adresa na adresu routeru. Tak se skryje vnitřní struktura podsítě je možné celé podsíti přiřadit jednu veřejnou adresu. Router si samozřejmě pamatuje všechna spojení a tak odpověď zvenku doručí zase zpátky na stroj, ze kterého přišel dotaz. Hlavní nevýhodou je, že spojení tak jdou iniciovat pouze zevnitř.

Zpět na obsah

Linux - Netfilter

Historie

První firewall ipfw portoval do jádra 1.1 z BSD v roce 1994 Alan Cox. V jádře 2.0 přibyl nástroj ipfwadmin pro nastavování pravidel. Od jádra 2.2 přibyl nástroj ipchains, který rozšiřoval možnosti ipfw (zavedl řetězy pravidel). Pro jádro 2.4 byl firewall kompletně přepsán. Jaderná část se jmenuje netfilter. Pro nastavení jeho pravidel se používá uživatelský program iptables.

Zpět na obsah

Cesta paketů

             ________                        _____         _________
            /        \                      /     \       /         \
příchozí-->|PREROUTING|-->[směrovací ]---->|FORWARD|---->|POSTROUTING|--> odchozí
pakety      \________/    [rozhodnutí]      \_____/       \_________/     pakety
                             |                                 ^
                             v                    ____         |
                            _|_                  /    \        |
                           /   \                |OUTPUT|-->[směrovací ]
                          |INPUT|                \____/    [rozhodnutí]
                           \___/                   ^
                             |                     |
                             `--> lokální proces --'
Zpět na obsah

Iptables

Existují tři nezávislé tabulky, které může iptables upravovat. FILTER je tabulka obsahující filtrovací pravidla, NAT je tabulka obsahující pravidla překladu adres a MANGLE je tabulkou pro pravidla úpravy hlavičky paketů, manipulace s TOS, TTL, značkování, etc. V případě, že tabulku neuvedete, použíje se implicitní FILTER.

iptables -t <tabulka> ...

Chain je řetězec pravidel. Paket prochází řetězcem a když nezabere žádné pravidlo, použije se implicitní akce řetězce. Řetězce se dají řetězit. :-) Předdefinované řetězce jsou INPUT - pakety určené pro lokální systém, OUTPUT - pakety z lokálního systému odchozí, FORWARD - pakety přeposílané, POSTROUTING a PREROUTING. Viz. diagram Cesta paketů. Ne všechny jsou však dostupné ve všech tabulkách. Například v tabulce FILTER nejsou dostupné řetězce PREROUTING a POSTROUTING a v tabulce NAT nejsou dostupné řetězce INPUT a FORWARD.

iptables (-L [<řetězec>] | --list [<řetězec>])           # vypíše pravidla v určeném řetězci
iptables (-F [<řetězec>] | --flush [<řetězec>])          # odstraní pravidla z určeného řetězce
iptables (-Z [<řetězec>] | --zero [<řetězec>])           # vynuluje čítače v řetězci
iptables (-X [<řetězec>] | --delete-řetězec [<řetězec>]) # smaže uživatelský řetězec
                                                         # nesmí v něm být skoky do jiných řetězců
# pokud řetězec neuvedeme, akce se uplatní na všechny řetězce
iptables (-N <chain> | --new-chain <chain>)              # vytvoří nový uživatelský řetěz

Pravidlo stanovuje vlastnosti které musí paket splňovat. Když je splňuje, použíje se akce specifikovaná na konci pravidla.

iptables (-A | --append) <řetězec> <pravidlo> # připojit pravidlo na konec řetězce
iptables (-D | --delete) <řetězec> (<pravidlo> | <čislo>) # smazat pravidlo z řetězce, jde i číslem od 1
iptables (-I | --insert) <řetězec> [<čislo>] <pravidlo> # vložit pravidlo na začátek řetězce nebo na určenou pozici
iptables (-R | --replace) <řetězec> [<čislo>] <pravidlo> # přepíše pravidlo v řetězci
iptables (-P | --policy) <řetězec> <pravidlo> # nastaví implicitní akci

Akce určuje osud paketu. Může být buď název řetězu nebo jedna z následujících hodnot: ACCEPT - paket je přijat, DROP - paket je zahozen, RETURN - když jsme ve vestavěném řetězci, tak skok na jeho konec nebo návrat do předchozího řetězce, QUEUE - paket je předán ke zpracování do uživatelskému programu. V připadě rozšiřujících modulů jsou dostupné i akce: DNAT - přepsání cílové adresy nebo portu, SNAT - přepsání zdrojové adresy nebo portu, MASQUERADE - přepsaní zdrojové adresy, adresou tohoto počítače, REJECT - viz. DROP navíc je odesilateli zaslána ICMP zpráva, LOG - některé pakety jsou logovány a mnohé další. Viz. manuálová stránka programu iptables sekce „TARGET EXTENSIONS“.

iptables ... (-j | --jump) <akce>

Netfilter je stavový firewall a s modulem state dokáže pakety rozdělit do celkem 4 kategorií. NEW - paket otevírající spojení, ESTABLISHED - paket náležející do již existujícího spojení, RELATED - paket nějakým způsobem související s již existujícím spojením. Pakety které se nepovede identifikovat náleží do skupiny INVALID.

Další volby: (vykřičník znamená negaci)

-p [!]<protokol>
-s [!]<zdroj/maska>
-d [!]<cíl/maska>
--sport [!]<port>   # číslo nebo /etc/services
--dport [!]<port>
-i [!]<rozhraní>
-o [!]<rozhraní>
-v                        # ukecanost
Zpět na obsah

Přiklady

Mít zapnutou ochranu před IP spoofingem (falšování zdrojové IP adresy). Blokuje takové adresy, které by měly podle routovací tabulky přijít z jiného rozhraní.

echo "1" > /proc/sys/net/ipv4/conf/eth0/rp_filter

Nastavit implicitní politiku. Je dobré všechno zakázat a explicitně povolovat vyjímky. Implicitní politiky jdou vytvářet jen pro vestavěné řetězce. Z těch uživatelský se v případě, že nesedí žádné pravidlo vracíme zpět.

iptables -P INPUT DROP    # všechny příchozí pakety budeme zahazovat
iptables -P OUTPUT ACCEPT # všechny odchozí pakety budeme pouštět
iptables -P FORWARD DROP  # všechny přeposílané pakety budeme zahazovat

Všechny příchozí pakety, které jsou součástí nebo nějak souvisí s již existujícím spojením povolit.

iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT

Nezapomenout povolit zpětovazebné rozhraní.

iptables -A INPUT -i lo -j ACCEPT

Abychom nemuseli opisovat stejná pravidla do dvou řetězců, vytvoříme si nový, do něho nadefinujeme pravidla a pak se do něj odkážeme.

iptables -N retez
iptables -A retez -m mac --mac-source 00:4F:4E:60:AC:84 -j ACCEPT
iptables -A retez -s 10.0.50.2 -j ACCEPT

iptables -A INPUT -j retez
iptables -A FORWARD -j retez

Existuje spousta modulů, jež jsou v manuálové stránce programu iptables popsány pod „MATCH EXTENSIONS“. Modul použijeme tak, že ho přidáme za přepínač -m.

iptables -A INPUT -i eth1 -m ttl --ttl-lt 3 -j ACCEPT
iptables -A INPUT -p tcp -m multiport --detination-ports 80,110
iptables -A OUTPUT -m owner --uid-owner 1002 -j DROP

Source NAT (POSTROUTING) - známe adresu.

iptables -t nat -A POSTROUTING -o eth0 -j SNAT --to-source 10.0.0.50

Source NAT - neznáme adresu.

iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE

Nezapomenout povolit v tabulce filter!!

iptables -A FORWARD -i eth1 -o eth0 -m state --state ESTABLISHED,RELATED -j ACCEPT
# výpis maskovaných spojení
# netstat -aM nebo cat /proc/net/ip_conntrack

Destination NAT (PREROUTING) Přesměrování portů.

iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth0 -j DNAT --to-destination 10.0.50.2:80
iptables -t nat -A PREROUTING -p tcp --dport 80 -i eth1 -j REDIRECT --to-ports 3128
Zpět na obsah

*BSD

Historie

Existují tři rozdílné firewally.
IPFILTER (IPF)
IPFIREWALL (IPFW)
PacketFilter (PF)

Zpět na obsah

PF

Firewall z OpenBSD. Od FreeBSD 5.3-RELEASE je soucasti zakladniho systemu. V predchozich verzích rady 5.x byl v portech.

V /etc/rc.conf zajisti po startu systemu spusteni prislusnych sluzeb.

pf_enable="YES"                 # spusti firewall
pf_rules="/etc/pf.conf"         # soubor s pravidly
pf_flags=""                     # volby pro pfctl
pflog_enable="YES"              # spusti pflogd (povoli logovani)
pflog_logfile="/var/log/pflog"  # soubor, do ktereho se bude logovat
pflog_flags=""                  # volby pro pfctl

gateway_enable="YES"            # asi chceme preposilat

Par užitečných příkazů:

pfctl -f <soubor_s_pravidly>    # rucni nahrani pravidel
pfctl -d                        # deaktivuje firewall
pfctl -e                        # aktivuje firewall

Syntaxe:

<akce> [<smer>] [log] [quick] [on <rozhrani>] [proto <protokol>] \
[from <adresa> [port <port>]] [to <adresa> [port <port>]] [flags <tcp_priznaky>] [<stav>]

akce - pass (povolení paketu), block (zahození paketu)
smer - in, out
log  - příznak, zda se má logovat
quick - když pravidlo pasuje, nepojede se dal
protokol - tcp, udp, icmp, icmp6 nebo něco jiného z /etc/protocols
adresa - samotná nebo CIDR, může být FQDN (resolvuje se v době nahrání pravidla) nebo název rozhraní
port - čislo, názvy z /etc/services
       jde určit rozsah relačními operátory !=, <, >, <=, >=,
       <> - rozsah od do
       >< - negace předchozího
       :        - rozsah od do včetně
tcp_priznaky  - SYN, ACK...
stav          - má se pamatovat stav?

Paket prochází všemi pravidly a o osudu rozhoduje až poslední vyhovující. Pokud to chceme změnit, musíme uvést klíčové slovo quick.

Můžeme vytvářet jednoduché proměnné a seznamy.

vnejsi = "xl0"
vnitrni = "xl1"
erigona = "10.0.0.1"
doto-alpha = "{ 10.0.50.1 10.0.0.50 }
cmd = "pass in on xl0"

Pamatování stavu. První paket utvoří spojení, od té doby do něj náleží všechny pakety v obou směrech.

pass out on xl0 proto tcp from 10.0.50.0/24 to any keep state
pass in on xl0 proto tcp from $erigona to xl0 port { ssh telnet } keep state

Povolíme zpětovazebné rozhraní.

pass quick on lo all

Ochrana před IP Spoofingem. Obdoba rp_filteru v Linuxu.

antispoof quick for $vnejsi inet

Zakážeme jinak všechen provoz:

block all

Přesměrování portů:

rdr on xl0 proto tcp from any to any port 80 -> 10.0.50.2
rdr on xl0 proto tcp from 10.0.0.1 to 10.0.0.50 port 80 -> 10.0.50.2 port 8000

NAT ...

Zpět na obsah

Reference