Objavljeno:

VPN omrežja (mala šola informacijske varnosti, 9. del)

VPN (Virtual Private Networking) nam omogoča varno povezovanje različnih omrežij ali računalnikov z uporabo (praviloma šifriranih) tunelov. Prek takšnega tunela lahko dostopamo do oddaljenega omrežja na podoben način, kot bi bili fizično prisotni v omrežju ali celo speljemo ves internetni promet iz našega računalnika preko tunela do oddaljenega računalnika ter tako dostopamo do interneta preko oddaljenega omrežja. VPN se tako uporablja za oddaljen dostop do strežnikov, ki se nahajajo v varovanih (internih) omrežjih, varno uporabo brezžičnih omrežij (preusmeritev internetnega prometa od našega računalnika prek tunela do varne izhodne točke na ožičenem omrežju), izogibanje regijskim omejitvam dostopa (npr. do video vsebin, ki za našo regijo niso dostopne lahko dostopamo preko VPN povezave), izogibanje cenzuri, itd.

Ločimo več vrst VPN omrežij. Nekatera služijo zgolj povezavi oddaljenih računalnikov v interno omrežje, nekatera pa povezujejo celotna omrežja med seboj. Preko VPN tunelov se je mogoče preko tim. ponudnikov tunelov (ang. tunell broker) preko IPv4 omrežja povezati v IPv6 omrežje. Med bolj znanimi ponudniki IPv6 tunelov sta npr. Hurricane Electric in Teredo (Teredov IPv6 tunel si je v Linuxu mogoče namestiti s pomočjo programskega paketa miredo). Nekatere VPN povezave omogočajo povezovanje omrežij na tim. povezovalni plasti podatkovne povezave (gre za tim. 2. plast OSI modela, ethernet), nekateri pa na omrežni plasti podatkovne povezave (gre za tim. 3. plast OSI modela).

Za vzpostavljanje VPN povezav se uporabljajo različni protokoli. V Ubuntu Linuxu so za Upravitelja omrežnih povezav na voljo dodatki, ki omogočajo povezovanje v PPTP (Point-to-Point Tunneling Protocol) omrežja, OpenVPN omrežja, Ciscotova VPN omrežja (dodatek VPNC), Ciscotova AnyConnect SSL VPN omrežja (dodatek Openconnect) ter povezovanje v IPSec omrežja (dodatek strongSwan).

Posamezne dodatke lahko v Ubuntu Linuxu naložimo s pomočjo ustreznih programskih paketov (network-manager-pptp, network-manager-openvpn, network-manager-vpnc, network-manager-openconnect ter network-manager-strongswan).

Seveda pa na drugi strani potrebujemo ustrezen VPN strežnik oziroma napravo, ki zna sprejemati in ustrezno preusmerjati oz. zaključevati VPN povezave. V nadaljevanju si bomo najprej na hitro pogledali kako postaviti OpenVPN strežnik, nato pa še kako ustrezno nastaviti VPN odjemalce.

OpenVPN strežnik

OpenVPN lahko teče na običajnem (namiznem) računalniku, strežniku ali kakšni specializirani napravi (npr. brezžičnem usmerjevalniku). OpenVPN strežniki so razmeroma priljubljeni, saj zagotavljajo visoko stopnjo varnosti, omogočajo povezovanje različnih operacijskih sistemov in so (v primerjavi z nekaterimi drugimi VPN sistemi) relativno enostavni za postavitev in vzdrževanje.

V podrobnosti o postavitvi OpenVPN strežnika se ne bomo spuščali, saj je za to na voljo ustrezna dokumentacija ter različni spletni vodiči, poleg tega je za postavljanje VPN strežnikov potrebnega nekaj več poznavanja sistemske in omrežne administracije.

OpenVPN strežnik pod Linuxom teče kot demon (ang. daemon, proces, ki teče v ozadju), upravljamo pa ga iz ukazne vrstice ali s pomočjo grafičnega programa OpenVPN Admin oziroma programskega paketa gadmin-openvpn-server.

OpenVPN strežnik sicer namestimo s pomočjo programskega paketa openvpn, potrebujemo pa še programska paketa openssl in ca-certificates.

