Objavljeno:

Požarni zid (mala šola informacijske varnosti, 7. del)

Uvod

Požarni zid (ang. firewall) je najpomembnejši element zagotavljanja varnosti pred napadi iz omrežja. Načeloma se uporabi požarnega zidu lahko odrečemo le, če na računalniku ali drugi v omrežje povezani napravi ne teče nobena aplikacija oziroma storitev, ki sprejema povezave iz omrežja. V vseh ostalih primerih je uporaba požarnega zidu skoraj vedno smiselna, saj običajni požarni zid obremenjuje sistem le minimalno.

Požarni zid je načeloma namenjen ločevanju dveh odsekov omrežij, pravila, ki jih določimo v požarnem zidu pa dovolijo ali pa onemogočijo komunikacijo med dvema omrežnima točkama oziroma dvema odsekoma omrežij.

Kljub temu, da za omejevanje omrežnih povezav skrbi požarni zid, pa se moramo zavedati, da požarni zid sam po sebi ne onemogoča vseh nezaželenih dostopov do našega računalnika. Dostop je še vedno mogoč preko aplikacij, ki se povezujejo v omrežje ali storitev, ki tečejo na računalniku.

Če imamo na računalniku npr. omogočeno deljenje datotek in omrežnih sredstev, je seveda logično, da bo požarni zid omogočal tovrstne dostope do našega računalnika, ostale poskuse dostopov pa bo (če bo tako nastavljen) blokiral. S tem nam bo požarni zidi sicer zagotavljal določeno stopnjo varnosti, a nezaželen dostop do našega računalnika bo morda še vedno mogoč preko zlorabe storitve deljenja datotek in omrežnih sredstev.

Podobno je, če na našem računalniku teče storitev ssh – gre za standardno Linux storitev, ki omogoča oddaljeni dostop in upravljanje z računalnikom (podobno, kot v okolju Windows RDP). Če požarni zid dovoljuje dostop do te storitve, do ostalih pa dostope onemogoča, lahko do zlorabe pride z napadom na samo storitev, ki jo požarni zid sicer dovoljuje. Zato je pravila požarnega zidu vedno smiselno postaviti tako, da dostope do storitev dovolimo iz čim bolj omejenega nabora omrežnih (IP) naslovov (povedano drugače – dostope zaklenemo na določene IP številke), kjer je to mogoče pa tudi časovno omejimo večkratne (neuspešne) poskuse povezovanja na naš računalnik iz istega omrežnega naslova. Vsekakor je pri zagotavljanju omrežne varnosti potrebno poskrbeti za varnost vseh storitev, ki tečejo na našem računalniku – zgolj uporaba požarnega zidu ni čudežna paličica, ki nas bo rešila pred napadom od zunaj.

Naj še posebej poudarimo, da za izvedbo napada ni potrebno začeti komunikacije od zunaj. Povedano drugače – naš požarni zid lahko onemogoča vse poskuse povezave iz omrežja na naš računalnik, a nam to ne zagotavlja, da se napadalec vseeno ne bo uspel povezati na naš računalnik.

Še tako restriktivno nastavljen požarni zid namreč praviloma vedno dovoli povezovanje iz našega računalnika navzven, v zunanje omrežje (sicer npr. ne bi mogli brskati po spletu). To pa napadalcu omogoča vzpostavitev tim. reverznega tunela. Napadalec lahko uporabniku podtakne zlonamerno aplikacijo ali mu podtakne npr. spletno povezavo, s kateri se iz računalnika žrtve odpre komunikacijski kanal navzven, do napadalca. Preko tega komunikacijskega kanala pa nato napadalec “vstopi” v računalnik žrtve. Zato je v okviru zagotavljanja omrežne varnosti smiselno pravila požarnega zidu določati tudi na nivoju posamezne aplikacije.

Aplikacije za požarni zid v Linuxu

Načeloma poznamo strojne in programske požarne zidove, pri čemer pa se je potrebno zavedati, da so programski požarni zidovi v bistvu le posebne naprave (oziroma posebej prilagojeni računalniki), na katerih teče prilagojen operacijski sistem (navadno kakšen BSD, včasih tudi kakšna namenska distribucija Linuxa), ki poganja programski požarni zid.

