![bg](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/freenetlogo.png) # Freenet --- ## Cos'è Freenet? Freenet è una **rete peer-to-peer decentralizzata**, progettata per: * Resistere alla censura * Proteggere l'**anonimato** * Rispettare la libertà di espressione --- ## Cenni Storici * Fondazione: **paper** di Ian Clarke, 2001 Il paper contiene le basi del protocollo Freenet, tuttora in sviluppo continuo. Dal 2008 [**Freenet 0.7**] è divisa in **Opennet** e **Darknet**, supporta l'implementazione **open source** di JDK [**OpenJDK**] e supporta sia su TCP che su UDP a livello di trasporto. --- ## Punti Chiave * Anonimato per **produttori e consumatori** di informazioni * **Resistenza** a tentativi di terze parti di **negare accesso** ai contenuti * Proteggere l' **anonimità dei dati salvati nei nodi** * Implementare **archiviazione e routing** in maniera **dinamica** ed **efficiente** * **Decentralizzare** tutte le funzioni della rete --- ![bg](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/freenetlogo.png) # Architettura --- ## Freenet = Rete di Nodi Freenet è un network P2P **adattivo**, costituito da nodi che effettuano richieste ad altri nodi per salvare e ottenere **data files**. * Tutti i nodi sono **uguali** e comunicano **solo con i nodi prossimi** * Ogni nodo mantiene uno **spazio di archiviazione locale** che **condivide** con gli altri nodi * I data files sono indicizzati da **chiavi indipendenti dalla localizzazione** *[location-independent keys]* --- ## Indirizzi Gli indirizzi dei nodi sono composti da: * Metodo di trasporto * Identificatore di trasporto specifico *[IP + porta]* Anonimato e modifica di indirizzi si ottengono con le **Address Resolution Keys** (o **Updatable Subspace Keys**), contenenti l'**indirizzo corrente** del nodo. Le ARK permettono di superare alcuni firewalls, NAT e blocchi su IP. USK@<...key...>/path/to/webpage --- --- ## Richieste * Richiesta = **payload di un self-contained message** * Richiesta = **Ricerca di una chiave** corrispondente al data file da ottenere tra i nodi della rete. *[Key-Based Routing]* La procedura di richiesta avviene come una **catena di proxy requests** divisa in step. Ogni nodo **decide dove indirizzare la richiesta** durante lo step successivo. --- ## Struttura di un messaggio * **ID** pseudo-unico e **casuale**, che permette ai nodi di evitare i loop di richieste. * Numero di **Hops-To-Live** *[HTL]*, simili al Time-To-Live di IP ma basati sul numero di hop. Servono ad **evitare catene di richieste infinite**. * **Profondità**, incrementata ad ogni hop. * **Payload** della richiesta / risposta. Il processo di passaggio delle richieste continua finchè la richiesta non è soddisfatta o gli HTL si esauriscono. --- ## Struttura di un messaggio ![message](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/msg-structure.jpg) --- ![bg](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/freenetlogo.png) # Key-Based # Routing --- ## Chiavi e Ricerche In Freenet, i files sono identificati da **chiavi binarie**: * **Keyword-Signed-Key** *[KSK]* * **Signed-Subspace-Key** *[SSK]* * **Content-Hash-Key** *[CHK]* Le chiavi sono ottenute utilizzando funzioni di hash tra cui *DSA* e *SHA*. --- ## Keyword Signed Key La chiave più basica utilizzata da Freenet, derivata da **una stringa di testo scelta dall'utente** al momento del **file upload** in rete. La stringa è usata come input per ottenere una **coppia di chiavi asimmetriche**, di cui: * La **pubblica** viene passata alla funzione di hash, ottenendo la **file key** * La **privata** è utilizzata per firmare il file, provvedendo un **minimo controllo di integrità**. --- ### KSK #### Analisi * Un sistema simile è soggetto a **dictionary attacks** contro la chiave privata, dato che **ogni nodo può ottenere una lista di stringhe descrittive**. Per questo il file è anche cifrato utilizzando la stringa descrittiva come chiave. * Le chiavi KSK **non sono uniche**, per questo motivo **sono state abbandonate** in funzione delle SSK. --- ## Signed Subspace Key Evoluzione di KSK. * Abilita i **personal namespaces**, identificati da una **coppia di chiavi asimmetriche** * Stringa descrittiva e chiave pubblica del namespace sono passate alla funzione di hash **indipendentemente** * Sui due hash ottenuti: **bit-by-bit XOR** -> **file key** * La chiave privata è utilizzata per firmare il file --- ![ssk](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/ssk.jpg) --- ### SSK #### Analisi * Migliora KSK in quanto **la file key è generata da una coppia di chiavi casuali** Per ottenere un file, un nodo deve conoscere: * Stringa descrittiva * Public Subspace Key In aggiunta, ogni utente ha un **namespace** unico e gestibile. --- ## Content Hask Key Hash diretto del file, ottenendo una **file key pseudo-unica**. I file sono successivamente cifrati con una ***encryption key*** generata casualmente. Per ottenere il file sono necessarie sia la file key che l'*encryption key*, che **non è mai salvata col file** ma solo pubblicata con la sua file key. --- ![chk](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/chk.jpg) --- ### Updatable Subspace Key Le chiavi CHK sono utilizzate **in parallelo** con le SSK, per implementare l'**indirezione**: * Inserire il file sotto la sua CHK * Inserire la CHK in un **file indiretto** contenuto in una SSK * La **file key** è ottenuta in due step. Questo permette l'**update** dei files caricati, mantenendo la stessa SSK. CHK + SSK = USK --- ![bg](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/freenetlogo.png) # Decentralized # Data # Storage --- ## Gestione dei dati salvati **Ogni nodo della rete condivide spazio locale**. * Gestito come una **cache LRU** *[Least Recently Used cache]* * Contiene **dati** e **routing table** del nodo * L'utente **non ha accesso diretto** ai file contenuti nel suo spazio locale *[data encryption]* * La quantità di spazio condiviso è configurabile dall'utente --- ## LRU Cache La **Least Recently Used** cache ordina i dati contenuti in base all'**ordine temporale decrescente** di ricevimento delle **richieste**. *[insert,retrieve,update]* Questo significa che: * I files **più richiesti** sono in cima alla coda. * Se la capacità non è sufficiente per contenere un nuovo file, i file usati **meno recentemente** sono cancellati. --- ### LRU Cache - Esempio La sequenza di accesso è *A,B,C,D,E,F*. Il **rank** *[priorità]* dei files è il numero in parentesi. ![lru](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/Lru.png) --- ### LRU Cache: Note * La cancellazione dei files utilizzati meno recentemente potrebbe rendere alcuni dati **non disponibili** Per questo **le entry nella routing table** corrispondenti ai dati cancellati rimangono anche dopo la cancellazione. * Il meccanismo di ***scadenza*** dei dati causa l'**aggiornamento** dei files vecchi, rimpiazzandoli con le nuove versioni in automatico. --- ### Data Encryption È necessario che gli operatori dei nodi **non possano accedere** ai dati contenuti nello spazio locale. Questo è garantito dalla **cifratura** dei files. * I files sono divisi in **blocchi** distribuiti a diversi nodi * È possibile conoscere la **file key** ma non la **encryption key** a priori Questo consente la **plausible deniability** per gli operatori dei nodi. --- ## Ottenere un File Utente manda la **file key** al proprio nodo. Ogni nodo, ricevuta una richiesta, controlla se la chiave è presente nel suo spazio locale. * **No**: *forward* della richiesta al nodo contenente **la chiave più vicina a quella cercata** della sua forwarding table * **Sì**: **success**, file mandato ai nodi upstream, ognuno dei quali fa **caching** di esso. * **HTL expired**: **failure** propagato verso l'upstream, la ricerca si ferma --- ## Ottenere un file ![fileret1](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/dataretrieval.jpg) --- ## Ottenere un file: Note * Una richiesta successiva per lo stesso file **può essere soddisfatta dai nodi che hanno fatto caching** * La forwarding table non deve diventare un elenco di file sorgenti: Ogni nodo può decidere **arbitrariamente** di proclamarsi sorgente * Se un nodo non può soddisfare una richiesta: messaggio di **failure** nella reply, il nodo upstream proverà con il secondo nodo più vicino *[backtracking]* --- ## Ottenere un file: Note * La qualità del routing **migliora nel tempo**, dato che i nodi si specializzano nel localizzare **set di chiavi simili**, e salvarli in **cluster** * Il meccanismo **replica in maniera trasparente dati popolari** vicino ai nodi che li richiedono * Un nodo che risponde con successo a più richieste riesce a scoprire una **maggiore parte della rete** (ma gli altri nodi non lo contattano più facilmente) --- ## Ottenere un file ![fileret2](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/requestseq.png) --- ![bg](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/friends-nodes.png) # Small World # Network --- ## Opennet e Darknet Si può discriminare tra 2 tipi di reti P2P: * **Light**: comunicazione con qualunque nodo *[Gnutella, Distributed Hash Tables, Opennet]* * **Dark**: comunicazione sono con nodi **fidati** il cui indirizzo è conosciuto a priori. *[Friend-to-friend network: Waste, Darknet]* Freenet è diviso in **Opennet** e **Darknet**, implementazioni light P2P e dark P2P del protocollo. --- ## Il fenomeno del mondo piccolo Identifica un network i cui nodi condividono le informazioni **solo con altri nodi conosciuti**. *[fidati]* Simile al principio dei **sei gradi di separazione** tra esseri umani, ma: * In una rete di nodi la conoscenza è tradotta come vicinanza o similarità *[closeness]*. **In uno Small World Network, peer simili hanno maggiore probabilità di essere connessi**. --- ## SWN Routing * Peer vicini hanno maggiore probabilità di essere connessi * Applicazione del **Greedy Routing:** è possibile comunicare con qualunque peer mandando i messaggi **al peer più vicino**, ogni step. Questo principio è utilizzato sia da DHT che da Freenet per fare routing dei pacchetti. --- ## Il principio di Kleinberg *L'efficacia del routing negli Small World Network dipende dalla proporzione tra le connessioni che hanno diversa lunghezza e la posizione dei nodi.* *[John Kleinberg, 2000]* Significa: **Il numero di connessioni con determinata lunghezza deve essere inversamente proporzionale alla lunghezza delle stesse**. Permette: Complessità dell'algoritmo greedy $O(\log^2N)$ --- ## Posizione e Closeness La posizione dei nodi **non può essere determinata direttamente** in un network anonimo come Darknet. * Non si conoscono gli **indirizzi** dei nodi * Non si conoscono le ***trusted connections*** dei nodi * Le informazioni contenute dai nodi sono distribuite **caoticamente**, non essendoci un'autorità che assegna gli indirizzi. Come si determina **quale nodo è più vicino al peer che devo contattare?** --- ## Ottimizzazione del Network * Assegnare ID numerici **unici** e **casuali** ai nodi * Posizionarli **casualmente** in un grafo, connettendoli alle loro ***trusted connections*** È un **reverse engineering** delle posizioni dei nodi in base alla loro connessioni. Fatto ciò: * Ogni nodo **scambia la propria posizione con gli altri**, di modo da **minimizzare il prodotto delle lunghezze** degli edge del grafo *[connessioni]* **La rete determina la miglior posizione dei nodi.** --- ## SWN: Conclusioni * La rete ottimizza le posizioni dei nodi di modo da minimizzare la lunghezza delle connessioni * La rete così generata permette di raggiungere **qualunque peer** in un numero ragionevole di steps * La **vicinanza** tra peer è il **prodotto della lunghezza degli edge del grafo** * L'algoritmo di routing Greedy funziona **se e solo se i nodi vicini hanno più probabilità di conoscersi**. Questo rende l'ottimizzazione del network necessaria. --- ## SWN: Simulazione Si è simulata uno Small World Network con 3 algoritmi di ricerca: * **Random** tra i nodi *[Random]* * **Ideal Greedy Routing** (Kleinberg), i nodi sono già disposti in maniera ottima *[Good]* * **Restored Greedy Routing**, i nodi sono riordinati da Darknet (2000 iterazioni per nodo). *[Restored]* --- ![success](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/successgraph.jpg) *Numero di ricerche **successful** in $log_2^2N$ steps*. --- ![avg](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/avglengthgraph.jpg) *La lunghezza media delle **successful routes***. --- ![bg](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/freenetlogo.png) # Conclusioni --- ## Confronto di protocolli P2P Freenet non è l'unico protocollo che tenta di proteggere l'anonimato dei suoi utenti. A livello di userbase e maturità di progetto, si notano: * **Tor**, basato sull'**Onion routing** * **I2P**, basato sul **Garlic routing** (variante dell'Onion routing) Entrambi si identificano piu' come **proxy** che come rete decentralizzata, a differenza di Freenet. --- ## Freenet e Tor ||Freenet|Tor| |:-:|:-:|:-| |**Protocollo decentralizzato** |Sì |No\* | |**Accesso a Internet (proxy)** |No |Sì| |**Accesso a webserver anonimi** |No |Sì | |**Salvataggio distribuito dei dati** |Sì |No | |**Impossibilità di rimuovere i dati** |Sì |No | |**È stato bloccato con successo** |No\*\*|Sì | \* Tor necessita di una *directory authority* che gestisca gli *hidden services [webserver anonimi]*. \*\* Relativo a Darknet --- ![bg](/home/francesco/Desktop/UNITO/lezioni/YearI/FirstSem/CR/seminario/presentation/freenetlogo.png) # Grazie per l'attenzione