Prvi korak postavljanja OpenVPN strežnika je vpostavitev lastne infrastrukture javnih ključev (tim. PKI infrastruktura – public key infrastructure). PKI infrastruktura vsebuje javni ključ (certifikat) in zasebni ključ VPN strežnika in vseh odjemalcev ter CA certifikat (Certificate Authority) namenjen digitalnemu podpisovanju javnih ključev (certifikatov) strežnika in odjemalcev.

To je pomembno zato, ker OpenVPN podpira dvosmerno avtentikacijo – strežnik se avtenticira odjemalcu, odjemalec pa strežniku. Pri vzpostavitvi povezave se strežnik in odjemalec drug drugemu avtenticirata tako, da najprej preverita ali je bil certifikat drugega podpisan s strani CA certifikata.

Ko imamo infrastrukturo enkrat vzpostavljeno (ustvarjene vse potrebne ključe), je priporočljivo, da CA zasebni ključ zaradi varnosti umaknemo iz računalnika. Brez CA zasebnega ključa namreč ni mogoče ustvarjati oz. podpisovati novih ključev za odjemalce ter preklicevati kompromitiranih ključev. S tem ukrepom tako preprečimo, da napadalec, ki bi uspel vdreti v OpenVPN strežnik, ne more samovoljno ustvarjati dodatnih dostopov do našega VPN omrežja.

Kot rečeno, si v prvem koraku ustvarimo svoj CA (Certificate Authority) par ključev, nato pa šifrirne ključe strežnika in odjemalcev, ki jih podpišemo s svojim CA ključem. Dolžine ključev lahko nastavimo na 1024, 2048 ali 3072. Večja dolžina ključa pomeni večjo varnost, vendar pa večji ključ zahteva več procesorske moči.

Poleg šifrirnh ključev je potrebno ustvariti še Diffie-Hellmanove parametre, ki omogočajo varno izmenjavo ključev preko nezavarovane povezave brez vnaprejšnjega poznavanja gesel, za večjo varnost pa je priporočljivo uporabiti še TLS overjanje (avtentikacijo).

Nastavitev TLS overjanja pri odjemalcu

Nastavitev TLS overjanja pri odjemalcu.

Naj ponovno omenimo, da OpenVPN omogoča razveljavljanje ključev za odjemalce, kar je potrebno storiti vedno, kadar posumimo, da so bili ključi kompromitirani.

Za povezovanje v OpenVPN omrežje torej potrebujemo naslednje šifrirne ključe:

  • CA certifikat (CA javni ključ) – ca.crt
  • CA zasebni ključ – ca.key
  • certifikat (javni ključ) VPN strežnika – ImeVPNStreznika.crt
  • zasebni ključ VPN strežnika – ImeVPNStreznika.key
  • certifikate (javne ključe) odjemalcev – ImeOdjemalca.crt
  • zasebne ključe odjemalcev – ImeOdjemalca.key
  • Diffie-Hellmanove parametre za varno izmenjavo ključev – _dh{1024 2048 3072}.pem_
  • tls-auth ključ, ki še poveča varnost VPN povezave – ta.key
  • certifikat razveljavljenih ključev odjemalcev – crl.pem

Pred zagonom OpenVPN strežnika je potrebno nastaviti ustrezno datoteko z nastavitvami strežnika ter pravila požarnega zidu ter morebiti tudi IP posredovanje (če OpenVPN strežnik služi kot privzeti prehod na internet za odjemalce).

VPN strežnik nato zaženemo, preverimo dnevniške zapise (s sporočili o morebitnih napakah) ter preiskusimo ali vse teče kot je potrebno (ali so podatkovni paketki res šifrirani, ali je samodejni zagon ob ponovnem zagonu strežnika uspešen, itd.).

Naj omenimo, da v konfiguracijski datoteki sicer lahko nastavimo ali bo VPN povezava tekla preko TCP ali UDP povezave, preko katerih komunikacijskih vrat, ali bo VPN strežnik odjemalcem služil kot privzeti prehod na internet, itd.

