Úvod

V súčasnej dobe sa na Internet chce pripájať každý, kto o ňom čo len počul. Ale okrem toho, že na Internete nájdete zábavu, poučenie, informácie či elektronické obchody, pôsobia na ňom aj nekalé živly. Ich cieľom je často získavanie informácií, ničenie systémov, ale (a to je dôležité) nabúravanie sa do systémov s cieľom ovládnuť ich a použiť ich ako odrazový mostík pre ďalšie aktivity. V tomto dokumente nenájdete príkazy, ktoré zabezpečia váš počítač ani informácie o tzv. NAT (skrývanie siete za jednu IP), ale nájdete tu informácie, ktoré vám (snáď) pomôžu pochopiť ako takáto ochrana môže fungovať.

Ohnivé steny

Jedným z prostriedkov obrany pred týmito útočníkmi sú firewall-y. Slovo firewall je zložené zo slov fire (paľba) a wall (stena) - teda stena za ktorú sa schovávame pred paľbou sieťových paketov, ktoré sa snažia poškodiť náš počítač či sieť. V nasledujúcom článku popíšem princípy, na ktorých funguje IP firewall akým je napríklad filtrovanie paketov v Linux-ovom jadre.

Protokoly

Komunikácia po počítačovej sieti je pomerne komplikovaná vec a preto je rozdelená na viacero úrovní. Každá z nich sa zaoberá niečím iným. Jednou z tých spodnejších je úroveň, na ktorej je implementovaný IP protokol. Protokol, ktorý sa stará o to, aby sa informácia dostala z jedného počítača na druhý. Nech už je tá informácia akákoľvek.

Štruktúra paketu

IP protokol je popísaný dokumentom RFC 791. Tam sa dočítame, že IP protokol popisuje spôsob posielania blokov dát po sieti. Týmto blokom sa hovorí pakety a ich hlavička majú nasledovnú štruktúru:

Verzia Dĺžka hlavičky Typ služby Celková dĺžka
Identifikácia Príznaky Posun fragmentu
Doba života Protokol Kontrolná suma hlavičky
Zdrojová adresa
Cieľová adresa
Nastavenia Zarovnanie

Typický firewall funguje tak, že skúma jednotlivé časti IP paketov a na ich základe sa rozhoduje či paket pustí ďalej (do aplikácie či do modulov, ktoré zariadia pre-poslanie paketu do inej siete), alebo ho zahodí.

Požiadavka a odpoveď

Typická komunikácia po sieti funguje tak, že jeden počítač (volajme ho Centaur) pošle paket-požiadavku na druhý počítač (nazveme ho Sirius). Sirius požiadavku prijme, spracuje ju a pošle odpoveď naspäť Centaurovi. Požiadavka aj odpoveď môžu byť samozrejme zložené aj z viacerých paketov. Podstatné, ale je, že aby sa požiadavka dostala na Sirius, musí v sebe niesť informáciu o tom, kam má byť doručená - Destination Addres (Cieľová adresa). Aby Sirius vedel, od koho mu požiadavka prišla (a komu má vlastne poslať odpoveď), tak paket s požiadavkou tiež nesie informáciu o tom, kto ho poslal - Source Address (Zdrojová adresa). Keď Sirius posiela odpoveď, tak sa vlastne stáva odosielateľom paketu a ten, kto sa pýtal - Centaur, bude adresátom. To znamená že požiadavka a odpoveď majú navzájom prehodené zdrojovú a cieľovú adresu:

Centaur →
→Požiadavka→
... Zdrojová adresa = Centaur Cieľová adresa = Sirius
→Sirius
Centaur ←
←Odpoveď←
... Zdrojová adresa = Sirius Cieľová adresa = Centaur
← Sirius

Takže prvá vec na základe, ktorej môžeme filtrovať je zdrojová a cieľová IP adresa:

Filtrovanie podľa IP adresy

Ďalší postup filtrovania závisí na druhu protokolu, ktorý je prenášaný IP packetom. Preto teraz zdanlivo odbočím od témy a popíšem ako vyzerajú pakety ktoré odchádzajú a prichádzajú.

