I2P (Invisible Internet Project)

I2P-Anonymous2I2P, originariamente chiamata Invisible Internet Project, è un software libero e Open Source per la realizzazione di una rete anonima. La rete offre un livello in cui le applicazioni possono scambiarsi dati, messaggi, navigare e quant’altro. Tutti i dati sono avvolti con diversi livelli di crittografia.

I2P è un livello di comunicazione anonimo peer-to-peer distribuito, progettato per eseguire qualsiasi servizio Internet tradizionale (ad esempio, Usenet, E-mail, IRC, file sharing, Web hosting e HTTP, Telnet ecc…), così come le più tradizionali applicazioni distribuite.

I2P è ancora in sviluppo beta, quindi non ancora ritenuto idoneo per gli usi che necessitano di un anonimato forte.

N.B. : ” nessuna rete può essere perfettamente anonima “.

Che cosa puoi fare con I2P

  • Email: interfaccia web integrata per la posta elettronica, plugin per la posta elettronica senza server.
  • Navigazione web: siti web anonimi, gateway verso e dallInternet pubblica.
  • Blog e forum: plugin per gestire blog e per Syndie.
  • Host di siti web: web server anonimo integrato.
  • Chat in tempo reale: messaggistica immediata e client IRC.
  • File sharing: client ED2K e Gnutella, client BitTorrent integrato.
  • Deposito file decentralizzato: plugin per il filesystem distribuito Tahoe-LAFS

Installiamolo su Ubuntu e Debian

Ubuntu:

  1. sudo apt-add-repository ppa:i2p-maintainers/i2p
  2. sudo apt-get update
  3. sudo apt-get install i2p

Debian:

  1. sudo nano /etc/apt/sources.list.d/i2p.list
  2. Debian Squeeze:
    deb http://deb.i2p2.no/ squeeze main
    deb-src http://deb.i2p2.no/ squeeze main
  3. Debian Wheezy:
    deb http://deb.i2p2.no/ stable main
    deb-src http://deb.i2p2.no/ stable main
  4. Debian Jessie e SID:
    deb http://deb.i2p2.no/ unstable main
    deb-src http://deb.i2p2.no/ unstable main
  5. Aggiungete quindi le key di autenticazione con:
    wget http://www.i2p2.de/_static/debian-repo.pub
    sudo apt-key add debian-repo.pub
  6. Installiamo
    sudo apt-get update && sudo apt-get install i2p i2p-keyring

… per avviarlo lanciamo il comando

@root # ip2router console

se non ci saranno stati problemi si aprira’ una pagina web con il seguente URL : http://127.0.0.1:7657/home

Per studiare meglio tutte le funzionalita’ potete utilizzare il link ufficiale della documentazione

Buon divertimento !

Introduzione a CouchDB

couchDBCouchDB e’ un database documentale NoSQL disponibile con l’ampia licenza Apache.
Apache CouchDB e’ un moderno documentale richiamabile semplicemente con l’HTTP e che al tempo stesso offre le piu’ avanzate funzionalita’ di replicazione dati e di ricerca in parallelo (Map/Reduce).

CouchDB (acronimo di Cluster Of Unreliable Commodity Hardware) e’ uno dei piu’ diffusi DB documentali Web grazie alla sua velocita’, alla flessibilita, alla semplicita’ di utilizzo ed al… prezzo!

Installazione

Installare CouchDB e cURL (che serve per accedere) e’ facile su Linux (eg. RedHat, Fedora, CentOS, Scientific Linux, …):

yum install couchdb curl -y
oppure
sudo aptitude install couchdb curl
Ora bisogna far partire il server CouchDB con il comando couchdb. Per verificare se funziona tutto basta un comando:
# curl http://127.0.0.1:5984
{“couchdb”:”Welcome”,”uuid”:”fd91d8b7b77c7f6d75d5937326a95ad2″,”version”:”1.5.0″,”vendor”:{“version”:”14.04″,”name”:”Ubuntu”}}

CouchDB e’ disponibile per tutti i sistemi UNIX-based ed anche sulle piattaforme MS-Windows e Mac OS X. Installare le versioni precedenti di CouchDB non era cosi’ semplice: bisognava partire dall’installazione del linguaggio di programmazione Erlang e ricompilare…

Utilizzo

CouchDB e’ accessibile esclusivamente attraverso un HTTP-based RESTful API, cio’ significa che, anziche’ collegarsi al DB server utilizzando un’applicazione client per interagire con il sistema, basta utilizzare un software in grado di interagire con un HTTP server web per fare richieste. CouchDB che a sua volta eseguira’ le azioni nel database, restituendo una risposta appropriata quando finito.
Quindi e’ possibile gestire il database semplicemente visitando gli URL nel browser web oppure utilizzando gli strumenti da riga di comando come curl o, cosa piu’ importante, attraverso qualsiasi linguaggio di programmazione che supporta richieste HTTP.
L’implementazione dell’interfaccia REST (Representational Transfer State) su CouchDB e’ molto completa poiche’ non si limita al CRUD (CREATE, READ, UPDATE, DELETE) ma ogni operazione svolta su CouchDB e’ richiamabile con l’HTTP.

Futon

CouchDB possiede una sua interfaccia web molto user friendly, Futon, dalla quale e’ possibile eseguire qualsiasi operazione per la gestione di un database, come l’inserimento, la visualizzazione, la modifica e la cancellazione dei dati. Inoltre Futon contiene anche le principali funzionalita’ di amministrazione di un database, come le impostazioni di configurazione, la replicazione dei dati, definizione dei ruoli e privilegi e uno strumento di testing.
Per accedere all’interfaccia web basta collegarsi da browser a localhost:5984/_utils

