Kombinac9 filtrace protokolu IP a protokolů TCP/UDP je možné stanovit, aby konkrétní počítače mohly mezi sebou komunikovat pouze konkrétními aplikacemi. Navíc je možné filtrací zajistit, aby klienti určité aplikace z vnitřní sítě mohli využívat serverů v Internetu a přitom naopak, aby cizím klientům byl znemožněn přístup do vnitřní sítě. Např. aby se klienti z vnitřní sítě dostali na WWW-servery v Internetu, ale aby cizí klienti se nedostali na WWW-servery vnitřní sítě.
Začněme však od začátku. TCP (resp. UDP) paket se vkládá (balí) do IP-datagramů. IP-datagram nesoucí TCP (resp. UDP) paket může být během své cesty Internetem fragmentován na několik IP-datagramů:
Všimněte si, že např. z jednoho TCP paketu mohou vzniknout tři IP-datagramy.
IP-datagramy se dopravují samostatně. Tj. routerem prochází TCP paket v několika IP-datagramech, přitom TCP záhlaví je jen v jednom z nich! Jak může provádět router filtraci TCP paketů? Router to dělá jednoduše. V případě, že chce filtrovat protokol TCP, pak filtruje pouze ty IP-datagramy, které obsahují TCP-záhlaví. Ostatní propouští. Příjemce se pak snaží sestavit z jednotlivých došlých částí TCP-paketů celý paket. Ale to se mu nepodaří, protože mu vždy schází začátek. Po dosažení časového limitu to příjemce vzdá. Jediný problém je v tom, že příjemce, který nesestavil TCP paket, tak protokolem ICMP (packet reassembly time expired) o tom informuje odesilatele TCP paketu. Tato informace vysvětluje útočníkovi proč se nedostal dále. Doporučuje se tedy takovéto odpovědi také odfiltrovávat, aby útočník nedostával další informace. Takže filtrace na úrovni protokolu TCP se často spojuje s filtrací protokolu ICMP, o které bude řeč později.
Z hlediska filtrace je v TCP (resp. UDP) záhlaví využitelný port odesilatele a port příjemce. V TCP záhlaví je navíc využitelný ještě příznak ACK.
Servery používají všeobecně známá čísla portů (některé používané porty pro protokol TCP i UDP jsou uvedeny v příloze). Klient ještě před tím než začne komunikovat, tak si od správy portů (služba operačního systému) nechá dynamicky přidělit číslo portu. S uzavřením spojení se toto číslo vrací operačnímu systému k dalšímu použití - pro další klienty. Klienti používají dynamicky přidělovaná čísla portů platná pouze na dobu spojení.
V UNIXu (na kterém zpravidla běží servery) se čísla portů rozdělují
hranicí 1023 na porty privilegované a neprivilegované. Privilegované (0-1023)
mohou používat pouze procesy, které spustil superuživatel. Servery spouští
většinou právě superuživatel. Takže porty 0-1023 se někdy označují jako
serverovské porty, porty s vyššími čísly jako klientské. Nemusí to však
být pravidlem, některé servery je běžné spouštět na portech o vyšších číslech
(např. X-servery, Archie, databázové servery atd.). Naopak např. v MS-DOSu
je snadné, aby klient použil jako klientský port např. port 23, který je
běžně používán serverem protokolu telnet (programem telnetd). Ve filtrech
budeme však nadále předpokládat, že klient používá porty >1023.
Nejprve musí být spuštěn server na portu 23 (např. program telentd). Budeme předpokládat, že server má IP-adresu 128.1.1.1. Pak klient (např. program telnet) může žádat spuštěný server o služby. Předpokládáme, že IP-adresa klienta je 128.1.2.1. Před tím než může začít klient s komunikací, tak si musí nechat od svého operačního systému přidělit nějaký volný port >1023. Předpokládejme, že systém klientovi přidělil port 1500.
Nyní již klient může protokolem TCP navazovat spojení se serverem.
Spojení je určeno pěticí:
Protokol | IP odesilatele | Port odesilatele | IP příjemce | Port Příjemce |
TCP | 128.1.2.1 | 1500 | 128.1.1.1 | 23 |
Protokol TCP vytváří spojení mezi dvěmi aplikacemi. V tomto spojení
se obě strany vzájemně potvrzují došlé pakety. K potvrzování došlých paketů
se v TCP záhlaví používá příznak ACK. Tento příznak se nastavuje ve všech
paketech TCP, kterými se potvrzují předchozí došlé pakety. Příznak ACK
tedy není nastaven v prvním paketu, kterým klient navazuje spojení. Ve
všech dalších paketech klient má již nastaven příznak ACK. Všechny pakety,
které odesílá server mají rovněž nastaven příznak ACK. Pro úplnost je
však nutné dodat, že s příznakem ACK ještě souvisí příznak RST (viz kapitola
o protokolu TCP). Routery tuto skutečnost zohledňují a z hlediska našeho
výkladu to není až tak podstatná skutečnost, proto se o příznaku RST dále
již nebudeme zmiňovat.
Jinými slovy: první paket odeslaný klientem nemá nastaven příznak ACK, kdežto všechny pakety, které odesílá server mají nastaven příznak ACK. Zakáže-li se tedy některým směrem propouštět TCP-pakety s nenastaveným příznakem ACK, pak tímto směrem znemožníme klientům navazovat spojení se servery.
Budeme předpokládat, že klient je na vnitřní síti a server v Internetu.
Filtr, který bude umožňovat klientovi 128.1.2.1 přístup protokolem telnet
do Internetu a vše ostatní bude zakazovat - včetně přístupu klientů protokolu
telnet z Internetu do vnitřní sítě bude mít tvar:
Pravidlo | Směr | Adresa odesilatele | Port odesilatele | Adresa Příjemce | Port příjemce | Povolit/Zakázat |
C1 | ven | 128.1.2.1 | >1023 | 0.0.0.0/0 (vše) | 23 | Povolit |
C2 | dovnitř | 0.0.0.0/0 (vše) | 23 | 128.1.2.1 | >1023 | Povolit |
default1 | dovnitř | 0.0.0.0/0 (vše) | 0.0.0.0/0 (vše) | Zakázat | ||
default2 | ven | 0.0.0.0/0 (vše) | 0.0.0.0/0 (vše) | Zakázat |
Všimněte si, že některá pravidla (některé řádky) mají specifikovaný port a jiné jsou pro všechny porty, takže se port prostě neuvádí.
Otázkou zůstává, zda-li je takováto filtrace dostatečná. Není. Jako protipříklad si stačí zvolit na vnitřní sítí libovolný server, který používá port >1023. Např. Archie (1525), X-server (600x), databázové servery atd.
Proberme si pro ilustraci následující situaci. Ve vnitřní síti se provozuje databázový server např. Informix. Tento server má přiřazenu IP-adresu 128.1.2.10 a port 1700.
Informix spravuje uživatel informix, který je správcem databáze. Jelikož uživatel informix není superuživatel, tak nemůže spustit svůj server na privilegovaném portu, tj. na portu v intervalu 0 až 1023, proto používá v našem podniku port 1700.
To je ale přece příležitost pro útočníka. Vždyť přece jsme povolili našim klientům pro telnet přístup do Internetu. Porovnejte předchozí tabulku a zjistíte, že útočník o libovolné IP-adrese, když použije jako klientský port port=23, pak tímto filtrem také projde.
Útočník se skrze náš filtr dostane. Máme však ještě jedno eso
v rukávu, které takovémuto útoku může zabránit - příznak ACK. Když klient
vnitřní sítě dostává odpovědi od serveru v Internetu, tak v každém TCP
paketu je nastaven příznak ACK. Naopak, když útočník (klient) z Internetu
chce atakovat (inicializovat spojení) se serverem ve vnitřní síti, tak
nesmí mít v prvním paketu nastaven příznak ACK. Propustí-li filtr z Internetu
dovnitř pouze TCP pakety s nastaveným ACK, tak jimi nelze navázat spojení
a útočník má smůlu. Takže náš filtr doplníme o další podmínku:
Pravidlo | Směr | Adresa odesilatele | Port odesilatele | Adresa Příjemce | Port příjemce | ACK | Povolit/Zakázat |
C1 | ven | 128.1.2.1 | >1023 | 0.0.0.0/0 (vše) | 23 | Povolit | |
C2 | dovnitř | 0.0.0.0/0 (vše) | 23 | 128.1.2.1 | >1023 | vždy | Povolit |
default1 | dovnitř | 0.0.0.0/0 (vše) | 0.0.0.0/0 (vše) | Zakázat | |||
default2 | ven | 0.0.0.0/0 (vše) | 0.0.0.0/0 (vše) | Zakázat |
Některých aplikačních protokolů je však lepší se vzdát úplně nebo je omezit při připojení podnikové sítě do Internetu:
Ostatní aplikační protokoly využívající UDP se většinou používají jen v rámci vnitřní sítě, proto není nutné je propouštět přes přístupový router. Např. protokol TFTP je považován obecně za nebezpečný, proto by nemělo být umožňováno používání tohoto protokolu směrem do Internetu.
V případě, že se přes přístupový router nějaké UDP-datagramy propouští, pak se často používá tzv. dynamická filtrace.
Dynamickou filtraci si objasníme na následujícím obrázku. Klient posílá UDP-datagramem na DNS server dotaz, ve kterém je žádost o překlad jména na IP-adresu. Filtr UDP-datagram směrem ven propustí, ale poznamená si IP-adresu a port odesilatel a IP-adresu a port příjemce. Po určitý časový interval nastaví filtr v opačném směru pro odpověď. V odpovědi je zaměněna IP-adresa a port odesilatele a příjemce. Odeslal-li by protějšek UDP-datagram ještě jinému počítači ve vnitřní sítí, pak je tento datagram zahozen.
Protokol ICMP používá různé typy zpráv. Pomocí těchto zpráv informuje
o nedostupnosti sítí, testuje dostupnost uzlu v Internetu atd. V následující
tabulce jsou uvedeny jednotlivé typy ICMP zpráv. Většinu z nich jednoduše
přístupovým routerem nepropustíme. Diskutovat má smysl pouze o typech zpráv,
které jsou v následující tabulce zvýrazněny. Ostatní bychom propustili
jen v nějakém mimořádném případě.
|
Timestamp | |||||||||||||||||||||||
14 | Timestamp Reply | |||||||||||||||||||||||
15 | Information Request | |||||||||||||||||||||||
16 | Information Reply |
Typ | Název |
17 | Address Mask Request |
18 | Address Mask Reply |
30 | Traceroute |
31 | Datagram Conversion Error |
32 | Mobile Host Redirect |
33 | IPv6 Where-Are-You |
34 | IPv6 I-Am-Here |
35 | Mobile Registration Request |
36 | Mobile Registration Reply |
37 | Domain Name Request |
38 | Domain Name Reply |
39 | SKIP |
40 | Photuris |
... | ... |
Zvláštností protokolu ICMP je, že kromě toho, že ICMP-datagramy mohou routerem (filtrem) procházet, tak je také router může generovat. Rozlišujeme následující případy:
Chce-li komunikovat počítač vnitřní sítě s nějakým hostem v Internetu
a útoční klienta ve vnitřní síti bombatduje těmito ICMP-datagramy (Destination
unreacheble), pak je těžké vůbec navázat spojení s příslušným hostem. Obranou
je zjištění IP-adresy útočníka a následné filtrování všech IP-datagramů
z této IP-adresy.
Zprávy redirect jsou obdobně nebezpečné - lze jimi odklonit odchozí IP-datagramy z jejich běžné cesty. Proto se zprávy redirect akceptují pouze ze sousedního routeru. V případě, že přes tento interfejs je dostupný pouze jeden router, pak se neakceptují vůbec.
Dále musí být odfiltrovány zprávy způsobené filtrací. V tomto případě
se jedná o zprávu time exceeded (fragment reassembly time exceeded).
Zprávu destination unreacheble není možné propouštět proto, že pro
některé porty (aplikace) může být síť dostupná a pro jiné nikoliv. Komunikuje-li
počítač pro některou aplikaci filtrem povolenou službu se svým protějškem,
pak pokus o navázání spojení pro službu, která je filtrem nepovolena by
způsobil odeslání zprávy destintion unreacheble a některé implementace
TCP/IP by mohly uzavřít na základě této informace i běžící povolené spojení.
Protokoly ARP a RARP používají pro komunikaci oběžníky, které jak známo routery nezpracovávají - odfiltrovávají je vždy. Nedostanou se tedy ani k filtru, proto se jimi dále nebudeme zabývat.
Protokol IGMP slouží pro přihlášení se a odhlášení se k multicastovým skupinám. Jeho používání má smysl v případě, že váš přístupový router je mrouterem (multicast router). Filtrace zpráv protokolu IGMP je obdobná filtraci zpráv ICMP a software běžných routerů (např. CISCO) jí podporuje.
Odesílejte tyto informace zásadně na počítač ve vnitřní (chráněné) síti. Vyžaduje určitou praxi odhadnou co vše by se mělo takto zaznamenávat. Zvolíte-li zaznamenávání příliš velkého množství informací, pak se tím router silně zdržuje místo aby routoval. Důležité je zaznamenat si podezřelé datagramy - např. datagramy adresované do vnitřní sítě s adresou odesilatele rovněž z vnitřní sítě atp.
Obecně propouštění protokolu SYSLOG skrze přístupový router pro jiné účely se snažíme zásadně. nepovolovat.
Vrátíme se k našemu filtru umožňujícímu pro počítač 128.1.2.1
přístup do Internetu pro protokol telnet. Tabulka vypadala takto:
Pravidlo | Směr | Adresa odesilatele | Port odesilatele | Adresa Příjemce | Port příjemce | ACK | Povolit/Zakázat |
C1 | ven | 128.1.2.1 | >1023 | 0.0.0.0/0 (vše) | 23 | Povolit | |
C2 | dovnitř | 0.0.0.0/0 (vše) | 23 | 128.1.2.1 | >1023 | vždy | Povolit |
default1 | dovnitř | 0.0.0.0/0 (vše) | 0.0.0.0/0 (vše) | Zakázat | |||
default2 | ven | 0.0.0.0/0 (vše) | 0.0.0.0/0 (vše) | Zakázat |
Routery CISCO nejprve samostatně definují přístupové filtry příkazem access-list. Za příkazem access-list je
access-list 101 permit tcp host 128.1.2.1 0.0.0.0 255.255.255.255 eq 23 access-list 101 deny ip 0.0.0.0 255.255.255.255 0.0.0.0 255.255.255.255 access-list 102 permit tcp 0.0.0.0 255.255.255.255 host 128.1.2.1 eq 23 established access-list 102 deny ip 0.0.0.0 255.255.255.255 0.0.0.0 255.255.255.255 interface serial 0 ip access-group 101 out ip access-group 102 in