Zoznam protokolov a ich číselné označenie nájdete v súbore /etc/protocols. V bežnej praxi najčastejšie stretnete:

ICMP
Tento protokol používajú programy ping, či traceroute. Spravidla prenáša informácie o dostupnosti počítačov.
UDP
Tento protokol prenáša relatívne malé bloky informácií, alebo pakety, pri ktorých nezáleží na poradí v ktorom dorazia do cieľa. Služby poskytované týmto protokolom sa označujú ako služby bez spojenia. Na UDP stavia napríklad služba DNS (Domain Name Service), či NTP (Network Time Protocol)
TCP
Tento protokol poskytuje takzvané "služby so spojením". Zaručuje sa tu zachovanie poradia paketov. Na TCP stavia mnoho známych protokolov ako je HTTP, FTP, SSH, TELNET, POP3, SMTP a podobne.

ICMP

ICMP pakety nesú v sebe informáciu o icmp-type. Je bežné, že na paket s jedným typom dostaneme odpoveď s iným typom. Napríklad ping funguje tak, že náš stroj pošle požiadavku na odozvu - odchádzajúci paket má icmp-typ echo. Odpoveďou je paket s icmp-typom echo reply. Podobne funguje traceroute: odchádzajúci paketom sa postupne nastavuje položka TTL - Time To Live. Táto položka sa znižuje pri každom prechode nejakým routerom. Ten, ktorý zníži TTL na nulu, nám pošle ICMP paket s typom time-exceeded.

ICMP pakety môžeme dostávať aj vtedy, keď sme neposlali ICMP požiadavku. Takáto situácia nastane napríklad ak sa pokúšame vytvoriť spojenie nejakým iným protokolom na server, ktorý nie je funkčný. V takom prípade nám posledný router, pred cieľom pošle o tom informáciu paketom s typom host-unreachable. Ak router nevie nasmerovať náš paket ani do tej správnej siete môže poslať aj správu network-unreachable. Stroj ktorý síce je dosiahnuteľný, ale neposkytuje službu o ktorú sme požiadali odpovedá ICMP paketom s typom port-unreachable.

Filtrovanie ICMP

Z toho čo sme povedali o ICMP vyplýva, že prichádzajúce ICMP treba filtrovať, pretože útočníkovi dovoľuje zisťovať informácie o štruktúre našej siete. Na druhej strane, ale niektoré typy ICMP paketov treba púšťať aby sme sa dozvedeli o problémoch s dostupnosťou iných serverov. Odchádzajúce ICMP pakety môžeme filtrovať ak nepotrebujeme overovať svoju konektivitu pomocou ping či traceroute. Môžeme tiež filtrovať informácie o tom či nejaký server, sieť či služba je u nás dostupná.

TCP a UDP

Pakety protokolov stavajúcich na TCP a UDP sa neodlišujú ICMP-typom, ale niečím iným - poľom zvaným port. Odchádzajúce pakety špecifikujú aký druh služby na serveri ich má spracovať. Služby sú očíslované a ich označenia sa môžete dozvedieť v súbore /etc/services. Paket s požiadavkou nesie v sebe aj informáciu o tom, aký port má byť špecifikovaný v odpovedi.

Objasnime si to na príklade. Posielanie e-mailov sprostredkováva služba SMTP. Ak dva mailovacie programy naraz chcú poslať mail na jeden SMTP server, tak oba pošlú paket s cieľovou adresou servera, s adresou odosielateľa svojou a s cieľovým portom 25 (SMTP). Aby bolo jasné, ktorá odpoveď patrí ktorému programu tak požiadavka dostane pridelené tiež náhodné číslo takzvaného zdrojového portu. Toto číslo je spravidla väčšie ako 1024, pretože čísla menšie sú vyhradené pre dobre známe služby (well-known services). Adresa s portom sa zapisujú takto: 192.168.0.1:25 alebo slovne sirius:smtp.

Filtrovanie podľa portu