Slednje je pomembno tudi zato, ker nekatera omrežja (npr. na letališčih ali v podjetjih) blokirajo VPN povezave. Takim blokadam se je mogoče izogniti z relativno preprostim trikom – OpenVPN strežnik nastavimo tako, da teče na dohodnih komunikacijskih pratih TCP 443 (kjer sicer tečejo HTTPS šifrirane spletne storitve).

Nekatere sodobnejše naprave za nadzor omrežja sicer znajo nad povezavami izvajati poglobljeni nadzor (tim. DPI – Deep Packet Inspection) in lahko ugotovijo, da skušamo OpenVPN promet “skriti” na TCP vrata 443 oziroma zaznajo, da je promet namenjen na ta vrata v resnici OpenVPN promet. SSL podatkovni paketki OpenVPN-ja so namreč “zaviti” v neke vrste “OpenVPN kontejner”, zato jih je mogoče ločiti od ostalega SSL prometa. Zgoraj omenjeni trik tudi ne deluje, kadar omrežje izvaja napad s posrednikom (MITM napad), saj v tem primeru avtentikacija strežnika in odjemalcev ni uspešna.

Temu se je mogoče izogniti s pomočjo maskiranja oz. “skrivanja” OpenVPN prometa pri čemer si lahko pomagamo z aplikacijo Obfsproxy, ki se razvija v okviru Tor projekta. Čeprav je aplikacija Obfsproxy še v aktivnem razvoju, pa svoje delo opravlja dobro. Žal na voljo (še) ni ustreznih namestitvenih paketov in jo je potrebno ročno prevesti.

OpenVPN odjemalci

Kot rečeno, je OpenVPN odjemalec v Ubuntu Linuxu zelo dobro integriran v Upravitelja omrežnih povezav. Naj voljo je sicer tudi OpenVPN odjemalec za okolje Windows in Mac.

Seznam VPN povezav v Upravitelju omrežnih povezav

Seznam VPN povezav v Upravitelju omrežnih povezav.

Po namestitvi ustreznega programskega paketa (network-manager-openvpn), v Upravitelju omrežnih povezav izberemo možnost Povezave VPNNastavi VPN. Vpisovanje ustreznih nastavitev je enostavno in intiutivno. Ko imamo VPN povezavo vpisano (nastavljeno), si seznam VPN povezav, ki so na voljo lahko ogledamo v zavihku VPN. Na VPN strežnik pa se povežemo s klikom na Povezave VPN, nato pa izberemo ustrezno povezavo. Seveda moramo biti pred tem povezani v omrežje.

Povezovanje v VPN omrežje preko Upravitelja omrežnih povezav

Povezovanje v VPN omrežje preko Upravitelja omrežnih povezav.

Mimogrede, če v kakšnih omrežjih (npr. v hotelih, itd.) prihaja do pogostih prekinitev VPN povezave kmalu po priklopu na VPN strežnik, je morda razlog v preveliki velikosti posameznih komunikacijskih paketkov, ki se prenašajo po omrežju. Težavo rešimo tako, da med nastavitvami VPN povezave (Zavihek VPN, gumb Napredno) zmanjšamo tim. MTU (Uporabi največjo enoto prenosa tuneliranja (MTU) – nastavimo pod 1500).

Nastavitve OpenVPN povezave

Nastavitve OpenVPN povezave.

Dodatne nastavitve OpenVPN povezave

Dodatne nastavitve OpenVPN povezave.

Če želimo lahko nastavimo, da se računalnik ob vsakem zagonu samodejno prijavi v VPN omrežje. Med lastnostmi VPN povezave sicer lahko obkljukamo možnost Samodejna povezava, vendar pa ima Upravitelj omrežnih povezav napako in se v VPN omrežja ne zna samodejno povezati, poleg tega ne zna ponovno vzpostaviti prekinjene VPN povezave. To težavo lahko rešimo s preprosto skripto, ki ob določenih časovnih intervalih preverja obstoj VPN povezave in če povezava ne obstaja, le-to vzpostavi.

V prvem koraku je potrebno pogledati UUID identifikator naše VPN povezave. To lahko storimo z naslednjim ukazom, ki izpiše seznam vseh VPN povezav, ki so shranjene v Upravitelju omrežnih povezav:

