24.7.2 Navigazione anonima

Per quanto riguarda la navigazione, anch’essa può essere resa anonima, ma il meccanismo che rende anonima la comunicazione è un po’ meno robusto perché la latenza della stessa deve essere molto bassa in quanto la navigazione è un servizio interattivo. Per bassa latenza si intendono quelle comunicazioni che avvengono in maniera interattiva, ovvero in cui l’utente non deve essenzialmente attendere più di qualche decina di secondi o al massimo qualche minuto per avere una risposta.

I concetti qui esposti sono comunque applicabili a tutti i servizi con bassa latenza (SSH, Instant Messaging, ...).

24.7.2.1 TOR

Si tratta di un’infrastruttura che permette la creazione di circuiti a bassa latenza per rendere anonime le comunicazioni che si basano sul TCP.11 Il client per collegarsi ad un server crea un circuito composto da nodi (macchine TOR) ognuno dei quali conosce soltanto quello precedente ed il successivo. Le informazioni viaggiano in maniera cifrata (AES a 128 bit, RSA e SHA-1)12 all’interno di pacchetti, detti celle, che contengono vari strati incapsulati l’uno nell’altro (analogamente a quanto avviene tra i livelli dello stack TCP/IP) ed ogni nodo estrae l’involucro più esterno, operando sul payload, il quale viene eventualmente inoltrato al nodo successivo. Da qui il nome TOR: The Onion Router (l’instradatore di cipolle13).

Ogni nodo (Onion Router - OR) mantiene una connessione TLS14 con altri OR. L’utente che vuol utilizzare la rete TOR deve avere a disposizione un apposito client, detto Onion Proxy (OP).

Ogni cella ha una dimensione fissa di 512 byte e si compone, come illustrato nella fig. 24.2, di un identificatore di circuito (CircID), un comando (Command) che indica l’operazione da effettuare sul campo successivo (Data) contenente l’informazione vera e propria.


pict
Figura 24.2: La cella di comunicazione di TOR.

I possibili comandi sono riportati nella tab. 24.5.


Command-----|Valore-|Significato------------------------------------|
Padding------|--0---|Il payload non viene considerato-----------------|
Create       |  1   |Il payload contiene il challenge dell’handshake        |
Created      |  2   |Il payload contiene la risposta all’handshake        |
Relay        |  3   |Il payload contiene una cella da inoltrare         |
DeCrsteartoeyfast  |  45   |Il payload contiene informazioni sulla chiusura delcircuito
Created-fast----6--------------------------------------------------

Tabella 24.5: I possibili comandi contenuti nelle celle di TOR.

Per quanto riguarda le celle con comando Relay, il campo Data viene a sua volta suddiviso in vari campi, in cui i primi forniscono ulteriori informazioni al ricevente sulle operazioni da effettuare sul payload in esso presente.


pict
Figura 24.3: Esempio di comunicazione con TOR.

Si supponga che il client A voglia navigare sul server B. La creazione del circuito virtuale tra A e B avviene seguendo i seguenti passi (v. fig. 24.3):

  1. A richiede ad un apposito server, detto directory server, l’elenco degli Onion Router disponibili sulla rete e ne seleziona un certo numero (OR1, ..., ORn - generalmente 3) che rappresentano i nodi che costituiranno il circuito della comunicazione, in modo tale che un nodo non compaia nel circuito più di una volta.
  2. A invia a OR1 una cella contenente il comando Create ed un CircID1 non già utilizzato per la comunicazione con OR1, assieme alla propria parte della chiave di sessione Diffie-Hellman cifrata con la chiave pubblica di OR1. A questo punto OR1 stabilisce una connessione con A e gli ritorna una cella che glielo notifica contenente la sua parte di chiave di sessione (in chiaro) e l’hash della chiave completa. A ed OR 1 conoscono così una chiave (simmetrica) di sessione K1 con la quale cifrare la loro comunicazione.
  3. A invierà un’opportuna cella ad OR1, cifrata con la chiave K1, richiedendo l’estensione del circuito, ovvero con il comando Relay con CircID1. Il campo Data di questa cella conterrà ulteriori indicazioni in chiaro per OR1, come il fatto che si richiede l’estensione (extend) del circuito verso OR2, oltre alla parte di chiave di sessione Diffie-Hellman di A, cifrata con la chiave pubblica di OR2. Quando OR 1 riceverà tale cella, scarterà l’header ed invierà ad OR2 una nuova cella con il comando Create, un CircID2 ed il payload costituito dalla parte cifrata del payload ricevuto. Quindi OR2 creerà una connessione con OR1 (non avrà nessun riferimento di A) e ritornerà a quest’ultimo (in chiaro) la sua parte di chiave di sessione con l’hash della chiave completa. Quindi OR1 invierà ad A, cifrata con chiave K1, una cella contenente il comando Relay e CircID1, il cui payload contiene un sottocomando extended che notifica l’avvenuta estensione del circuito, la parte della chiave di sessione di OR2 e l’hash della chiave completa. Così A e OR 2 conosceranno la chiave (simmetrica) di sessione K2 con la quale cifrare la loro comunicazione. E così via.