Filtrovanie TCP a UDP paketov sa môže robiť aj pomocou portu. Ak poskytujeme službu DNS mali by sme do DNS servera pustiť len pakety, ktoré nesú DNS požiadavku. To zistíme podľa cieľového portu paketu.

Tento prístup má, ale jednu chybu. Napríklad protokolom http, ktorým sa prenášajú webové stránky sa náš webový prehliadač chce spájať predsa s ľubovoľným webovým serverom. Nemôžeme preto odfiltrovať všetky http pakety. Chceme ale pustiť len tie pakety, ktoré sú odpoveďou na pakety, ktoré sme my sami poslali. Firewall netfilter to rieši pomocou sledovania spojení vďaka čomu dokáže označiť prichádzajúci paket ako related (súvisiaci) - to sú pakety, ktoré sú odpoveďou na náš paket (patria sem aj ICMP pakety informujúce o chybe či nedosiahnuteľnosti).

Ďalším problémom sú protokoly ako je FTP. Problém je v tom, že pri týchto protokoloch sa vytvárajú dve IP spojenia. Jedným sa prenášajú príkazy druhým dáta. Port na ktorom sa prenášajú dáta má za normálnych okolností číslo 20. Spojenie na tomto porte je ale celkom samostatné a je iniciované serverom. Klient má teda problém rozoznať pakety tohoto spojenia ako pakety súvisiace s paketmi idúcimi cez spojenie pre príkazy. To platí pre klasické ftp spojenie. Existuje ale aj pasívny mód ftp. Pri pasívnom móde sa najprv cez príkazový kanál dohodnú server s klientom na portoch, ktoré sa použijú pre prenos dát. Oba tieto porty majú číslo väčšie ako 1024. Tento port teda nie je vyznačený v hlavičke IP paketu ale v dátach - čo kladie zvýšené nároky na firewall pretože mu už nestačí analyzovať hlavičky s pevnou štruktúrou, ale musí analyzovať aj dáta prenášané IP paketmi (netfilter to rieši pomocou modulov ip_conntrack_ftp). Podobnými problémami trpí aj IRC.

Sieťové rozhrania

Sieťové rozhranie je všeobecný pojem zahrňujúci tak sieťové karty, ako aj externé a interné modemy. Je to rozhranie cez ktoré sa do nášho počítača dostávajú pakety. Často sa dá určiť aké, ktoré cieľové adresy by sa nemali vyskytnúť na danom rozhraní. Napríklad na samostatnom počítači pripojenom na cez modem na Internet by cez modem nemali prichádzať pakety so zdrojovou adresou 127.0.0.1. Alebo na bráne, ktorá robí NAT, by nemali cez modem prichádzať pakety so zdrojovou adresou patriacou do lokálnej sieťe (napr. rezervované rozsahy 10.x.x.x, 172.16-31.x.x, 192.168.x.x). Takéto pakety sa vyskytujú ak niekto falšuje zdrojové IP adresy (adress spoofing).

Zlé pakety

Nakoniec treba spomenúť pakety, ktoré sú neplatné. Napríklad TCP paket, ktoré nadväzuje spojenie - má nastavený príznak SYN - môže prísť len jeden a to na začiatku spojenia. Podobne TCP paket s nastavený príznakom ACK,FIN alebo RST môže prísť len pre existujúce spojenia. Neplatné sú aj pakety, ktoré nemajú správnu kontrolnú sumu a tak ďalej a tak podobne.

Záver

Ako vidíte, problematika firewall-ov je pomerne komplikovaná. Preto ten, kto stavia firewall, by mal rozumieť tomu ako funguje. Ak tomu správca nerozumie, môže vytvoriť falošný pocit bezpečia. Niečo také ako keď máte v budove plno členov bezpečnostnej služby, ale všetci strážia len prvé poschodie. Do budovy sa ale možno dosať aj cez otvorené okno na druhom poschodí. Známe sú slová bezpečnostného experta menom Bruce Perens: Bezpečnosť nie je stav - je to process. Dávajte pozor na svoje firewall-y. Starajte sa o ne a zdokonaľujte. A možno sa vám podarí oddialiť dobu, kedy cez ne niekto prenikne. Veľa šťastia.