Tjänster så som Cloudflare Tunnel går att ersätta med Tor Onion Services med klientautentisering. På så sätt undviker man beroendet av amerikansk infrastruktur.

Tor

Stigmatiseringen kring Tor har gjort att det sällan används för annat än att tillfälligt surfa anonymt. Men faktum är att Tor är ett fantastiskt verktyg som går att använda till mycket mer än bara anonym surf och underjordiska webbsidor. Därför börjar vi med att gå igenom hur Tor fungerar, och vad skillnaden är mellan att bara surfa anonymt jämfört med att ansluta sig till Onion Services (tidigare kallat Hidden Services).

När man surfar på det vanliga internet (ofta kallat clearnet) via Tor, exempelvis med hjälp av Tor Browser, gör man det via en så kallad krets, eller circut på engelska.

Kretsen består av minst tre noder. Klienten ansluter först till en så kallad Guard. Denna guard-nod ansluter i sin tur till en annan nod inuti Tor-nätverket, en så kallad mellan-nod. Mellan-noden ansluter sedan till en Exit-nod. Det är denna exit-nod som gör anslutningen ut mot det öppna internet. Det kan vara många fler noder mellan exit-noden och mellan-noden, men detta är det minsta antalet, alltså tre noder.

Trafiken som går genom Tor-nätverket är alltid krypterad. Den enda gången man inte är skyddad av Tors egna kryptering är när man surfar till en vanlig webbsida på det öppna internet. Det vill säga när trafiken lämnar exit-noden. Däremot är det flesta webbsidor skyddade av HTTPS, så detta är normalt sett inget problem.

Surfa via Tor på det öppna internet

När vi däremot surfar in på en så kallad Onion Service med en .onion-adress lämnar vi aldrig Tor-nätverket. Här finns alltså ingen exit-nod inblandad. Det är däremot fortfarande tre noder mellan klienten och Onion-tjänsten.

Eftersom trafiken till en Onion Service aldrig lämnar Tor-nätverket är anslutning alltid krypterad – hela vägen från klienten till Onion-tjänsten. Detta gör att HTTPS inte behövs på en tjänst som körs som en Onion Service.

Surfa till en Onion-adress

Kryptering på Tor gör mer än bara skyddar från avlyssning. Den skyddar också anonymiteten. Det här är ordet Onion Routing kommer in i bilden. Krypteringen ligger i lager som en lök. Paketet som skickas från klienten till den slutgiltiga destinationen är krypterad med tre nycklar (eller fler), en för varje nod. Det är bara den första noden (guard-noden) som kan öppna sin kryptering med sin nyckel, eller sitt “skal”. När noden har har gjort det skickar den vidare paktet till nästa nod som öppnar sitt skal på löken, som sedan skickar vidare till det nästan nod. Ingen av noderna kan således se hela kedjan.

Förutom kryptering och anonymitet erbjuder Tor-nätverket ett extra lager säkerhet för Onion Services för den som önskar, nämligen klientautentisering. Det är en nyckel som placeras i Tor-tjänsten på en Onion Service. Utan den nyckeln går det inte ens att ansluta till tjänsten. Det är denna funktion som gör att vi kan använda Tor som en ersättare för tjänster som exempelvis Cloudflare Tunnel. Ingen kan ansluta till tjänsten utan rätt nyckel.

Tor Browser på datorn har fullt stöd för nycklar. Surfar man till en .onion-adress som kräver autentisering visas en dialogruta där man kan skriva in och spara nyckeln. Dessvärre saknar Tor Browser för Android för tillfället detta stöd, men utvecklarna arbetar på att implementera det. Mer information finns på deras Gitlab.

Det finns dock en nackdel som man bör känna till, och det är att Tor är ganska långsamt. Det beror på alla hoppen som görs mellan de olika noderna. Dessa noder hanterar dessutom en stor mängd trafik. Noderna kan dessutom vara placerade långt ifrån varandra. Exempelvis kan guard-noden vara i Tyskland, mellan-noden i USA och den tredje i Kina. Sedan därifrån ska trafiken till Onion-tjänsten som kanske ligger i Sverige.

Många som provar Tor för första gången tror att de har gjort något fel eftersom det är så långsamt. Men det är således helt normalt att Tor är långsamt. Men man får inte glömma att det är alla hoppen som Tor är så säkert.

Sätta upp en egen Onion Service

Nu när vi har lite teknisk bakgrund till hur Tor fungerar kan vi testa att sätta upp en egen Onion Service på Tor-nätverket. Det påminner mycket om att Sätta upp en egen IRC-server på darknet men är enklare eftersom Tor Browsern sköter hanteringen av klientnyckeln. Här kommer vi också att sätta upp flera tjänster i samma Onion Service.

Vi utgår från att servern kör Debian Linux. Stegen bör således fungera även för Ubuntu och andra Debian-utgåvor.

Vi börjar med att installera Tor-tjänsten på servern:

$ sudo apt install tor

