Creare una directory criptata su Linux

Per molto tempo ho cercato un modo per cifrare una directory sul mio Ubuntu. A lavoro infatti utilizzo i servizi ownCloud e Dropbox per avere a portata di mano i miei file personali. Tra questi ci sono però anche file riservati, che non avrei piacere fossero acceduti da qualcuno.

Finora ero stato bloccato dalla convinzione che gli strumenti disponibili su Linux per criptare il file system agissero solo a livello di partizione. Non avendo creato delle partizioni separate al momento dell'installazione, non volevo mettermi a fare un backup della mia directory home, ritagliare una partizione da criptare a poi ripristinare il backup. Ma mi sbagliavo!
È più corretto infatti dire che gli strumenti di crittografia più usati agiscono a livello di dispositivo a blocchi, quindi non solo partizioni ma anche singoli file, se opportunamente trattati.

Il primo ferro del mestiere quindi si chiama losetup, un comando per gestire i loop device. Un loop device è un dispositivo che rende possibile vedere un file come se fosse un dispositivo a blocchi. Un tipico esempio per cui viene usato un loop device è per vedere il contenuto di una immagine di un CD.

Per usare un loop device bisogna avere un file a disposizione della dimensione del file system desiderata. Non è sufficiente quindi un file vuoto. A questo scopo si può usare dd, un comando per copiare dati in blocchi e che può essere usato per copiare in nuovo file il numero desiderato di blocchi da /dev/zero, uno pseudo-device che fornisce un flusso ininterrotto di zeri.

A questo punto, l'ultimo strumento che entra in gioco è cryptsetup, un comando che si interfaccia con dm-crypt, che a sua volta è un sistema che cripta in modo trasparente un dispositivo a blocchi presentando all'utente una versione non criptata.
Tra le varie opzioni che offre cryptsetup, quella che andremo a usare è LUKS, un formato per dischi criptati che, aggiungendo un header al dispositivo, fornisce alcune importanti funzionalità come la possibilità di cambiare passphrase senza dover eseguire da capo la criptazione dell'intero file system. La passphrase infatti non è la chiave di criptazione del file system: con la passphrase viene cifrata la chiave vera e propria, che quindi non cambia se si cambia passphrase.

Andiamo con un esempio concreto. Il primo passo è creare il file, che chiameremo container:

$ dd if=/dev/zero of=container bs=1024 count=102400

Ho preso 1024 * 100 "blocchi" (count) da 1024 byte ciascuno (bs) da /dev/zero (if) e li ho messi nel file container. In totale fanno 100MB come testimonia un ls (test è il mio utente sulla macchina virtuale di test):

$ ls -lh container 
-rw-rw-r-- 1 test test 100M Oct 18 15:39 container

Cerco un loop device libero e lo collego al file appena creato:

$ sudo losetup -f
/dev/loop0
$ sudo losetup /dev/loop0 container

Ora entra in gioco la crittografia, per cui se non lo è già bisogna installare cryptsetup con sudo apt-get install cryptsetup-bin. Quindi:

$ sudo luksformat -t ext4 /dev/loop0

Questo comando crea un file system ext4 criptato su /dev/loop0, cancellando interamente il suo contenuto. Se non si è sicuri di cosa sia collegato al device, basta chiedere a losetup:

$ sudo losetup /dev/loop0
/dev/loop0: [fc00]:26391 (/home/test/container)

A questo punto dobbiamo dire a cryptsetup di creare un dispositivo in chiaro a partire dal dispositivo criptato e montarlo in una directory a scelta:

sudo cryptsetup open --type luks /dev/loop0 mkdir mysecretdir  
sudo mount /dev/mapper/enc0 mysecretdir  
sudo chown -R test:test mysecretdir  

La directory è montata e l'utente test ha tutti i diritti di lettura e scrittura.
Quando non è più necessaria, o prima di fare logout, si può disattivare in questo modo:

sudo umount /dev/mapper/enc0  
sudo cryptsetup close /dev/mapper/enc0  
sudo losetup -d /dev/loop0  

La prossima volta che avremo di nuovo bisogno di accedere alla directory, basta la serie inversa di comandi:

sudo losetup /dev/loop0 container  
sudo cryptsetup open /dev/loop0 enc0  
sudo mount /dev/mapper/enc0 mysecretdir  

Bisogna tenere presente che è particolarmente importante effettuare backup regolari, a maggior ragione nel caso di una directory criptata.

Come ultima considerazione, ritengo questa soluzione valida per aumentare la privacy in contesti in cui estranei potrebbero avere accesso ai propri file estraendo l'hard disk dal computer, come nel mio caso del computer di lavoro o nel caso di un portatile rubato, oppure semplicemente se si condivide lo stesso computer con altre persone.


Cover by Lok Leung, some rights reserverd