Una volta che il circuito è stabilito, A potrà comunicare con B in maniera anonima. I pacchetti da inviare vengono incapsualti da A all’interno di apposite celle con comando Relay e spediti a OR1, il quale troverà nel relativo campo Data informazioni sul fatto che le informazioni contenute nel payload devono essere inoltrare ad OR2. Quindi OR1 crea un’apposita cella di Relay contenente al proprio interno il payload ricevuto e la invia a OR2. E così via. Quando riceve la cella, ORn invia il payload in chiaro a B. Quindi B vedrà arrivare dall’ORn (di frontiera) i vari messaggi inviati da A. I messaggi che verranno inviati da B a ORn, saranno recapitati ad A attraverso il circuito virtuale creato in precedenza, in maniera analoga a quanto descritto in precedenza.

Quando A ha terminato la comunicazione con B, invierà una cella a OR1 contenente il comando Destroy, che indica di distruggere il circuito virtuale precedentemente creato.

Questo tipo di meccanismo garantisce l’anonimato in avanti cioè A non è conosciuto da B mentre A conosce B. TOR permette anche di creare una comunicazione in cui sia garantito l’anonimato in entrambi i sensi, cioè facendo in modo che A e B non si conoscano l’un l’altro. Per realizzare tale meccanismo, l’infrastruttura di TOR permette di definire dei servizi nascosti (location-hidden service o respoder anonimity). Il server B può crearsi, per mezzo della generazione di una propria coppia di chiavi asimmetriche, un alias fittizio, l’indirizzo nascosto, del tipo h5ty6ubcxg98jhg.onion (che non è un URI valido), e notificarlo ad un directory server. In realtà B comunicherà al directory server anche i server TOR che possono accedere a lui, i cosiddetti introduction point (punti di introduzione). Il directory server funge da DNS15 per raggiungere il server B nel modo seguente:

  1. A partire da un indirizzo nascosto, A crea un circuito virtuale fino a raggiungere uno degli introduction point, indicando un server TOR come rendezvous point (server di incontro). Inoltre A creerà un circuito virtuale per raggiungere il server scelto come rendezvous point.
  2. L’introduction point notificherà a B che qualcuno si vuol collegare ad esso e lo informerà del rendezvous point.
  3. Il server B creerà un circuito virtuale fino a raggiungere il rendezvous point.

A questo punto A e B possono comunicare tra loro attraverso il circuito TOR che passa per il rendezvous point, senza conoscersi l’un l’altro.

È opportuno mettere in evidenza che TOR implementa un’infrastruttura che rende anonima la comunicazione TCP. Per ottenere una comunicazione anonima utilizzando protocolli di più alto livello, come l’HTTP, è opportuno inserire un ulteriore sistema di filtraggio, come Privoxy16 (in questo caso i pacchetti devono essere fatti passare dalla porta 8118, sulla quale è in ascolto Privoxy). Inoltre il proxy server utilizzato deve essere opportunamente configurato per funzionare con l’infrastruttura di TOR, cioè deve inoltrare le richieste verso l’Onion Proxy, che è un proxy di tipo SOCKS 4A, in ascolto sulla porta 9050.

[da completare ...]