L’Invisible Internet Project (I2P) è un overlay network peer-to-peer completamente criptato, decentralizzato e distribuito.
La privacy è un diritto ed una resposabilità di ogni individuo. Il mercato aggressivo vuole far soldi su qualsiasi cosa possa essere venduta. Ma le offerte “popolari” (VPN in primis) per le comunicazioni private sono spesso una menzogna.
Questo accade per delle semplici ragioni:
- C’è un business dietro.
- Ogni imprenditore, anche quello animato dalle più buone intenzioni, deve comunque rispondere a terze parti ed in una situazione “pericolosa” metterà sempre davanti i propri interessi a quelli dei clienti.
In questo articolo parlerò di I2P, una “singolarità” per la privacy e l’anonimato online, dove nessuno, a parte voi, sa dove ed a chi vengono inviate informazioni.
La caratteristica di essere completamente decentralizzata fa si che non esista un unico “punto di fallimento”: Se un singolo nodo o anche la metà di tutti i nodi del network va offline I2P continuerà a funzionare fintanto che almeno tre nodi sono online.
I2P è peer-to-peer ed ogni utente della rete ha le medesime possibilità e diritti.
Questo articolo non vuol essere una guida a come scaricare, installare e configurare I2P. Cercando in rete materiale informativo su I2P in italiano che non fosse un sorta di “clicca qui e clicca li” ho trovato il nulla assoluto. In quei pochi articoli/guide che ho trovato si fanno solo vaghi accenni su come funziona I2P ed a volte anche riportando informazioni errate. In una seconda parte cercherò di trattare la parte “pratica” che comunque risulterà sicuramente più chiara dopo aver compreso il funzionamento di base.
Preferisco questo approccio cosiddetto “bottom-up” cioè partendo dai concetti di base per poi arrivare all’utilizzo pratico perchè ritengo che usare un software a “scatola chiusa”, qualunque esso sia, costituisca sempre un errore. Tanto più quando sia ha a che fare con software orientati alla sicurezza come I2P.
A differenza di tor, forse la più famosa delle reti anonime, I2P non è concepito per accedere ai normali siti Internet (anche se esiste questa possibilità), ma per accedere a vari tipi di servizi all’interno della rete stessa, come siti web anonimi (detti eepsites), torrent, IRC, XMPP, etc.
I2P non è un progetto di ricerca - accademico, commerciale o governativo - ma è invece uno sforzo ingegneristico volto a fare tutto il necessario per fornire un livello sufficiente di anonimato a chi ne ha bisogno. È in fase di sviluppo attivo dall’inizio del 2003 con uno sviluppatore a tempo pieno e un gruppo dedicato di collaboratori part-time provenienti da tutto il mondo. Tutto il lavoro svolto su I2P è open source e liberamente disponibile sul sito web, con la maggior parte del codice rilasciato direttamente nel pubblico dominio, pur facendo uso di alcune routine crittografiche sotto licenze di tipo BSD. Le persone che lavorano a I2P non controllano le modalità di rilascio delle applicazioni client e sono disponibili diverse applicazioni GPL. Il finanziamento di I2P proviene interamente da donazioni e, al momento, non gode di alcuna agevolazione fiscale in nessuna giurisdizione, poiché molti degli sviluppatori sono anonimi. I2P è ora alla versione 1.8.
Come funziona I2P
Panoramica e tunnel
Il primo termine con cui dobbiamo iniziare ad avere familiarità è router. In I2P con router si indica ogni partecipante della rete. Quando installate I2P sul vosto PC state di fatto diventando un router della rete.
La seguente immagine mostra come avvengono gli scambi fra i router della rete:
Non preoccupatevi se per ora vi sembra uno schema incomprensibile nel corso dell’articolo capirete il ruolo dei diversi elementi, ma prima di andare avanti:
Crittografia simmetrica ed asimmetrica
Esistono due tipi fondamentali di algoritmi di cifratura: simmetrici ed asimmetrici. Ad esempio l’algoritmo AES usato in tantissime applicazioni è un algoritmo simmetrico, RSA usato ad esempio in PGP è un tipico algoritmo asimmetrico.
Si, ma quale è la differenza?
Gli algoritmi simmetrici sono generalmente molto più veloci di quelli asimmetrici. Essi usano una singola chiave per la cifratura e la decifratura.
In pratica gli algoritmi simmetrici sono quelli a cui generalmente si pensa quando di parla di cifratura: una chiave segreta condivisa tra coloro che devono avere accesso all’informazione che viene usata der cifrare e decifrare. In internet o in generale nelle comunicazioni a distanza si pone il problema di come scambiarsi questa chiave segreta senza che essa sia intercettata con le conseguenze che si possono immaginare. I meccanismi di scambio delle chiavi esulano da questa breve trattazione potete approfondire la cosa su altre fonti, magari partendo da wikipedia se siete curiosi.
La cifratura asimmetrica usa invece due chiavi distinte: una chiave pubblica ed una chiave privata che sono correlate fra loro. Una cosa importante da dire è che la matematica assicura che se si è in possesso della chiave pubblica da questa non si possa risalire alla chiave privata ad essa associata. Nella cifratura asimmetrica ciascuna delle parti condivide con l’altro la propria chiave pubblica. Questa chiave pubblica sarà usata per cifrare il messaggio che si vuole inviare e che solo il possessore della relativa chiave privata potrà decifrare.
Gli algoritmi simmetrici però risultano molto più veloci di quelli asimmetrici nel cifrare/decifrare quindi ove le prestazioni sono importanti essi risultano la scelta migliore.
Esiste però un modo per sfruttare le caratteristiche di entrambi i sistemi ed è il seguente (semplificato):
Il mittente:
- Usa una cifratura simmetrica (AES256 ad esempio) per cifrare il messaggio.
- La chiave simmetrica usata nel passaggio precedente viene cifrata con la chiave pubblica del destinatario usando un algoritmo asimmetrico (ELGAMAL ad esempio)
- La chiave simmetrica criptata viene inviata insieme al messaggio.
Il destinatario:
- Riceve il messaggio criptato insieme alla chiave simmetrica criptata
- Decripta la chiave simmetrica usando la sua chiave privata
- Utilizza la chiave ottenuta per decifrare il messaggio criptato
Il vantaggio di questo schema è che la cifratura del messaggio, che può essere di grandi dimensioni (immaginate una foto in alta risoluzione o addirittura un video di svariati megabyte) avviene molto più rapidamente usando un algoritmo simmetrico mentre per cifrare la chiave simmetrica che è di pochi byte fissi (256bit=32byte nel caso di AES256) l’algoritmo asimmetrico, pur essendo più lento, impiega poco tempo. Inoltre con questo metodo è possibile cambiare la chiave simmetrica nel corso della comunicazione in modo che i messaggi precedenti siano criptati con una chiave diversa dai successivi. Oppure all’opposto è possibile inviare la chiave simmetrica solo all’inizio della comunicazione e riutilizzarla per cifrare i messaggi successivi risparmiando il passaggio di cifratura asimmetrica della chiave stessa.
Chiudo con un due importanti dettagli:
- Nel caso della cifratura simmetrica le operazioni di cifratura e decifratura sono intercambiabili: cioè se prendo un messaggio non cifrato e “lo decifro” usando una chiave alla fine risulterà “cifrato” quindi per “decifrarlo” posso usare la chiave per “cifrarlo” riottenendo di nuovo il testo in chiaro.
Faccio un esempio molto semplice per capire questo concetto che può apparire piuttosto “oscuro”:
Consideriamo il classico “cifrario di Cesare” (sì quel Cesare), che consiste nel cifrare un messaggio sostituendo ogni lettera con quella che segue di un certo numero di posizioni nell’alfabeto.
La chiave in questo caso è il numero di posizioni.
Per semplicità consideriamo una sola posizione: cioè A diventa B, B diventa C e cosi via.
La parola “CANE”, ad esempio, se CIFRATA diventerà “DBOF”.
Il ricevente sa che per DECIFRARE dovrà spostare indietro di una posizione e riotterrà la parola originaria. Ma se DECIFRO la parola “CANE”, cioè spostando all’indietro di una posizione ottengo “BZMD” quindi per decifrare quest’ultima dovrò CIFRARE spostando in avanti. In pratica le due operazioni sono intercambiabili. Questa proprietà viene ampiamente usata da I2P
- Analogamente negli algoritmi asimmetrici se cifro un messaggio con la chiave pubblica potrò decifrarlo solo con quella privata, ma posso scambiare le due chiavi e quindi cifrare con la privata per poi decifrare con la pubblica (meccanismo usato ad esempio nella firma digitale).
Nel primo caso inverto le operazioni di CIFRATURA/DECIFRATURA nel secondo inverto l’utilizzo delle chiavi.
Torniamo ad I2P
Ho fatto questa brevissima premessa sulla crittografia perchè è fondamentale per capire come I2P protegga la riservatezza delle comunicazioni. Innanzitutto diciamo che I2P, cosi come tanti altri sistemi crittografici, usa entrambi i tipi di crittografia per scopi diversi.
Ho già introdotto il significato del termine ROUTER nell’ambito I2P, specifichiamolo meglio:
Un router della rete i2P non è ne un client ne un server è soltanto un “nodo di transito” come altri. I router (cioè i computer della rete che eseguono il software I2P) si connettono l’uno all’altro non in modo anonimo. Ciò vuol dire che, pur utilizzando protocolli di comunicazione criptati chiamati NTCP2 e SSU rispettivamente equivalenti ai protocolli TCP ed UDP di internet, i router collegati conoscono i rispettivi indirizzi IP.
Il fatto di conoscere l’indirizzo IP di un altro router però non ci dice nulla oltre al fatto che sta usando I2P. Nessun altra informazione circa il traffico è nota: ne il contenuto ne la sorgente/destinazione del messaggio.
Per capire come sia possibile bisogna introdurre un secondo termine “DESTINATON” o “ENDPOINT”.
Una “DESTINATION” può essere un client o un server ma la sua sua ubicazione è sconosciuta.
Le destination sono create dall’amministratore del router. Il router continua a fare il suo lavoro come tutti gli altri smistando i dati che gli arrivano. Solo quando il dato in questione è destinato a se stesso invece di smistarlo lo gestisce localmente.
La seguente figura chiarisce meglio il concetto:
I tunnel
Il metodo grazie al quale I2P permette di mantenere l’anonimato sono i cosidetti TUNNEL. I TUNNEL sono una sequenza di router attravero i quali i dati in ingresso ed in uscita vengono veicolati: esistono due tipi di tunnel INBOUND (in ingresso) ed OUTBOUND (in uscita). A differenza di tor che usa un unico “circuito” per gestire i dati in entrata ed in uscita che quindi passano attraverso la medesima sequenza di nodi, I2P usa due set di nodi separati per i due compiti.
Nella figura vediamo i “classici” ALICE e BOB che comunicano tra loro tramite I2P. Come si vede ognuno ha due tunnel. Il tunnel di uscita di Alice comunica con quello di ingresso di Bob e viceversa.
Osserviamo ora quest’altra figura e scendiamo nei dettagli di come avviene questa comunicazione.
- a è detto Outbound Gateway ed in questo caso corrisponde al router di Alice.
- b e c sono detti Outbound Tunnel Partecipants. Possono essere uno o più ed il loro ruolo è quello di passare i messaggi al successivo router del tunnel.
- d è detto Outbound Endpoint. Si tratta del nodo finale del tunnel d’uscita di Alice ed il suo compito e di trasmettere il messaggio ad e.
- e è detto Inbound Gateway. Si tratta del punto di entrata del tunnel di Bob. Bob ha pubblicato l’indirizzo di questo router nel database della rete (che vedremo successivamente). Questo permette ad Alice di raggiungere una specifica destination gestita da Bob.
- f e g svolgono lo stesso ruolo di b e c. Nota importante: I partecipants non sanno se fanno parte di un tunnel di ingresso o di uscita. L’unica cosa che sanno è che devono passare il messaggio al router successivo.
- h infine è detto Inbound Endpoint. Si tratta semplicemente del router di Bob.
Entriamo nel Tunnel
Ora descriverò passo passo come i dati passano attraverso il tunnel, tenetevi forte, si parte!
- a cifra il messaggio con la chiave pubblica della destination gestita da Bob poi divide lo suddivide in una sequenza di messaggi più piccoli detti Tunnel Messages che hanno una dimesione fissa di 1024byte. Avere una dimensione fissa aiuta a prevenire certi tipi di attacchi (anche tor usa una dimensione del messaggio fissa pari a 512byte).
- a cifra ognuno dei Tunnel Messages prima con la chiave di d, poi cifra il risultato con quella di c ed infine con quella di b. Questo passaggio di fatto è la cifratura a “cipolla” (onion) o potremmo anche dire a strati. Le chiavi utilizzate sono chiavi simmetriche che sono state decise quando il tunnel è stato creato (vedremo in seguito questo passaggio). Nota bene: la cifratura avviene utilizzando la funzione “decifra” (Rileggete la parte sulla cifratura se non vi è chiaro).
- b riceve il messaggio, decifra lo “strato” che gli compete (usando la funzione “cifra”) e passa il messaggio a c
- c fa lo stesso e passa il messaggio a d
- d l’outbound endpoint per questo tunnel, dopo aver rimosso l’ultimo strato, riassembla il messaggio originale e lo invia ad e
- e l’Inbound Gateway divide di nuovo il messaggio in parti di 1024byte li cifra in sequenza ( stavolta usando la funzione “cifra”) e li passa ad f
- f riceve, cifra ed invia a g
- g riceve, cifra ed invia a h (Bob)
- h (Bob) decifra i messaggi nella sequenza opposta (g,f,e) poi, usando l’algoritmo asimmetrico, decifra il messaggio riassemblato con la sua chiave privata ottenendo il messaggio in chiaro e finalmente abbiamo finito!
Osservazioni
Ora, se avete prestato attenzione ai passaggi, potete capire il perchè dell’uso invertito delle funzioni di cifratura e decifratura: I tunnel partecipants cioè b e c in uscita ed f e g in ingresso usano tutti la funzione “cifra” e passano il messaggio al prossimo. Questo gli impedisce di capire se si trovano su un tunnel di ingresso o di uscita.
Mentre quelli nel tunnel di uscita stanno in realtà “decifrando” progressivamente il messaggio quelli del tunnel in ingresso lo stanno invece cifrando ma, siccome eseguono tutti la stessa operazione, non possono sapere se il messaggio che stanno passando e “in arrivo” o in “partenza”.
I partecipants inoltre non sanno se chi li ha preceduti era un altro partecipant o colui che ha creato il messaggio oppure se invece si tratta di un inbound gateway.
Analogamente non sanno se il successivo è solo un altro nodo partecipante, un endpoind di uscita oppure il destinatario finale.
Ecco il meccanismo che I2P usa per garantire l’anonimato e grazie alla cifratura asimmetrica end-to-end garantisce anche la riservatezza.
Database della rete e costruzione dei tunnel
Abbiamo parlato di tunnel, di gateway, destination ma come sono organizzate queste risorse? Come vengono trovati e selezionati i router che devono far parte dei nostri tunnel? Come trovo una “destination” ? In questo paragrafo vedremo appunto queste cose.
Un concetto importante da comprendere è il “network database” (o “netDb”) di I2P, una coppia di algoritmi utilizzati per condividere i metadati di rete. I due tipi di metadati trasportati sono “routerInfo” e “leaseSet”: il routerInfo fornisce ai router i dati necessari per contattare un particolare router (le sue chiavi pubbliche, gli indirizzi di trasporto, ecc.), mentre il leaseSet fornisce ai router le informazioni necessarie per contattare una particolare destinazione.
La struttura dati “routerInfo” contiene:
- RouterIdentity (una chiave pubblica di crittografia, una chiave di firma ed un certificato)
- Una lista di indirizzi internet a cui il router puo essere contattato (come ho detto all’inizio questi non sono un “segreto” in I2P)
- Una serie di opzioni
- La firma digitale di tutte queste informazioni che puo essere verificata con la chiave di firma contenuta nel routeridentity
Nel protocollo originale si usava esclusivamente l’algoritmo ELGAMAL per la cifratura asimmetrica e DSA per la firma. Ora questi due algoritmi vengono progressivamente sostituiti da algoritmi più moderni e veloci allo scopo di migliorare la sicurezza e le prestazioni.
Per i più curiosi: ECIES-X25519 per la cifratura ed EdDSA_SHA512 per la firma. Inoltre anche l’AES256 verrà sostituito con AEAD_ChaCha20_Poly1305.
Per costruire i propri tunnel in entrata e in uscita, Alice esegue una ricerca nel netDb per raccogliere questi routerInfo. In questo modo, avrà una lista di router che potrà utilizzare come hop (cosi sono definiti i router presenti in un tunnel, letteralmente “salti” ) nei suoi tunnel. Può quindi inviare un messaggio di costruzione al primo hop, richiedendo la costruzione di un tunnel e chiedendo a quel router di inviare il messaggio di costruzione in seguito, finché il tunnel non è stato costruito. Il messaggio di costruzione del tunnel contiene sia le chiavi per la cifratura a cipolla sia l’indirizzo del router successivo appartenente al tunnel.
Ma c’è un problema, che è comune a tutte le reti peer-to-peer, al primo avvio come sappiamo dove connetterci?
La rete tor risolve il problema con la centralizzazione (che a mio modesto parere ne crea uno più grande). C’è un “Directory Server” (in realtà sono 9 in tutto) a cui il client tor si connette per ottenere una lista di nodi per costruire il circuito.
I2P mantiene invece una natura più decentralizzata. All’avvio, se non si hanno almeno 25 routerinfo nel proprio database locale, il che accade la prima volta che lo avviate, il software I2P si collega ad un “reseed server”. Un reseed server è un router I2P ma che esegue anche un server https. Semplificando al massimo: un reseed è un router I2P che raccoglie informazioni sui router come gli altri ma li archivia in un file zippato e firmato dopodichè mette queto file a disposizione degli altri su una “normale” commessione https. Esistono vari reseed server che possono essere configurati nel vostro router. Essi sono mantenuti da volontari e volendo chiunque con il know-how nonchè i requisiti hardware e di rete necessari può mettere su un reseed server e richiedere di metterlo a disposizione della rete. Inoltre è possibile anche specificare un determinato router “normale” al quale connettersi per recuperare i routerinfo o usare una lista precedentemente salvata.
Una volta ottenuta questo primo gruppo di routerinfo (con un dei diversi metodi) il vostro router I2P continuerà ad accumularne altri in modo da averli a disposizione. Questo viene fatto scambiando le info con i router a cui ci connettiamo direttamente e richiedendo i routerinfo a dei router “speciali” chiamati Floodfill. Qualsiasi partecipante alla rete I2P può agire da floodfill (anche voi stessi) basta configurare il router, avere una banda sufficiente ed una presenza online sulla rete I2P che sia il più possibile costante.
Esistono diversi meccanismi per distribuire la lista dei router all’interno della rete ed evitare situazioni “spiacevoli” facendo anche uso di algoritmi tipo DHT e Kademlia. Senza scendera nei dettagli vi basti sapere che sia i routerinfo che i leaseset vengono richiesti ai vari router floodfill ogni volta che se ne ha bisogno secondo uno schema che cerca di ottimizzare al massimo questa operazione.
Una volta ottenuti un certo numero di routerinfo I2P li usa per “costruire” diversi tunnel. Il meccanismo di costruzione del tunnel assicura che nessuno dei partecipanti al tunnel conosca tutti gli altri ne quanto è lungo il tunnel (può variare da 0 a 8). I tunnel di ingresso vengono costruiti a partire da quelli di uscita.
Ok ora che abbiamo la nostra bella lista di router e che abbiamo costruito i tunnel siamo pronti per operare nella rete I2P. Per questo motivo, dopo aver avviato I2P, è consigliabile aspettare almeno qualche minuto per consentirgli di effettuare queste operazioni preliminari. I tunnel verranno poi creati e distrutti di continuo, ciascun tunnel ha una “vita” di 10 minuti.
Leaseset
L’altra struttura dati contenuta nel netDB é il LEASESET. Un leaseSet contiene un certo numero di “lease” ed ognuno di questi lease specifica un tunnel inbound gateway che consente di raggiungere una destinazione specifica. I leaseset sono usati per individuare le “destination”. Una destination puo essere un client o un server. La struttura di un Leaseset é simile a quella dei routerinfo:
- Destination (chiave pubblica, chiave di firma, certificato)
- Una chiave pubblica per la cifratura end-to-end
- Una lista di lease
Ciascun lease contiene a sua volta:
- L’indirizzo de tunnel gateway dove la destination puo esser contattata
- il tunnel ID che individua lo specifico tunnel: un router può partecipare a diversi tunnel qundi è necessario un modo per distinguerli.
- La data di pubblicazione sul netDB. I tunnel scadono dopo dieci minuti quindi anche questo campo è importante
Come si puo vedere un leaseset fornisce tutte le informazioni necessarie per raggiungere una particolare destination ma senza sapere su quale router “finale” si trovi.
Per capire meglio, in conclusione di questo lungo articolo, immaginiamo uno scenario in cui vogliamo connetterci ad un eepsite, cioè un sito web “nascosto” di I2P :
Il gestore del sito configura I2P affinchè esso crei una destination associata al server web (apache, nginx, altri). Una volta avviato I2P vengono creati i tunnel di ingresso ed uscita verso la destination. I2P pubblica il leaseset per la destination nel NetDB. La chiave di ricerca di questo leaseset sarà l’hash della destination contenuta nel leaseset che quindi sara recuperabile tramite un indirizzo del tipo:
udhdrtrcetjm5sxzskjyr5ztpeszydbh4dpl3pl4utgqqw2v4jna.b32.i2p/
La parte che precede “.b32.i2p” è proprio l’hash del leaseset rappresentato in codifica ascii base32. Il leaseset contiene la lista di “lease” che forniscono gli indirizzi degli “inbound gateway” dei tunnel associati alla destination. La differenza sostanziale rispetto ad un “normale” sito web è che l’indirizzo IP del router che esegue il server web non è noto.
Iniziando ad utilizzare I2P molto probabilmente noterete indirizzi più “umanamante comprensibili” cioè del tipo “nomesito.i2p” essi vengono tradotti negli indirizzi I2P con un sistema che ricorda (lontanamente) il DNS di internet. Anche in questo caso I2P rispetta la decentralizzazione, non esiste una gerarchia DNS, esistono invece siti I2P, sempre gestiti da volontari, che tengono un elenco in cui gli indirizzi in base32 sono associati ai nomi. Questi siti sono chiamati “jump services”. Prima di ricorrere ad un jump service il vostro router I2P effettua un controllo locale nel vostro personale “Address Book” che, per farla semplice, funziona un po come il file hosts presente sia sui sistemi Linux che in Windows. Siccome l’associazione tra un nome e una destination non è soggetta ad alcun controllo centrale i jump services devono essere fidati altrimenti potrebbero contenere associazioni fasulle. Inoltre potrete anche dare voi stessi un nome ad una destination che però varrà soltanto per il vostro router.
A questo punto il gestore del sito può pubblicare questo indirizzo “speciale” su una chat, un forum oppure registrare un nome su un jump service altro per renderlo pubblico.
Chi volesse collegarsi all’eepsite innazitutto deve eseguire il software del router I2P. Di default I2P avvia un proxy http e crea una destination associata ad esso per permettere a software come i browser di connettersi tramite I2P. Questo avviene perchè ovviamente il vostro browser, qualunque esso sia, non può “dialogare” direttamente su I2P quindi deve farlo tramite un proxy eseguito sulla vostra stessa macchina configurato nelle impostazioni del browser.
Il fatto che venga creata una “destination” per il client è necessario in quanto la comunicazione deve essere bidirezionale: l’eepsite deve sapere a chi inviare la pagina web dopo aver ricevuto la richiesta e il client deve restare anonimo a sua volta. Il leaseset del client non viene pubblicato ma solo inviato insieme alla richiesta al server per permettergli di rispondere.
Quindi dopo aver configurato il browser per utilizzare il proxy di I2P basta inserire l’indirizzo come si fa normalmente e il software I2P fara tutto il lavoro cioè:
- Recupera il leaseset dal netDB usando l’indirizzo come chiave di ricerca
- Inoltra la richiesta del vostro browser attraverso la rete I2P utilizzando le informazioni contenute nel leaseset
- Ricevuta la risposta la inoltra al vostro browser che visualizzera la pagina richiesta come un normale sito web
CONCLUSIONE
Se siete arrivati fin qui avrete capito che ottenere privacy ed anonimato su Internet è davvero un’impresa difficile. Dobbiamo solo ringraziare tutti coloro che mettendo a disposizione le proprie capacità e conoscenze cercano di realizzare questo arduo scopo. In un prossimo articolo parlerò della parte “pratica” di I2P cioè di come installare e configurare il router IP2, intanto spero che questo lungo articolo vi sia stato utile per compredere non solo I2P ma anche la complessità che c’è dietro.
Nuke