Programski strojni zidovi v Linuxu praviloma omogočajo omejevanje komunikacij glede na omrežni naslov, protokol ali komunikacijska vrata (ang. port), požarni zidovi, ki znajo določati pravila dostopa do omrežja za vsako aplikacijo posebej pa so bolj redki. Še redkeje se uporabljajo kontekstualno prilagojeni požarni zidovi, torej požarni zidovi, ki uporabljajo različen nabor pravil za zagotavljanje omrežne varnosti za različna omrežja, je pa res, da je nabor takšnih pravil z nekaj malega poznavanja ukazne lupine v Linuxu (ang. bash) mogoče relativno enostavno sprogramirati.

Ker je operacijski sistem Linux že v osnovi zelo povezan z omrežji in internetom, ne preseneča, da so aplikacije za požarne zidove v Linuxu zelo zmogljive. Tako je s požarnim zidom v Linuxu poleg osnovnega filtriranja komunikacij mogoče izvajati tudi preslikavo zasebnih omrežnih naslovov (tim. NAT – Network Address Translation), kar omogoča deljenje povezave, preusmerjati promet med različnimi omrežji, izvajati prioritiziranje prometa (tim. QoS – Quality of Service), omejevati pasovno širino (tim. bandwith shaping), itd.

Ena prvih aplikacij za požarni zid v Linux se je imenovala ipfwadm. V 1990-tih letih jo je (v Linux jedrih 2.2) nadomestila zmogljivejša aplikacija ipchains (Linux IP Firewalling Chains), od Linux jeder serije 2.4 dalje, pa se uporablja iptables.

V sodobnih Linux sistemih se sicer za upravljanje IPv4 prometa uporablja iptables za upravljanje IPv6 prometa ip6tables, za filtriranje ARP (Address Resolution Protocol) tabel (zlasti za preprečevanje tim. ARP preusmerjanja oz. ARP ponarejanja (ang. ARP spoofing)) arptables, za upravljanje omrežnih mostov na Ethernet nivoju pa ebtables.

Iptables je izredno zmogljiva aplikacija, s katero je mogoče nastaviti praktično kakršenkoli požarni zid oziroma pravila za oblikovanje omrežnega prometa, težava pa je, da v bistvu ne gre za klasično aplikacijo, pač pa za neke vrste skriptni jezik. S poznavanjem iptables ukazov je v ukazni lupini mogoče sprogramirati zelo zmogljiv požarni zid, vendar je za to potrebno kar nekaj poznavanja delovanja omrežij in delovanja Linux sistemov. Obstajajo sicer nekateri grafični vmesniki, vendar je njihov razvoj zastal (npr. Firestarter) ali pa so precej zapleteni za uporabo (Guarddog).

UFW – Uncomplicated Firewall

Iz tega razloga so pri podjetju Canonical, ki skrbi za razvoj Ubuntu Linuxa, razvili aplikacijo UFW – Uncomplicated Firewal_l. Čeprav ime nakazuje, da je uporaba tega požarnega zidu enostavna, pa ni povsem tako – _UFW je v osnovi potrebno poganjati iz ukazne vrstice. Vendar pa obstaja tudi grafični vmesnik za UFW – imenuje se Gufw, katerega upravljanje pa je bistveno bolj enostavno. UFW sicer zna upravljati promet tako v IPv4, kot tudi v IPv6 omrežjih (nastavitve aplikacije sicer najdemo v datoteki /etc/default/ufw, IPv6 podpora je privzeto že vključena).

V Ubuntu Linux je aplikacija za požarni UFW zid že vključena, vendar pa privzeto požarni zid ni aktiviran. Prav tako ni nameščen grafični vmesnik za upravljanje s požarnim zidom.

Če požarni zid požarni zid želimo aktivirati in ga upravljati lahko to storimo iz ukazne vrstice (prikličemo jo s pritiskom na kombinacijo tipk Ctrl-Alt-t) z ukazom:

sudo ufw enable

Še bolj enostavno pa je, da namestimo programski paket gufw. Ko aplikacijo Gufw zaženemo, jo je naprej potrebno odkleniti z našim skrbniškim geslom. S tem je preprečeno, da bi s požarnim zidom upravljal nepooblaščen uporabnik.