nmcli con list | grep vpn

Dobimo približno takšen izpis:

Moj VPN 8557bbb5-aadf-45aa-b72d-4265566a7341 vpn tor 18 sep 2012 22:33:55 CEST

V ukazni vrstici sedaj lahko to povezavo aktiviramo z naslednjim ukazom:

nmcli con up uuid 8557bbb5-aadf-45aa-b72d-4265566a7341

Skripta, ki preveri obstoj te VPN povezave in če povezava ne obstaja, le-to vzpostavi pa izgleda takole:

#!/bin/bash
 VPNCON=$(nmcli con status)
 if [[ $VPNCON != "Moj VPN" ]]; then
 echo "VPN povezava ne deluje, ponovno vzpostavljam povezavo..."
 (sleep 1s && nmcli con up uuid 8557bbb5-aadf-45aa-b72d-4265566a7341)
 else
 echo "VPN povezava deluje!"
 fi

Programske ukaze shranimo v neko datoteko s končnico .sh (npr. check_VPN.sh) ter datoteki nastavimo dovoljenje za izvajanje (desni klik na datoteko – Lastnosti, zavihek Dovoljenja, onačimo “izvedi“)

Na koncu v programu Scheduled tasks (programski paket gnome-schedule) nastavimo samodejno zaganjanje skripte npr. vsako minuto in samodejno vzpostavljanje VPN povezave v primeru izpada je nastavljeno.

Določanje smeri (ang. routes) v VPN omrežju

Določanje smeri (ang. routes) v VPN omrežju.

Z dodatnimi nastavitvami sicer lahko nastavljamo tudi omrežne poti v VPN omrežju. Poenostavljeno povedano lahko tako na strežniku, kot tudi na odjemalcu določimo ali bo OpenVPN strežnik za odjemalce služil kot privzeti prehod na internet, ali pa se bodo preko VPN strežnika odjemalci zgolj povezali v VPN omrežje (in s tem pridobili dostop do ostalih točk v omrežju).

Svet znotraj VPN omrežja

Ko smo enkrat povezani v VPN omrežje, naš računalnik poleg običajnega IP naslova pridobi tudi lokalni IP naslov VPN omrežja. Do posameznih računalnikov v VPN omrežju tako lahko dostopamo kar preko njihovih VPN IP naslovov, seveda pa mora požarni zid dovoljevati takšne povezave.

Svoj VPN IP naslov v Linuxu lahko pogledamo v ukazni vrstici (prikličemo jo s pritiskom na Ctrl-Alt-t) z ukazom ifconfig, ki mu kot parameter lahko podamo tudi ime omrežnega vmesnika (v primeru, da uporabljamo OpenVPN povezavo bo to verjetno tun0):

ifconfig tun0

Dobimo naslednji izpis, ki prikazuje naš VPN IP naslov (10.x.x.x):

tun0 Link encap:UNSPEC HWaddr 00-00-00-00-00-00-00-00-00-00-00-00-00-00-00-00
 inet addr:10.x.x.x P-t-P:10.x.x.x Mask:255.255.255.255
 UP POINTOPOINT RUNNING NOARP MULTICAST MTU:1500 Metric:1
 RX packets:0 errors:0 dropped:0 overruns:0 frame:0
 TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
 collisions:0 txqueuelen:100
 RX bytes:0 (0.0 B) TX bytes:0 (0.0 B)

Če vemo VPN IP naslove ostalih računalnikov v VPN omrežju lahko do njih zelo preprosto dostopamo znotraj VPN omrežja (seveda moramo biti povezani v VPN omrežje, od “zunaj” računalniki niso dostopni). Če v VPN omrežju teče lokalna DNS storitev (oziroma, če IP-je ostalih računalnikov v VPN omrežju vpišemo v datoteko /etc/hosts) pa lahko do teh računalnikov dostopamo kar preko običajnih domenskih imen, npr. “doma.vpn”, “filmi.vpn”, itd. Naj opozorimo, da lokalnim omrežnim napravam v VPN omrežju nikakor ne smemo dajati imen iz območja obstoječih domen (.si, .com,, .org…) saj takšno poimenovanje omogoča posebne vrste napadov s katerimi napadalec lahko pridobi dostop do naših storitev znotraj VPN omrežja. Lahko pa dodamo imena na izmišljenih domenah, npr. .local, .vpn, itd.. Podrobnosti o tovrstnih napadih so nekoliko bolj zapletene in bodo morda tema kakšnega drugega prispevka.

