teisipäev, 17. november 2015

Tor peidetud teenus

Tor tarkvara saab kasutada kolmel eesmärgil. Esiteks muidugi anonüümselt veebis surfamiseks (see ei ole küll 100% riskivaba, kergelt puudutasin seda probleemi oma eelmises postituses), teiseks Tor peidetud teenustele ligipääsuks ning kolmandaks nendesamade peidetud teenuste loomiseks. Kui esimesega on selge – Tor võrgu kaudu saab avada suvalise veebilehe nii, et veebiserver näeb ühenduse algatajana mõnd muud IP aadressi, kui see, mida tegelikult kasutad, siis teise kahega mitte niiväga.

Mis on üldse peidetud teenus?

Peidetud teenus on selline veebiserver, millele pääseb ligi ainult Tor võrgust. See tähendab, et veebilehele jõudmiseks ei ole vaja läbida nn. exit node'i ehk seda masinat, mille kaudu suunatakse liiklus ümber Tor võrgust vabasse võrku, sest veebiserver ise ongi sellisel juhul exit node'iks. Peidetud teenuse tunnuseks on *.onion domeeninimi. Selline domeeninimi ei lahendu tava-DNS abil, küll aga suudab sellise veebiserverini päringuid juhatada Tor paketis olev Onion ruuter.

Peidetud teenus on oluline kahel põhjusel – kõigepealt on exit node läbimine alati turvarisk, kuna seda võib pidada mõni pahatahtlik osapool (HTTP protokolli kasutamine võib seega olla läbi Tor'i isegi ohtlikum kui ilma Tor'ita, sest Tor võrgus on suurem tõenäosus kui tavavõrgus, et keegi vahepeal võrguliiklust pealt kuulab), tegu on siiski avatud proksiga. Teiseks põhjuseks on see, et peidetud teenus on, nagu nimigi ütleb, peidetud. Veebiserveri kasutaja ei saa kuidagi järgi vaadata, et mis IP aadressi taga veebiserver asub ja et kellele see aadress kuulub.

Viimast väidet tasub muidugi võtta terakese soolaga, sest mõningases ulatuses on siiski võimalik selliseid teenuseid deanonümiseerida, lisaks annab tihti serveri aadressi ära kehvasti seadistatud või turvaaukudega veebiserveri tarkvara, robustsemaiks näiteks oleks see kui Apache 404 leht on konfitud kuvama veateate jaluses veebilehe tegelikku hostname'i või IP aadressi.

Kuidas peidetud teenust teha?

Peidetud teenus ei ole tegelikult muu, kui Onion ruuteri seadistamine valitud domeeninime ruutimiseks täiesti tavalise veebiserveri pihta. Veebiserver ise ei pea seega Tor võrgust mitte midagi teadma, veebiserver kuulab nagu ikka mingil kindlal TCP pordil sisenevaid päringuid, et neid teenindada ja Tor ei puutu kuidagi asjasse. Trikk on selles, et veebiserveri võib seadistada võtma vastu päringuid ainult Onion ruuteri aadressilt (ehk kui Onion ruuter ja veebiserver asuvad samas masinas, siis tohiks veebiserver teenindada ainult päringuid mis algatatakse localhost aadressilt), sellisel juhul ei ole võimalik veebiserverile ligi pääseda tavavõrgu kaudu, küll aga Onion ruuteri kaudu.

Aitab lobisemisest, teeme ühe uue peidetud teenuse

Järgnev juhend kasutab Ubuntu 14.04 LTS operatsioonisüsteemi, kõik käsud käivitatakse root kasutaja õigustes ning eeldame, et meil on juba olemas mingi veebiserver (näites aadressil 127.0.0.1:80 ehk tava HTTP port localhostis), mida soovime serveerida peidetud teenusena.

Samm 1. Installime Onion ruuteri

Tor tarkvara saamiseks on meil vaja lisada Tor repositooriumi andmed. Näites kasutame Ubuntu versiooni 14.04, teiste operatsioonisüsteemide jaoks vajaliku info leiab Tor projekti kodulehelt.