Ko požarni zid omogočimo, je privzeta nastavitev taka, da so vse dohodne povezave blokirane (onemogočene brez obvestila o zavrnitvi), vse izhodne povezave pa dovoljene. Vhodne ali izhodne povezave lahko sicer dovolimo (možnost allow, slo. dovoli), blokiramo (možnost deny, slo. zanikati, to pomeni, da jih zavrnemo brez obvestila) ali pa zavrnemo z obvestilo o zavrnitvi (možnost reject, slo. zavrni). Naj omenimo, da ko požarni zid enkrat nastavimo, nastavitve ostanejo v veljavi tudi ko zapremo Gufw oziroma tudi ko ponovno zaženemo računalnik.

Gufw

Gufw.

V Gufw lahko sicer nastavljamo podrobnejša pravila dostopov. Med prednastavljenimi pravili (zavihek Prednastavljeno) lahko za vsako komunikacijo (dohodno ali izhodno: In/Out) določimo akcijo. Akcija je lahko ena izmed naslednjih:

  • “dovoli” (allow),
  • “blokiraj” (deny),
  • “zavrni” (reject) ali
  • “omejitev” (limit), ki zavrača vse povezave iz določenega IP naslova v primeru, da je v zadnjih 30 sekundah iz ali na ta IP naslov prišlo 6 ali več zahtevkov.

Slednja akcija je koristna zlasti zato, ker z njo lahko npr. omejimo napadalce, ki skušajo dostopati do sistema z ugibanjem gesel.

Pri prednastavljenih oblikah komunikacije lahko izbiramo med aplikacijami (npr. Amule, Transmission, Skype,…) ali storitvami (npr. SSH, VNC, POP3, itd.). Vendar pa naj nas to ne zavede – UFW pravil ne določa na nivoju posamezne aplikacije, pač pa na nivoju komunikacijskih vrat, ki jih privzeto uporabljajo v seznamu navedene aplikacije. Kar je pomembna razlika.

Če želimo porabiti nekaj več možnosti pri nastavljanju pravil, lahko uporabimo zavihek Enostavno. V tem zavihku lahko za dohodne ali izhodne komunikacije določamo že navedene akcije, komunikacije pa lahko delimo glede na protokol (TCP, UDP ali oba protokola), določimo pa lahko storitev ali vrata, ki jih želimo filtrirati.

Dodajanje pravil požarnega zidu v Gufw

Dodajanje pravil požarnega zidu v Gufw.

Med naprednimi možnostmi pa lahko omejujemo komunikacije še na podlagi dohodnega (From) ter ciljnega (To) IP naslova.

Če kliknemo na prikaz razširjenih možnosti, pa lahko določimo še nivo beleženja (ang. logging). Naj omenimo, da lahko poleg UFW hkrati uporabljamo tudi iptables.

Požarni zidovi, ki pravila določajo na nivoju posamezne aplikacije

Požarni zidovi, ki pravila določajo na nivoju posamezne aplikacije so tisti, ki znajo omejevati izhodne povezave glede na aplikacijo, ki se želi povezati v zunanje omrežje. Takšno omejevanje je smiselno zato, ker nam pomaga onemogočati napade z zlonamerno kodo, ki se iz našega računalnika povezuje do napadalca in s povezavo vzpostavi tim. reverzni tunel, preko katerega napadalec lahko pridobi dostop do našega računalnika. Če torej želimo višjo stopnjo omrežne varnosti, je namreč smiselno imeti nadzor tudi na lokalnimi aplikacijami, ki se povezujejo v zunanje omrežje.

Pri tem seveda ni dovolj vzpostaviti zaupanja aplikaciji zgolj na podlagi njenega imena, pač pa je potrebno preveriti tudi njeno istovetnost, kar se praviloma izvaja s pomočjo tim. kontrolne vsote (ang. hash value) oziroma preverjanjem tim. digitalnega prstnega odtisa aplikacije, ki ji dovolimo povezovanje navzven.

Že omenjeni Gufw tega ne omogoča. Prav tako ne omogoča niti pregledovanja aktivnih povezav ter postavljanje pravil na podlagi učenja. Slednje sicer omogoča že omenjeni Firestarter, vendar je njegov razvoj zastal.