Ker se znotraj VPN omrežja ne vidi zunanjih IP-jev posameznih odjemalcev, lahko z dostopanjem preko VPN omrežja dosežemo tudi (sicer precej primitivno, a vendarle) skrivanje posameznih storitev ali vsebin pred končnimi uporabniki, saj le-ti pravega IP naslova in s tem prave lokacije posameznih točk v VPN omrežju ne vidijo.

Nekateri drugi sistemi tuneliranja omrežnih povezav

Za konec naj omenimo še tri sisteme tuneliranja omrežnih povezav in sicer SSH, IP preko DNS (ang. IP over DNS) ter P2P VPN sistem.

SSH

SSH oziroma Secure Shell je kriptografski omrežni protokol za varno izmenjavo podatkov preko omrežja. Protokol se uporablja prevsem v Linux, Unix, Mac in BSD svetu, omogoča pa povezovanje na oddaljene računalnike, prenos datotek, oddaljeno poganjanje aplikacij, itd. Obstajata dve različici SSH protokola (SSH-1 in SSH-2), danes se večinoma uporablja zgolj novejša.

SSH tunel znotraj VPN omrežja

SSH tunel znotraj VPN omrežja.

V Linuxu se na SSH strežnik (v bistvu je to posebna aplikacija, ki lahko teče  na kakršnemkoli Linux/Unix/BSD sistemu) lahko povežemo preko ukazne vrstice ali (po protokolu sftp) s pomočjo upravitelja datotek Nautilus (DatotekaPoveži se s strežnikom, izberemo tip povezave SSH). (Obstajajo tudi ssh in sftp odjemalci za Windows.)

Ko smo povezani na drug računalnik preko ukazne vrstice, le-tega lahko oddaljeno upravljeno, preko Nautilusa pa lahko na njega in iz njega na enostaven način prenašamo datoteke.

Pregledovanje datotek na drugem računalniku znotraj VPN omrežja

Pregledovanje datotek na drugem računalniku znotraj VPN omrežja.

Če se na oddaljeni računalnik preko ssh povežemo s parametrom -X, do oddaljenega računalnika pridobimo tim. grafični dostop preko SSH tunela. Če nato v ukazni vrstici na oddaljenem računalniku zaženemo neko grafično aplikacijo, se bo le-ta zagnala na oddaljenem računalniku, okno aplikacije pa bomo videli na našem trenutnem računalniku. Primer zagona brskalnika Firefox na oddaljenem sistemu:

ssh -X uporabnik@mojserver.si
firefox &

Pri povezovanju SSH preveri (avtenticira) oddaljeni strežnik, hkrati pa se moramo tudi mi avtenticirati oddaljenemu strežniku – na ta način so preprečeni napadi s posrednikom (tim. MITM napadi). Avtentikacija oddaljenega strežnika poteka tako, da lokalni SSH odjemalec preveri digitalni prstni odtis javnega ključa SSH strežnika. Avtentikacija uporabnika strežniku pa praviloma poteka z geslom, mogoče pa je izvesti tudi avtentikacijo (prijavo) s SSH ključem ali GPG šifrirnim ključem.

SSH povezovanje seveda deluje tudi znotraj VPN omrežja oziroma znotraj ostalih tunelskih povezav, torej lahko znotraj tunelske povezave vzpostavimo še en (dodaten) tunel.

SSH je sicer precej zmogljiv in omogoča izdelavo kompleksnih tunelov. Eden takih je npr. reverzni SSH tunel, ki omogoča povezavo na sistem, ki nima neposrednega dostopa do zunanjega omrežja (je npr. skrit za NAT-om ali se nahaja v zaščitenem omrežju, ki ne dovoli dohodnih povezav).

