TOR: Configurare hidden service con autenticazione

(pubblicato il 22 luglio 2021) The Onion Services Fonte: TorProject: The Onion Services

I Tor Onion Service (hidden service) sono di tipo V3. I servizi di tipo V2 sono deprecati da luglio 2020 e da ottobre 2021 verranno completamente rimossi dalla rete onion (rif. https://blog.torproject.org/v2-deprecation-timeline)

1. Configurazione lato server

Tor ha il suo file di configurazione in /etc/tor/torrc mentre la sua workdir, normalmente è su /var/lib/tor

Ogni hidden service viene riferito nel file di configurazione di tor, /etc/tor/torrc, da almeno una coppia di direttive:

1.1. HiddenServiceDir

Gli oggetti presenti in questa cartella sono:

1.2. HiddenServicePort

È una tripla

<porta_tor> <hostname>:<listen_port>

hostname di norma non è altri che localhost.

Una volta esplicitato l’HiddenServiceDir (l’HiddenServicePort è meno rilevante. A Tor non interessa che ci sia un servizio in ascolto effettivo), il riavvio del servizio Tor, creerà gli oggetti menzionati prima.

Se non ci fosse autenticazione, il client che accede alla rete Tor potrebbe già contattare il servizio esposto senza alcuna altra configurazione.

Se invece i client devono essere riconosciuti, sono richiesti altri passi di configurazione.

2. Configurazione lato client

2.1. Configurazione di /etc/tor/torrc

Inserire la direttiva ClientOnionAuthDir col path contenente i file di autenticazione per l’accesso agli hidden service

2.2. Creazione delle chiavi di autenticazione

Per ogni hidden service, si deve creare una coppia di chiavi x25519 pubblica e privata necessarie per l’autenticazione di ogni utente.

Le chiavi, generate con openssl e basez, sono di tipo x25519 in base32.

2.2.1. Chiave pubblica

La chiave pubblica andrà posizionata sul server nella cartella [HiddenServiceDir]/authorized_clients.

La sintassi del file dovrà rispettare questa forma: descriptor:x25519:<chiave pubblica x25519 in base32>

e il nome file dovrà essere <nome file>.auth

2.2.2. Chiave privata

La chiave privata andrà posizionata nel client nella cartella indicata da [ClientOnionAuthDir].

La sintassi del file dovrà rispettare questa forma: <indirizzo servizio onion senza estensione>:descriptor:x25519:<chiave privata x25519 in base32>

e il nome file dovrà essere: <nome file>.auth_private

Per rendere effettive le modifiche sul file torrc, sia sui client che sul server, si deve riavviare il servizio Tor.

3. Configurazione reale di due hidden service: web e ssh

Supponiamo per esempio di voler creare due hidden service: web e ssh

3.1. Creazione delle chiavi

1. Generazione della chiave openssl x25519

# web
openssl genpkey -algorithm x25519 -out /tmp/web.prv.pem
# ssh
openssl genpkey -algorithm x25519 -out /tmp/ssh.prv.pem

2. Generazione della chiave privata base 32

# web
cat /tmp/web.prv.pem | grep -v " PRIVATE KEY" | base64pem -d | tail --bytes=32 | base32 | sed 's/=//g' > /tmp/web.prv.key
# ssh
cat /tmp/ssh.prv.pem | grep -v " PRIVATE KEY" | base64pem -d | tail --bytes=32 | base32 | sed 's/=//g' > /tmp/ssh.prv.key

3. Generazione della chiave pubblica base 32

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

3.2. Configurazione lato server

Convenzioni:

Le seguenti convenzioni hanno il solo scopo di dare uniformità e scalabilità alla configurazione del servizio.

  1. Creazione di una cartella diversa per ogni servizio esposto così da avere autenticazioni distinte per servizio e per utente.
  2. Nella cartella del servizio, all’interno di authorized_clients, dove andranno posizionate le chiavi pubbliche, il nome delle chiavi sarà nel formato: <nome utente>_<nome servizio>.auth

3.2.1. Creazione cartelle per gli hidden service

# HTTP
mkdir -p /var/lib/tor/hidden_service/web/authorized_clients
chown -R toranon:toranon /var/lib/tor/hidden_service/web
 
# SSH
mkdir -p /var/lib/tor/hidden_service/ssh/authorized_clients
chown -R toranon:toranon /var/lib/tor/hidden_service/ssh

3.2.2. Configurazione /etc/tor/torrc

vi /etc/tor/torrc

...
HiddenServiceDir /var/lib/tor/hidden_service/web
HiddenServicePort 1080 127.0.0.1:80
 
HiddenServiceDir /var/lib/tor/hidden_service/ssh
HiddenServicePort 2022 127.0.0.1:22
...

Una considerazione sull’esposizione dei servizi. In questo esempio, i servizi girano sull’interfaccia di loopback ed ho imposto che le porte di esposizione del servizio siano quelle canoniche mentre sui corrispettivi .onion, da utilizzare attraverso i client, le porte sono non standard.

# Inizializzazione del servizio Tor per creare gli oggetti necessari all'esposizione, in particolare dell'hostname .onion
systemctl restart tor

3.2.3. Creazione file .auth e riavvio tor

# web
echo "descriptor:x25519:" > /var/lib/tor/hidden_service/web/authorized_clients/utente1_web.auth
cat /tmp/web.pub.key >> /var/lib/tor/hidden_service/web/authorized_clients/utente1_web.auth
 
# ssh
echo "descriptor:x25519:" > /var/lib/tor/hidden_service/ssh/authorized_clients/utente1_ssh.auth
cat /tmp/ssh.pub.key >> /var/lib/tor/hidden_service/ssh/authorized_clients/utente1_ssh.auth
	
# reload delle configurazioni e delle chiavi
systemctl restart tor 

3.3. Configurazione lato client

3.3.1. Convenzioni

  1. Creazione di una cartella in cui raccogliere le chiavi private dell’utente
  2. Il nome della chiave sarà: <nome utente>_<nome servizio>.auth_private

3.3.2. Creazione cartella per l’autenticazione

# SSH
mkdir /var/lib/tor/hidden_service/client_onion_auth
chown toranon:toranon /var/lib/tor/hidden_service/client_onion_auth

3.3.3. Creazione file .auth_private

# web
cat /var/lib/tor/hidden_service/web/hostname | cut -d "." -f 1 > /var/lib/tor/hidden_service/client_onion_auth/utente1_web.auth_private
echo ":descriptor:x25519:" >> /var/lib/tor/hidden_service/client_onion_auth/utente1_web.auth_private
cat /tmp/web.priv.key >> /var/lib/tor/hidden_service/client_onion_auth/utente1_web.auth_private
 
# ssh
cat /var/lib/tor/hidden_service/ssh/hostname | cut -d "." -f 1 > /var/lib/tor/hidden_service/client_onion_auth/utente1_ssh.auth_private
echo ":descriptor:x25519:" >> /var/lib/tor/hidden_service/client_onion_auth/utente1_ssh.auth_private
cat /tmp/ssh.priv.key >> /var/lib/tor/hidden_service/client_onion_auth/utente1_ssh.auth_private

3.3.4. Configurazione /etc/tor/torrc e riavvio tor

Nel file /etc/tor/torrc si deve modificare la direttiva ClientOnionAuthDir:

...
ClientOnionAuthDir /var/lib/tor/hidden_service/client_onion_auth
...

Dopodiché si riavvia il servizio tor per rendere consistente la modifica:

# Reload del servizio e acquisizione delle chiavi
systemctl restart tor

4. Conclusione

I servizi ora sono pronti per essere fruiti.

Nel caso del servizio web, non è necessaria la configurazione lato client di tor se si usa Tor Browser.

Per accedere in ssh attraverso tor si può provare in paio di modi.

1) Usando l’utility torify, normalmente installata insieme a tor:

torify ssh -p2022 user1@ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion

2) Direttamente in ssh usando ProxyCommand per veicolare la connessione ssh attraverso tor:

ssh -p2022 user1@ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion  -o ProxyCommand="ncat --proxy 127.0.0.1:9050 --proxy-type socks5 ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion 2022"

tips: Usando una configurazione opportuna in $HOME/.ssh/config, l’utilizzo del servizio si semplifica notevolmente.

In .ssh/config:

Host ssh_service.onion
    Hostname ahl5pohtheefai4apho4aiy6ohwaengo6ooxoh3ijie9ohgiish4phai.onion
    User user1
    Port 2022
    VerifyHostKeyDNS no
    ProxyCommand ncat --proxy 127.0.0.1:9050 --proxy-type socks5 %h %p

A questo punto per accedere in ssh basta: ssh ssh_service.onion

Note a margine:

  1. Il sistema di riferimento è Fedora 34
  2. A differenza di SO debian-based, sui repository di Fedora 34 basez non è disponibile e va compilato.
  3. La configurazione e l’hardenizzazione dei servizi da “torificare” esula dallo scopo di questo articolo, così come il dettaglio della configurazione di Tor

Riferimenti:

#clientauthorization #hiddenservice #ssh #tor #torify