cURL

Per i piu’ affezionati alla linea di comando (come me per esempio), si puo’ usare curl, un ottimo tool utile per trasferire dati da/a un server utilizzando vari protocolli, tra cui HTTP, HTTPS, FTP. Il modo per farlo e’ digitando:

curl <opzioni> <ip_host>:5984/<database>/<record>.

Da notare che nel URL viene specificata la porta 5984, e’ quella usata dal processo di couchdb.
Tra le opzioni piu’ importanti: -X per specificare il tipo di richiesta http: GET per richiedere dati, PUT e POST per modificare dati o DELETE per cancellare. Inoltre -d permette di specificare i dati da includere nella richiesta, ad esempio per modificare documenti nel database.
Esempi:

# Crea il database "libri"
curl -X PUT http://127.0.0.1:5984/libri

# Visualizza il contenuto di "libri" (all'inizio e' vuoto)
curl -X GET http://127.0.0.1:5984/libri

# Crea il documento con _id "lafineeilmioinizio" dentro il database "libri"
curl -X PUT http://127.0.0.1:5984/libri/lafineeilmioinizio \
 -d '{"titolo":"La fine e il mio inizio", "autore":"Tiziano Terzani", 
      "casa_editrice":"Longanesi", "prezzo":"18.60"}'

# NB: Tutte le volte che un documento viene modificato riceve un revision number
# Modifica un documento aggiungendo come allegato un'immagine
curl -X PUT http://127.0.0.1:5984/libri/lafineeilmioinizio/cover.jpg?rev=1-XXX \
 --data-binary @images/budda.jpg -H "Content-Type: image/jpg"

# Crea un documento hungergames copiando il contenuto da un altro documento
curl -X COPY http://127.0.0.1:5984/libri/lafineeilmioinizio -H "Destination: hungergames"

# Cancella il documento con _id "hungergames"
curl -X DELETE http://127.0.0.1:5984/libri/hungergames?rev=1-YYY 

# Effettua un caricamento massivo di documenti da file
curl -X POST http://127.0.0.1:5984/libri/_bulk_docs -H "Content-type: application/json" -d @biblio.json

# Visualizza tutto il contenuto del database "libri" e il dettaglio dei documenti presenti
curl -X GET http://127.0.0.1:5984/libri/_all_docs?include_docs=true

Architettura

CouchDB e’ un database document-oriented. Cio’ significa che a differenza dei piu’ tradizionali DBMS (Database Management System) relazionali come Oracle e PostgreSQL, i dati non vengono memorizzati in tabelle (o se volete, relazioni), ma in “documenti”.

Su un database relazionale le tabelle hanno una struttura rigida, sono composte da campi definiti prima della effettiva memorizzazione dei dati. Le tabelle vanno dichiarate con gli opportuni statement DDL, prima di essere utilizzate. Ogni tabella e’ composta da tuple (ovvero le righe della tabella o i record) che contengono i dati. La gestione dei dati si effettua con statement DML. I comandi DDL e DML della stragrande maggioranza dei DB relazionali sono in SQL. Ora dimentichiamoci tutto questo…

In CouchDB il concetto di relazione o di tabella non esiste, l’elemento fondamentale e’ il documento che contiene al suo interno tutti i dati relativi, organizzati in modo eterogeneo. Si possono aggiungere e modificare i campi anche dopo l’effettivo inserimento dei dati. In questo modo record appartenenti alla stessa categoria di informazioni possono avere campi diversi tra di loro. La chiave primaria dei database relazionali viene tradotta nel campo univoco _id di CouchDB, creato automaticamente dall’engine del DBMS (ma che e’ anche possibile indicare in modo esplicito.

Dal punto di vista del sistema operativo CouchDB si presenta come un unico processo beam.smp in ascolto sulla porta TCP 5984 (6984 se e’ abilitato l’HTTPS). In realta’ all’interno del processo operano diversi thread con compiti specifici.
I file utilizzati da CouchDB su Linux si trovano in /etc/couchdb, i file di database su /var/lib/couchdb, i log su /var/log/couchdb.

Consistenza dei dati e replicazione

CouchDB non utilizza alcun meccanismo di locking ma sfrutta l’MVCC (Multiversion Concurrency Control), ogni modifica di un oggetto ne crea una nuova versione. Le versioni precedenti non vengono cancellate. Se due modifiche vanno in conflitto poiche’ accedono allo stesso documento, la seconda riceve un errore in save. L’applicazione deve riprendere l’ultima versione del documento e rieseguire l’UPDATE.
L’isolamento e’ mantenuto solo a livello di un singolo documento, questa e’ una notevole semplificazione, rispetto alla complessa logica transazionale di altri database, ma consente l’ottimizzazione, la parallelizzazione e la distribuzione dei dati in modo semplice. A livello di accesso al file di dati ogni singola modifica ad un documento rispetta le proprieta ACID (Atomic Consistent Isolated Durable) con la serializzazione delle modifiche sui documenti e la scrittura sincrona sul disco.

Piu’ database CouchDB possono essere collegati tra loro in modo molto semplice. I database vengono aggiornati tra loro con una replicazione peer-to-peer incrementale implementata nativamente nell’engine. CouchDB permette una replicazione bidirezionale asincrona, utilizza un meccanismo automatico di risoluzione dei conflitti e fornisce una eventual consistency tra i database. Se i database sono ospitati su nodi differenti si ottiene con questo la distribuzione dei dati.
La replicazione di CouchDB puo’ essere utilizzata sia per sincronizzare database locali che per complesse configurazioni con sharding dei dati.