Niisiis, lisame süsteemi Tor repositiooriumi ning sellega seotud GPG võtme info:
$ echo "deb http://deb.torproject.org/torproject.org trusty main
deb-src http://deb.torproject.org/torproject.org trusty main" >> /etc/apt/sources.list
$ gpg --keyserver keys.gnupg.net --recv 886DDD89
$ gpg --export A3C4F0F979CAA22CDBA8F512EE8CBC9E886DDD89 | apt-key add -
Järgmisena saame installida vajaliku tarkvara
$ apt-get update
$ apt-get install git build-essential libssl-dev tor deb.torproject.org-keyring
Kus

  • git on vajalik hiljem Shallot nimelise tarkvara laadimiseks (vaata allpool)
  • build-essential on vajalik Shallot'i kompileerimiseks
  • libssl-dev on samuti vajalik Shallot'i kompileerimisel
  • tor on Tor tarkvara, sh. Onion ruuter
  • deb.torproject.org-keyring on Tor'i võtmerõngas

Kui kõik õnnestub, on meil serveris töökorras Onion ruuter. Kuna kolmandatele rakendustele paistab see tavalise SOCKS5 proksina, võime selle katsetamiseks teha mõne päringu rakendusega curl
$ curl --socks5-hostname 127.0.0.1:9050 duskgytldkxiuqc6.onion
Mille tulemus võiks olla umbes selline:
<html>
<head><title>Example rendezvous points page</title></head>
...

Kui kõik õnnestus, siis järelikult saame teha Tor võrku väljuvaid päringuid, kuid meid huvitavad hetkel rohkem sisenevad päringud, seega peame edasi tegutsema.

Samm 2. Genereerime unikaalse .onion domeeni

Selle sammu võib ka vahele jätta, kuna vaikimisi genereerib Tor tarkvara ise vajaliku *.onion domeeninime, kuid automaatselt genereeritud nimed on kergelt öeldes mittemidagiütlevad nagu eelmises olnud duskgytldkxiuqc6.onion. Palju parem oleks ju kui saaksime selle nime ise valida.

Halb uudis on, et domeeninimi tuletatakse räsina salajasest võtmest, seega peabki see näima juhuslik. Hea uudis on, et veidi saame selle nime kuju siiski kontrollida – seda juhul kui genereerime nii palju erinevaid võtmeid, et lõpuks leiame sellise, kus räsi ongi soovitud kujul. Heaks näiteks oleks Facebooki onion domeen facebookcorewwwi.onion, kuid siin tuleb jälle üks halb uudis – iga täiendav sümbol kasvatab domeeni arvutamisele kuluvat aega eksponentsiaalselt. Seega kui sooviks on arvutada Facebooki laadse 15 sümboliga räsi (eeldame, et viimane, 16. sümbol "i" on juhuslik), kuluks selleks miljoneid CPU-aastaid, mis ei ole tavainimesele kättesaadavad, seega peame leppima vähemate sümbolitega, näiteks kuus kohta valitud teksti ja 10 suvalist sümbolit. Kuuekohalise stringi leidmine võtab kuni 30 minutit, 7-kohalise leidmine võtab terve päeva, 8-kohalise leidmiseks kulub terve kuu jne.

Tor peidetud teenuse domeeninime leidmisega tegeleb näiteks Shallot. Järgmisena hangimegi Shalloti ja proovime leida domeeninime, mis algaks 6-kohalise stringiga "andris".
$ git clone git://github.com/katmagic/Shallot.git
$ cd Shallot/
$ ./configure && make
Kui rakendus on kompileeritud, saame sobiva domeeninime leida järgmise käsuga (argumendiks on regulaaravaldis, seega ^andris tähendab, et sellised sümbolid peavad asuma domeeninime alguses):
$ ./shallot ^andris
Kui kõik õnnestub, peaks umbes poole tunni jooksul laekuma ka esimene vastus
-------------------------------------------------------------------
Found matching domain after 549741619 tries: andris23zrbn2da5.onion
-------------------------------------------------------------------
-----BEGIN RSA PRIVATE KEY-----
MIICXQIBAAKBgQC7PBSSwX8IoWAHevf25yry/IQYHWbEa05nBtSty9jAlxmNfZmy
jUcwJKZRZtzghyUgH04n7VwaQWOe8R0Vt6zIUOE+D8jGVhHj9Y/Sgy09e1AgiS2A
...eemaldatud read...
ISB3KXkCpvbdWThFACkCQQC2zfj+XlbFptT2FGou4jSAuKVukvnL/W0ZBDN7D1HT
nBMvIfOd4qt1sqGdXqocbI/DmCdsTWntHIUroj3bNwMX
-----END RSA PRIVATE KEY-----
Siit näeme, et Shallot on leidnud meile domeeninime kujul andris23zrbn2da5.onion ning sellele vastava salajase võtme.