V takem primeru se iz tega sistema povežemo na nek zunanji sistem (vzpostavimo tunel navzven) in sicer na način, da preko tega tunela omogočimo povezovanje nazaj na izvorni računalnik. Naj navedemo zgolj hiter primer povezave uporabnika 1 na zunanji strežnik, iz tega strežnika pa se nato uporabnik 2 poveže na izvorni sistem):

ssh -R 2048:localhost:22 uporabnik1@mojzunanjistreznik.si

ssh -p 2048 uporabnik2@localhost

Mogoče so seveda še drugačne, bolj kompleksne povezave preko več sistemov z vzpostavljanjem kompleksnih tunelov.

IP preko DNS

Osnovna ideja IP preko DNS tuneliranja je vzpostavitev podatkovnega tunela za IP paketke preko DNS strežnikov. DNS (Domain Name System) je sistem domenskih imen, ki omogoča pretvorbo imen omrežnih virov oziroma domen v IP naslove. Naj omenimo, da obstajajo tudi drugi podobni sistemi IP tuneliranja (IP preko ICMP, itd.).

Na strežniški strani potrebujemo posebno aplikacijo, ki se navidezno obnaša kot običajen DNS strežnik, v resnici pa zna sprejemati in obravnavati preko DNS protokola posredovane podatkovne pakete. Na strani odjemalca pa potrebujemo ustrezno aplikacijo, ki omogoča vzpostavitev komunikacijskega tunela do našega “lažnega” DNS strežnika.

Takšna aplikacija je Iodine, ki omogoča vzpostavitev IPv4 tunela od odjemalca (našega računalnika) do našega modificiranega DNS strežnika. Iodine omogoča povezavo do strežnika z geslom, vendar moramo za dodatno varnost (šifriranje prometa) poskrbeti sami. Zaradi narave DNS protokola je navečja pasovna širina 1 Mb, en Iodine strežnik pa lahko uporablja do 16 uporabnikov. Na voljo je tudi Iodine dodatek za Upravitelja omrežnih povezav, vendar moramo dodatek iz izvorne kode prevesti sami.

P2P VPN sistem

Zadnji sistem tuneliranja omrežnih povezav, ki ga bomo omenili pa je BadVPN. Gre za odprtokodni P2P (peer-to-peer) VPN sistem, ki ga je razvil slovenski programer Ambrož Bizjak.

BadVPN omogoča povezave na tim. povezovalni plasti podatkovne povezave (ethernet) in sicer med različnimi VPN odjemalci (ang. peer), oziroma točkami v P2P omrežju (ang. node). Odjemalci se povežejo na centralni strežnik, katerega funkcija pa je zgolj povezovanje VPN odjemalcev med seboj. BadVPN omogoča UDP in TCP povezave, vgrajeno ima dvojno SSL šifriranje, in zna hitro razporejati bremena v primeru priključitve nove točke v omrežje. Z nekaj konfiguracije je tako mogoče izdelati povsem zaprto varno in robustno omrežje, ki omogoča varno komunikacijo med točkami v omrežju tudi v primeru izpada povezave med dvema točkama. Če pa ena izmed VPN točk služi kot prehod na internet ali v druga omrežja, pa lahko ostale VPN točke preko nje pridobijo tudi neoviran dostop do interneta.

Zaključek

Kot smo videli, je v Linuxu na voljo precej možnosti tuneliranja povezav oziroma povezovanja na različne vrste VPN strežnikov. S pomočjo VPN tehnologije lahko ustvarimo zasebna omrežja, v katerih si posamezni VPN odjemalci ali pa VPN točke neovirano in varno izmenjujejo podatke in storitve ali pa preko tuneliranih povezav neovirano dostopajo do interneta. Nastavljanje VPN odjemalcev s pomočjo dodatkov Upravitelja omrežnih povezav je v Linuxu razmeroma enostavno opravilo. Precej več znanja je sicer potrebno za postavitev VPN strežnika ali kakšno naprednejšo konfiguracijo omrežja, vendar to ni stvar domačih uporabnikov, pač pa sistemskih administratorjev z ustreznimi znanji.

Kategorije: Informacijska tehnologija, Informacijska varnost, Odprta koda
Ključne besede: mala šola informacijske varnosti, šifriranje, VPN