V nadaljevanju si bomo najprej na hitro pogledali kako je pregledovanje aktivnih povezav in pregled aplikacij, ki so povezane v omrežje mogoče izvesti s pomočjo ukazne vrstice, na koncu pa si bomo pogledali enega redkih tovrstnih požarnih zidov za Linux, ki ga lahko upravljamo tudi preko grafičnega vmesnika.

Zmogljiv program, ki nam pomaga prikazati vse aktivne in poslušajoče (ang. listening) omrežne povezave je aplikacija Netstat. Če tako v ukazno vrstico (prikličemo jo s pritiskom na kombinacijo tipk Ctrl-Alt-t) vnesemo ukaz:

netstat -p -W

Dobimo približno takšen izpis (če ne uporabimo parametra -W, bodo ciljni naslovi povezav (Foreign Address) okrajšani):

(Not all processes could be identified, non-owned process info
 will not be shown, you would have to be root to see it all.)
 Active Internet connections (w/o servers)
 Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
 tcp 1 0 doma.wlan:52948 ***.canonical.com:http CLOSE_WAIT 4287/python
 tcp 0 0 doma.wlan:48998 78.***.***.***:12350 ESTABLISHED 3982/skype
 ...
 tcp 0 0 doma.wlan:51350 www.linuxquestions.org:https TIME_WAIT -
 tcp 0 0 doma.wlan:57116 push.slo-tech.com:https ESTABLISHED 4221/firefox
 tcp 0 0 doma.wlan:48881 *.static.**.net:6697 ESTABLISHED 9394/xchat

Iz izpisa so razvidne podrobnosti o naših trenutnih povezavah in sicer protokol (TCP, UDP ali surovi (ang. raw) protokol, ki ga uporablja aplikacija oziroma končna točka komunikacije v našem računalniku (ang. socket)); lokalni naslov omrežne povezave, skupaj s številko komunikacijskih vrat (ang. port); oddaljeni naslov omrežne povezave kamor oziroma od koder poteka komunikacija, stanje povezave (povezava je lahko vzpostavljena, se zaključuje, je že zaključena ali pa poslušajoča (čaka na vzpostavitev povezave od zunaj); na koncu pa vidimo ime aplikacije in identifikacijsko številko njenega Linux procesa (tim. PID – process ID).

Podoben izpis lahko dobimo z ukazom lsof (list open files):

lsof -i
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
 skype 3982 matej 18u IPv4 18024 0t0 UDP localhost:46773
 skype 3982 matej 40u IPv4 397042 0t0 TCP doma.wlan:56436->***.***.***.22:40003 (ESTABLISHED)
 ...
 ubuntuone 4124 matej 34u IPv4 395221 0t0 TCP doma.wlan:32981->****.canonical.com:https (ESTABLISHED)
 firefox 4221 matej 36u IPv4 295265 0t0 TCP doma.wlan:57116->push.slo-tech.com:https (ESTABLISHED)
 xchat 9394 matej 17u IPv4 398444 0t0 TCP doma.wlan:48947->***.freenode.net:7000 (ESTABLISHED)

Tudi iz tega izpisa so razvidne podrobnosti o naših trenutnih povezavah, z nekaterimi dodatnimi parametri pa lahko onemogočimo prikazovanje imen domen in komunikacijskih vrat (-n -P), pregledamo povezave samo enega uporabnika (-u), itd.

Za podrobnejše pregledovanje in analiziranje omrežnih povezav je v Linuxu sicer na voljo orodje Wireshark, vendar gre za profesionalno orodje, ki zahteva podrobnejše poznavanje delovanja omrežij. Zna pa Wireshark analizirati številne komunikacijske protokole, tudi protokole za internetno telefonijo, GSM telefonijo, itd. zato se pogosto uporablja pri analizi napakna omrežju ali preiskovanju omrežnih incidentov.

Ena izmed redkih aplikacij, ki v Linuxu omogoča določanje pravil dostopa na nivoju posamezne aplikacije je Leopard Flower. Omenjeni požarni zid je žal šele bolj na začetku razvoja, kar se mu najbolj pozna pri uporabniški prijaznosti. Mimogrede, če omenjeni požarni zid želimo namestiti na svoj računalnik, ga moramo prevesti iz izvorne kode sami, saj za Ubuntu niso na voljo skladišča programskih paketov.

Lpfw omogoča določanje pravil dostopa na nivoju posamezne aplikacije

Lpfw omogoča določanje pravil dostopa na nivoju posamezne aplikacije.

Glavno okno programa Leopard Firewall

Glavno okno programa Leopard Firewall.

Zaključek

Kot smo videli, so požarni zidovi v Linuxu zmogljive aplikacije, na nek način žal še celo preveč zmogljive za povprečnega uporabnika. Linux ima namreč za upravljanje omrežij sicer odlična in zmogljiva orodja, vendar pa le-ta niso prilagojena za povprečnega uporabnika namiznih sistemov.

V Ubuntu Linuxu tako na žalost na voljo ni privzete grafične aplikacije z dobro uporabniško izkušnjo, ki bi omogočala hitro in pregledno prikazovanje omrežnih povezav in na podlagi tega omogočala oblikovanje pravil požarnega zidu, zlasti za dovoljevanje izhodnih povezav.

Res je tudi, da je v Linuxu s pomočjo vgrajene ukazne lupine mogoče nastaviti tim. kontekstualni požarni zid, torej požarni zid, ki prilagaja svoja pravila glede na to v katero omrežje smo povezani (službeno, domače, brezžična dostopna točk v kiberkavarni,…). A žal tudi za to ni na voljo enstavnega grafičnega orodja, pač pa je potrebno ročno programiranje ustreznih pravil (pri tem si lahko pomagamo z nmcli, ki je dem Upravitelja omrežnih povezav). Upajmo, da se bo v prihodnosti to spremenilo.

Kljub temu, da je požarni zid najpomembnejši element zagotavljanja varnosti pred napadi iz omrežja, pa se je – kot smo že poudarili – potrebno zavedati, da moramo za omrežno varnost poskrbeti tudi na nivoju aplikacij in storitev, ki se povezujejo v omrežje ali iz omrežja sprejemajo povezave. V okviru nadzora omrežja bomo morda želeli razmisliti tudi o kakšnem orodju za nadzor uporabe interneta (tim. orodja za starševski nadzor uporabe interneta), npr. Gnome Nanny (namestimo ga s pomočjo programskega paketa nanny), ki poleg blokiranja dostopa do neželjenih vsebin ali storitev za vsakega uporabnika posebej omogoča tudi časovno omejevanje uporabe interneta.

Gnome Nanny

Gnome Nanny.

Prav tako je včasih smiselno uporabiti kakšno orodje za pregledovanje porabe pasovne širine, kar je pomembno zlasti pri uporabi mobilnega interneta, pa tudi pri zaznavanju sumljive omrežne aktivnosti. Eno takih orodij je npr. NTM, ki bi po našem mnenju bilo lahko precej bolje integrirano v Ubuntu sistem, saj je uporabniku neprijazna že sama namestitev aplikacije (aplikacija se ne nahaja v privzetih skladiščih programskih paketov).

Namestitev NTM

Namestitev NTM.

Network Traffic Monitor

Network Traffic Monitor.

Naprednjši uporabniki pa bodo morda razmislili o kakšnem IDS/IPS sistemu (tim. Intrusion Detection/Prevention Systems – gre za aplikacije za zaznavanje in/ali preprečevaje omrežnih napadov), ki pa zahtevajo že podrobnejše poznavanje delovanja omrežij in sistemske administracije.

Če torej zaključimo, je v Linuxu na voljo dovolj zmogljivih orodij za zagotavljanje varnosti pred napadi iz omrežja. Vendar pa je uporaba zmoglivejših izmed teh orodij preveč zapletena za običajnega uporabnika, predvsem pa bi si uporabniki želeli boljše integracije in celostne uporabniške izkušnje. Zmogljiv a enostaven požarni zid, ki bi omogočal oblikovanje pravil na nivoju posameznih aplikacij in glede na omrežje katerega smo povezani, skupaj z aplikacijo za pregledovanje porabe pasovne širine bi zato po našem mnenju moral biti integralen del Upravitelja omrežnih povezav. Upajmo, da čimprej.

Kategorije: Digitalna forenzika, Informacijska varnost, Odprta koda, Zasebnost
Ključne besede: kriptografija, mala šola informacijske varnosti, trajno brisanje podatkov