När Tor är installerat skapar vi en Onion Service. I det här fallet vill vi ge åtkomst till två tjänster på servern, en webbserver på port 80 och InfluxDB på port 8086. Vi lägger därför till följande tre rader i filen /etc/tor/torrc.

HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:80
HiddenServicePort 8086 127.0.0.1:8086

Nu startar vi om Tor så att ändringarna träder i krafat:

$ sudo systemctl restart tor

Redan nu är vår Onion Service igång, dock utan en nyckel än så länge. För att ta reda på .onion-adressen skriver vi ut innehållet i filen /var/lib/tor/hidden_service/hostname.

$ cat /var/lib/tor/hidden_service/hostname
6yjffsdmowqdi5cd7wgofbj4gmjhuzl4cg4kz77vfne5orkxmqtzgtyd.onion

Skydda Onion Servicen med en nyckel

Nästa steg är att lägga till en nyckel så att ingen kan komma åt tjänsterna, förutom dem som har den rätta nyckeln. Det bästa är att skapa en nyckel åt varje person som ska ha tillgång till tjänsterna; då kan vi enkelt radera en nyckel om en person inte längre ska ha tillgång, eller om en nyckel hamnar på vift.

Först behöver vi installera paketet basez:

$ sudo apt install basez

Nu kan vi skapa en nyckel åt Kalle:

$ mkdir my-keys
$ cd my-keys
$ openssl genpkey -algorithm x25519 -out kalle.prv.pem

Därefter behöver vi ändra format på den privata nyckeln. Det är denna delen som Kalle kommer att använda för att ansluta till tjänsterna.

$ cat kalle.prv.pem | grep -v " PRIVATE KEY" | \
base64pem -d | tail --bytes=32 | base32 | \
sed 's/=//g' > kalle.prv.key

Det är alltså filen kalle.prv.key som vi behöver ge till Kalle för att han ska kunna logga in via sin Tor Browser.

Därefter skapar vi den publika nyckeln, den delen som ska placeras på servern för att skydda tjänsterna på vår Onion Service.

$ openssl pkey -in kalle.prv.pem -pubout | \
grep -v " PUBLIC KEY" | base64pem -d | \
tail --bytes=32 | base32 | sed 's/=//g' > kalle.pub.key

Det sista steget är att skapa själva auth-filen för Tor. Den har ett speciellt format. Vi skapar den med hjälp av följande kommando:

$ echo "descriptor:x25519:$(cat kalle.pub.key)" > kalle.auth

Det är denna filen, kalle.auth, som vi nu placerar i Tor för att skydda vår Onion Service från obehöriga:

$ sudo cp kalle.auth /var/lib/tor/hidden_service/authorized_clients/

Nu behöver vi starta om Tor:

$ sudo systemctl restart tor

Testa adressen och nyckeln i Tor Browser

Nu kan vi testa att komma åt de tjänster vi exponerade via vår Onion Service (port 80 och 8086) via Tor Browser. Vi surfar in på .onion-adressen som vi fick fram från /var/lib/tor/hidden_service/hostname.

Om allt har fungerat kommer vi att få se en dialogruta som ber oss om en nyckel. Här skriver vi in nyckeln som finns i filen kalle.prv.key.

Ange nyckeln till Onion Service

När vi har skrivit in nyckeln och klickat på OK kommer vi till den tjänst som vi exponerade via filen /etc/tor/torrc. Nu ser vi också Onion-ikonen direkt till vänster om adressfältet. Ikonen indikerar att anslutningen är säker och att det är en Onion Service vi befinner oss på.

En Onion Service visas med en ikon i adressfältet

För att nå den andra tjänsten, InfluxDB, som vi också exponerade via /etc/tor/torrc lägger vi till porten efter .onion-adressen med ett kolon, precis som för adresser på det vanliga öppna internet. Exempelvis:

…mowqdi5cd7wgofbj4gmjhuzl4cg4kz77vfne5orkxmqtzgtyd.onion:8086

På liknande sätt kan vi således lägga till fler tjänster i samma Onion Service genom att helt enkelt lägga till dem i /etc/tor/torrc. Det går även att lägga till tjänster som finns på en annan dator som servern med Tor-tjänsten kan nå. Exempelvis kan en /etc/tor/torrc se ut så här:

HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:80
HiddenServicePort 8086 127.0.0.1:8086
HiddenServicePort 8080 192.168.0.44:80
HiddenServicePort 8081 192.168.0.21:9090

Avslutande tankar

På detta sättet kan vi således byta ut tjänster som exempelvis Cloudflare Tunnel mot Tor. Hastigheten är den enda nackdelen, men det uppvägs av att Tor är decentraliserad till skillnad från Cloudflare. Egentligen är inte Tor heller helt decentraliserat, men från vårt perspektiv så kan vi kalla det för det.

En annan nackdel kan vara att distribuera nycklarna ifall det är många personer som ska ha tillgång till tjänsterna. Men för tjänster där man är ensam användare är det inget problem. Inte heller för mindre grupper på kanske fem personer. Men när vi börjar närma oss hela företag med hundratals personer blir det snabbt jobbigt.