Firewall

Petr Šigut, phax ZAVINÁČ mail.muni.cz

Obsah

K čemu nám je firewall?

1. Firewall má povolit oprávněný přístup ke službám, zdrojům a naopak zamezit neoprávněné komunikaci.
- když by si to dělala každá služba sama byla by to duplikace
- na jednom místě podchytíme veškerou komunikaci, můžeme třeba logovat

2. Není to nějaká mystická ochrana

3. Firewall je zlo

Rozdělení, historický vývoj

- všechno tak nějak v AT&T Bell Laboratories.

Paketové filtry (1988)

Stavové paketové filtry

Firewally na aplikační vrstvě/proxy-based firewall

(NAT, překlad adres - historický relikt, před ipv6)

- Softwarová versus hardwarové firewally.
- krabička s Linuxem versus věc kde se o to stará opravdu hardware.

Iptables/Netfilter

zmatené co je co - občas se pod pojmem iptables rozumí celý firewall apod. Zjednodušeně Netfilter je kernelová část a iptables user-space program pro manipulaci s tabulkami firewallu.

Netfilter je sada háčků v kernelu v síťovém stacku. - je to tam naháčkované když je paket v téhle fázi tak ho projeď touhle tabulkou. Jelikož je to součást jádra musíte ho mít v jádře zaplý, v distribučním jádře už je.

Networking support  --->
  Networking options  --->
     Network packet filtering framework (Netfilter)  --->

iptables je pak pro manipulaci s tabulkami - přidáváme pomocí něho do nich pravidla.

Iptables - vývoj

ipfwadm (Linux 2.0)

ipchains (Linux 2.2)

iptables (Linux 2.4, 2.6) - stavový, forwardované pakety procházejí jen přes FORWARD

nftables
http://lwn.net/Articles/324251/
# nft add rule output tcp dport 22 log accept

Cesta paketu

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

 
převzato a přeloženo:)

Tabulka > Řetězce > Pravidla

Nejdůležitější tabulka je filter, obsahuje řetězce INPUT, OUTPUT, FORWARD. PREROUTING a POSTROUTING jsou z tabulky nat, když bychom je vyputili tak pořád každý paket spadne do některého řetězce z filter.

Tabulka filter:

Tabulka nat:

Výše popsány jsou výchozí řetězce v tabulkách, můžeme přidávat své vlastní (mazat výchozí nelze).

Tabulky jsou v manuálu iptables popsány čtyři - výše zmíněný filter, pak nat který slouží k manipulaci s překladem adres, mangle pro značkování paketů (MARK - což se využije například dále pro shapování provozu) či manipulaci s TOS a TTL.

----------------------------------------------------------
filter                                                    |
                                                          |
---------------------------------------  -----------------|
INPUT (P: DROP)                       |  |OUTPUT(P:ACCEPT)| 
-A INPUT -p tcp --dport 80 -j DROP    |  |                |
-A INPUT -p icmp -j ACCEPT            |  |                |
                                      |  |                |
--------------------------------------|  |----------------|
                                                          |
                                                          |
                                                          |
-----------------------------------------------------------

Například máme tabulku filter, v ní řetězec (chain) INPUT - tady spadnou příchozí pakety určené pro náš stroj. Dále se v tomto řetězci zkouší paket "napasovat" na jednotlivé pravidla. Pravidlo popisuje nějaký druh paketů a co se s ním má udělat (TARGET). Jakmile paket narazí na TARGET ukončující (např. ACCEPT, DROP...) tak průchod končí a další pravidla se neaplikují (na pořadí tedy záleží). Může narazit na TARGET neukončující (třeba LOG). Projde-li paket až na konec, bez toho aby byl zachycen nějakým ukončujícím pravidlem aplikuje se na něj výchozí politika (policy) řetězce (ACCEPT, DROP...)

Příklady pravidel

binárka iptables většinou v /sbin/iptables. Musíme spouštět jako root. Mámě několik možností jak "spouštět" firewall. Vy výchozím nastavení se přijímá vše. Jedna možnost je vytvořit init script přímo s pravidly (pohodlné, nečisté v tom že init script obsahuje nějaká data a není to pěkně někde v konfiguračním souboru -- ale jednoduší na skriptování). Druhá možnost je použít příkazy iptables-save/restore.

Ukázkové pravidlo

iptables -A INPUT -i eth0 -s 192.168.3.1 -p tcp --dport 22 -j ACCEPT

-A INPUT - přidat pravidlo do řetězce INPUT
-i eth0 - vyhovuje paket který přijde rozhraním eth0
-s 192.168.3.1 - paket má zdrojovou IP adresu 192.168.3.1
-p tcp - odpovídá protokol tcp
--dport 22 - destination port - port na našem stroji 22
-j ACCEPT - propusť takový paket

Vypsání pravidel

iptables -L -n
-L vypíše tabulku
-n nebude vyhledávat jména pro IP adresy

Chain INPUT (policy DROP)
target     prot opt source               destination         
ACCEPT     all  --  anywhere             anywhere            
ACCEPT     icmp --  anywhere             anywhere            
ACCEPT     all  --  anywhere             anywhere            state
RELATED,ESTABLISHED 

Chain FORWARD (policy DROP)
target     prot opt source               destination         

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination         

Příkazy pro manipulaci s pravidly:

iptables -A //přidá  pravidlo
iptables -D //vymaže pravidlo
iptables -I //vloží - 1 - výchozí - na začátek
iptables -F //vymaže pravidla

Povětšinou nepřidáváme pravidla divoce z příkazové řádky, ale máme nějaký skript. Nějaký minimální základ vypadá většinou takto:

# vymaže všechny pravidla
$IPTABLES -F
$IPTABLES -F -t nat

# vymaže všechny nezabudované řetězce (musí být prázdné)
$IPTABLES -X

# výchozí politika by měla být co není povoleno je zakázáno.
$IPTABLES -P INPUT DROP
$IPTABLES -P OUTPUT ACCEPT
$IPTABLES -P FORWARD DROP

# iptables man (except loopback traffic, which involves both INPUT and OUTPUT chains)
$IPTABLES -A INPUT -i lo -j ACCEPT
# jak je to s přijímáním ICMP paketů, někdo vybírá některé
$IPTABLES -A INPUT -p icmp -j ACCEPT
# využití stavového firewallu
$IPTABLES -A INPUT -i $ETH_LAN -m state --state ESTABLISHED,RELATED -j ACCEPT

Potřebné moduly (třeba ipt_REJECT) by se měly načíst automaticky.

Vytváření vlastních řetězců

Můžeme vytvářet vlastních řetězce - přehlednost, rychlost. Uživatelem vytvořené řetězce nemají Policy, jakmile dojde paket na konec našeho chainu, zase se vynoří v hlavním řetězci.

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

DROP vs REJECT

$IPTABLES -A INPUT -i $ETH_LAN -p tcp --dport 22 -s aisa -j DROP
ssh: connect to host eden.mine.cz port 22: Connection timed out (pomalé)
$IPTABLES -A INPUT -i $ETH_LAN -p tcp --dport 22 -s aisa -j REJECT --reject-with tcp-reset
ssh: connect to host eden.mine.cz port 22: Connection refused (rychlé)

REJECT - náročnější pro stroj, musí poslat odpověď, ale uživatel nemusí čekat.

Limitování požadavků, proti DOS

iptables -A INPUT -p icmp --icmp-type echo-request -m limit --limit 1/s --limit-burst 5 -j ACCEPT

Povolit zaměstnancům web jen v přestávce na oběd

...-m time --timestart 12:30 --timestop 13:30...

DNS versus IP adresy

- aisa - neuvádět doménové názvy které se resolvují vzdáleně přes DNS je hodně špatný nápad. Nebo byl před nástupem dnssec.

NAT

$IPTABLES -t nat -A PREROUTING -p tcp --dport 5900 -j DNAT --to 192.168.1.2:5900

Povolení forwardu, ip spoofing

Ve výchozím stavu linuxový stroj neforwarduje pakety, je třeba povolit v zapsat hodnotu 1 do /proc/sys/net/ipv4/ip_forward. Systémové řešení je v debianu povolit net.ipv4.ip_forward=1 v /etc/sysctl.conf nebo v sysctl.d. Ve stejném souboru najdeme i net.ipv4.conf.all.rp_filter=1, což hlídá aby se rozhraní neobjevily zdrojové adresy které tam nemají co dělat (z internetu by nám asi neměl přijít paket se zdrojovou adresou 192.168.1.1).

Firewally v BSDčkách

http://en.wikipedia.org/wiki/Ipfirewall (FreeBSD)
http://www.openbsd.org/faq/pf/ (OpenBSD)
- bsd licence

Nadstavby

Nechce-li se vám psát pravidla pro iptables "ručně", lze využít některé buildery.
http://firehol.sourceforge.net/

Literatura