Järgmiseks tuleks leitud domeeninimi lisada Tor konfiguratsiooni. Selle jaoks loome kataloogi, kus hakkavad asuma domeenime andmed
$ mkdir -p /var/lib/tor/hidden_service
$ echo "andris23zrbn2da5.onion" > /var/lib/tor/hidden_service/hostname
$ nano /var/lib/tor/hidden_service/private_key
Viimase käsu peale avaneb tekstiredaktor, sinna pasteerime siis salajase võtme ning salvestame faili.

Tor nõuab kindlaid piiratud failiõigusi, seega muudame failide omanikku ja õigusi
$ chmod -R 0700 /var/lib/tor/hidden_service
$ chown -R debian-tor:debian-tor /var/lib/tor/hidden_service
Nonii, nüüd ongi domeeninimi seadistatud ja saab minna järgmise sammu juurde.

Samm 3. Konfigureerime Tor HiddenService andmed

Praeguseks on kõik eeldused täidetud ja üle jääb vaid peidetud teenus aktiveerida. Selle jaoks modifitseerime torrc konfiguratsioonifaili.
nano /etc/tor/torrc
Otsime üles HiddenServiceDir ja HiddenServicePort väärtused ning eemaldame nende ridade eest kommentaarisümbolid #, nii et need read peaks failis olema järgmisel kujul
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:80
Esimene väärtus näitab ära kausta, kus asuvad domeeninimega seotud failid (kui seda kausta ei eksisteeri, genereeritakse see koos suvalise domeeninimega automaatselt). Teine näitab ära, et millisel siseneval pordil (näites port 80) võtab Onion ruuter päringuid Tor võrgust vastu ning millisele veebiserverile (näites localhost ehk 127.0.0.1:80) need päringud edastab.

Peale konfigureerimist jääb teha viimane liigutus, milleks on Tor teenuse taaskäivitus
$ service tor restart
Nüüdsest peakski olema valitud aadress Tor võrgu kaudu ligipääsetav.

Kui teenus on püsti, saame seda kontrollida ka ilma Tor brauserita. Sellisel juhul võime tavabrauseris avada veebilehe läbi onion.to veebiproksi. Näites kasutatud domeeni saab seega lahti aadressilt https://andris23zrbn2da5.onion.to/

Lõpetuseks

Nagu näha, ei ole peidetud teenuse seadistamises midagi ilmvõimatut. Kõige olulisem oleks, et meil on üldse mingi veebiserver, mida Tor võrku välja näidata. Samuti tuleks kindlasti väga hoolega jälgida serveri seadistust, et see ei annaks välja mingit infot serveri tarkvara ega ka server enda kohta, seega ei mingeid phpinfo() faile. Maha tuleks keerata X-Powered-By, Server ja muud seonduvad vastusepäised. Apache veebiserveri puhul tasuks üle vaadata ServerTokens ja ServerSignature seadistused, samuti ka Indexes valik, kuid kõige parem oleks üldse mitte Apachet kasutada. Nginx on tunduvalt parem, aga kõige mõistlikum oleks võibolla ehitada minimaalne staatilist sisu serveeriv Node.js põhine server, siis võib kindel olla, et kuskil ei ole kogemata jäänud mõni konfiguratsiooniparameeter korrektselt seadmata. Vastasel korral pole nagu erilist mõtet üldse peidetud teenust püsti panna, see ei oleks ju enam peidetud.

Kommentaare ei ole: