
Encfs è stata per tanto tempo la mia soluzione preferita per conservare velocemente i dati che volevo tenere riservati su uno storage esterno o su un cloud storage.
Almeno fino al 2014 quando encfs è risultato estremamente fragile. Alcuni buchi sono stati coperti ma altri no, con la promessa che l'eventuale 2.0 avrebbe risolto tutti i problemi.
“Eventuale” perché lo sviluppo s'è fermato e lo stesso manteiner consiglia di ricorrere ad altre soluzioni più valide.
Come gocryptfs (https://github.com/vgough/encfs?tab=readme-ov-file#status), appunto.
Come EncFS e i suoi omologhi (cryfs, eCryptfs), gocryptfs è uno “stackable filesystem”.
Ma cos'è uno stackable filesystem?
Analogamente a device mapper, il framework che fornisce funzionalità aggiuntive (cifratura, volumi logici, raid) ai dispositivi a blocchi a livello del kernel, gli stackable filesystem sono file system “impilati” (e non poteva essere altrimenti) sopra un altro file system per fornire funzionalità aggiuntive (cifratura, viste in lettura e/o scrittura) a livello di file/directory nello spazio utente grazie a FUSE.
Essendo complementari, device mapper e stackable filesystem possono dunque cooperare.
Ecco perché posso avere:
- due dischi fisici (block device)
- che divido in volumi logici (device mapper),
- ognuno dei quali formattato in ext4 (il file system)
- a cui aggiungo funzionaità di cifratura con gocryptfs (stackable filesystem)
Un altro celebre stackable filesystem è quello di tipo “unionale” nelle sue varie declinazioni come unionfs prima, aufs poi, per finire a overlayfs, lo standard in ambito container per la manipolazione delle immagini.
Gocryptfs:
- è facile da usare
- è in pieno sviluppo
- non ha i problemi stringenti di sicurezza del suo “collega”
- è tuttavia suscettibile ad attacchi statistici e di watermarking strutturale (effettuato sui metadati, come la dimensione dei file e la struttura delle directory) by design
Su una cifratura file-based, raggiungere la triangolazione perfetta fra performance, full-privacy e ottimizzazione dello spazio, è quasi impossibile.
Gocryptfs non è l'optimum ma costituisce una valida alternativa ad EncFS, avendo dalla sua la stessa facilità d'uso, maggior robustezza (l'uso di AES-GCM impedisce di rompere matematicamente la cifratura dei dati, come invece succedeva su EncFS) e, come EncFS, ha ottime performance.
Anche Gocryptfs prevede due modalità distinte di funzionamento: forward mode e reverse mode
Nella prima, si battezza la directory che conterrà tutto ciò che vorrò cifrare. Localmente avrò un punto di montaggio su cui depositare i file in chiaro che verranno cifrati e memorizzati on-fly.
Nel secondo caso, ribalto i termini della cifratura. Battezzerò una directory in chiaro il cui punto di montaggio sarà una directory che fornirà al volo i file cifrati.
La prima modalità è comoda per la sincronizzazione su storage esterni o su cloud storage.
La seconda, dal momento che può fornire una vista cifrata di qualunque cartella, è utile quando si vuole effettuare velocemente un backup cifrato dei propri file
!!! Attenzione !!!
Come tutte le crittografie file-based suscettibili di attacchi di tipo statistico e watermarking strutturale, nel caso del reverse mode, il watermarking diventa ancora più insidioso perché, dovendo funzionare presumibilmente con strumenti tipo rsync per il backup, il reverse mode di gocryptfs fa uso di un algoritmo, AES-SIV, deterministico per design cosi che lo stesso file, cifrato due volte, possa produrre lo stesso, identico risultato. Comodo per rsync ma un paradiso per il watermarking.
Tuttavia, anche così risulta più robusto di EncFS perché è una vulnerabilità che, a differenza del primo, non rompe matematicamente la cifratura esponendo il testo in chiaro pur consentendo attacchi di watermarking passivo per la rilevabilità dei file.
Prove sul campo
Gocryptfs, nella fase di inizializzazione, crea il file gocryptfs.conf contenente la password cifrata ed altri elementi di configurazione.
In Forward Mode, tale file è situato nella root della directory cifrata, quella che presumibilmente finirà nello storage esterno/cloud.
Forward mode classico
1. Inizializzazione:
# creazione della directory cifrata e della directory in chiaro
mkdir $HOME/{cipherdir,plaindir}
# inizializzazione della cartella cifrata
gocryptfs -init $HOME/cipherdir
Choose a password for protecting your files.
Password:
Repeat:
Your master key is:
93499318-58f766af-6a172304-114cab2c-
7e9d6a6e-48f38c7a-b00a8e04-3b2e0583
If the gocryptfs.conf file becomes corrupted or you ever forget your password, there is only one hope for recovery: The master key. Print it to a piece of paper and store it in a drawer. This message is only printed once.
The gocryptfs filesystem has been created successfully.
You can now mount it using: gocryptfs cipherdir MOUNTPOINT
Nella fase di inizializzazione viene generata una master key cifrata con una password che verrà chiesta durante la fase di init e che finirà nel file di configurazione gocryptfs.conf situato di default nella cartella cifrata.
N.B. È bene conservare la master key in un luogo sicuro perché, in caso di malfunzionamenti, potrebbe essere l'unico modo di recuperare la visibilità della cartella cifrata
2. Mount:
gocryptfs cipherdir plaindir
Nella fase di mount, viene chiesta la password, gocryptfs legge il file di configurazione e decripta la master key che servirà per la cifratura dei file presenti nel mountpoint in chiaro e che verranno cifrati al volo e scritti nella cartella cifrata.
3. Unmount:
fusermount -u plaindir
Nella fase di unmount si “libera” il mountpoint lasciando la sola cartella cifrata.
Note:
- Occorre prestare attenzione al file gocryptfs.conf. Visto che contiene la master key cifrata, senza questo file la decifratura sarebbe impossibile.
- Come suggerito durante la fase di inizializzazione, è bene conservare la master key così che, nel caso si perda o si corrompa il file gocryptfs.conf, sia possibile rigenerarlo con la master key.
Forward Mode su cloud storage (es. Dropbox)
In questo caso, sia il file di configurazione contenente la master key cifrata che la password di decifratura, saranno allocate esternamente alla directory cifrata su Dropbox.
In questo modo, anche guadagnando l'accesso al clud storage, ci sarebbero solo dei file cifrati senza avere nemmeno la possibilità di tentare attacchi di forza bruta sulla master key cifrata.
Visto che la password sarà scritta su un file, e non avrò bisogno di ricordarla a memoria, verrà generata ricorrendo al generatore di pseudo-casualità del kernel /dev/urandom e sarà lunga il massimo consentito, 2048 bytes.
1. Inizializzazione
# creazione della directory cifrata e della directory in chiaro
mkdir $HOME/Dropbox/.cipherdir $HOME/plaindir
# creazione di un keyfile di 2k (la massima lunghezza possibile)
umask 077 && tr -dc '[:graph:]' < /dev/urandom | head -c 2048 > /run/media/$USER/<pendrive>/mykey.txt
# inizializzazione della cartella cifrata
gocryptfs \
-passfile /run/media/$USER/<pendrive>/mykey.txt \
-config /run/media/$USER/<pendrive>/gocryptfs.conf \
-init $HOME/Dropbox/.cipherdir
Using config file at custom location /run/media/$USER/<pendrive>/gocryptfs.conf
Choose a password for protecting your files.
passfile: reading from file "/run/media/$USER/<pendrive>/mykey.txt"
Your master key is:
dcceb426-75724350-f53566f6-2991cfa9-
7a091a4f-397eab55-170c3363-a16b0ab3
If the gocryptfs.conf file becomes corrupted or you ever forget your password,
there is only one hope for recovery: The master key. Print it to a piece of
paper and store it in a drawer. This message is only printed once.
The gocryptfs filesystem has been created successfully.
You can now mount it using: gocryptfs cipherdir MOUNTPOINT
2. Mount
gocryptfs \
-config /run/media/$USER/<pendrive>/gocryptfs.conf \
-passfile /run/media/$USER/<pendrive>/mykey.txt
$HOME/Dropbox/.cipherdir $HOME/plaindir
3. Unmount
fusermount -u $HOME/plaindir
Reverse mode
Questa modalità torna utile quando si vuole offrire al volo una vista cifrata di una determinata directory, ad es. quando vogliamo fare un backup cifrato.
Supponiamo di volere effettuare un backup cifrato della directory “myDocuments”
1. Inizializzazione
gocryptfs -init -reverse $HOME/myDocuments
Choose a password for protecting your files.
Password:
Repeat:
Your master key is:
cda5cac4-5435e8e8-68d6d038-451a6955-
c269c57c-d8b5fe5e-4d5ca589-4eb5e7ac
If the gocryptfs.conf file becomes corrupted or you ever forget your password,
there is only one hope for recovery: The master key. Print it to a piece of
paper and store it in a drawer. This message is only printed once.
The gocryptfs-reverse filesystem has been created successfully.
You can now mount it using: gocryptfs -reverse plaindir MOUNTPOINT
Nella directory “myDocuments” sarà presente il file di configurazione, di default .gocryptfs.reverse.conf
2. Mount
mkdir $HOME/cipherdir_reverse
gocryptfs -reverse $HOME/myDocuments $HOME/cipherdir_reverse
Dopo il mount, il file .gocryptfs.reverse.conf verrà “copiato” nel punto di montaggio come gocryptfs.conf in modo che il backup possa essere montato direttamente in forward mode.
3. Unmont
fusermount -u $HOME/cipherdir_reverse
Nulla vieta che anche nel reverse mode si possa ricorrere a password e file di configurazione “detachable”.
gocryptfs \
-passfile /run/media/$USER/<pendrive>/mykey.txt \
-config /run/media/$USER/<pendrive>/gocryptfs.reverse.conf \
-init -reverse $HOME/myDocuments
N.B. In questo caso anche il backup avrà bisogno del file di configurazione e della password per essere montato.
Varie ed eventuali
Cambio password
Supponiamo di voler cambiare la password (keyfile) della nostra directory cifrata su Dropbox
gocryptfs \
-config /run/media/$USER/<pendrive>/gocryptfs.conf
-passfile /run/media/$USER/<pendrive>/mykey.txt
-passwd $HOME/Dropbox/.cipherdir
Using config file at custom location /run/media/$USER/<pendrive>/gocryptfs.conf
Password:
Decrypting master key
Please enter your new password.
Password:
Repeat:
N.B. Non è possibile specificare un keyfile come nuova password (possibile solo durante l'init).
Il keyfile in questo caso servirà solo a decriptare la master key che verrà cifrata con la nuova password.
Mount automatico
Nel caso di forward mode, può tornare comodo il mount automatico della directory cifrata.
È sufficiente definire un piccolo script che esegua il montaggio e che parta in esecuzione automatica dopo il login.
Due osservazioni:
- Conviene che la password sia stoccata nel keyring (di Gnome nel mio caso) così da rendere la password inaccessibile senza il login.
- il file di configurazione può continuare a rimanere al di fuori della directory cifrata (soprattutto nel caso cloud storage) purché sia accessibile dopo il login.
1. Generazione password
# suppongo che la password sia stata generata come in forward
# mode e che stia in un file di testo che ora memorizzerò nel
# keyring con secret-tool
cat mykey.txt | secret-tool store --label="gocryptfs" myCipherDir myPassword
2. Creazione script
cat > $HOME/mount_gocryptfs.sh << EOF
#!/bin/bash
gocryptfs \
-config $HOME/gocryptfs.conf \
-extpass="secret-tool lookup myCipherDir myPassword" \
$HOME/Dropbox/.cipherdir $HOME/plaindir
EOF
chmod 700 $HOME/mount_gocryptfs.sh
3. Creazione del launcher
cat > $HOME/.config/autostart/mountGocryptfs.desktop << EOF
[Desktop Entry]
Name=mount_gocryptfs
GenericName=mount_gocryptfs
Comment=Monta la cartella cifrata con gocryptfs
Exec=/home/<user>/mount_gocryptfs.sh
Terminal=false
Type=Application
X-GNOME-Autostart-enabled=true
Comment[it_IT]=
EOF
In questo modo, dopo il login, verrà eseguito lo script (grazie a $HOME/.config/autostart/) che recupererà la password via secret-tool dal keyring.
Rigenerazione del file gocryptfs.conf
Ma se smarrissi il file gocryptfs.conf, o mi si corrompe il supporto esterno che lo contiene?
O se dimenticassi / perdessi la password?
È un grosso guaio. La directory cifrata non sarà più accessibile.
O meglio.
Lo sarà solo avendo la master key. E con questa possiamo, non solo montare la directory cifrata, ma anche ricostruire il file di configurazione.
Innanzitutto verifichiamo se l'accesso diretto con la master key funzioni:
Accesso con la master key
gocryptfs \
-masterkey dcceb426-75724350-f53566f6-2991cfa9-7a091a4f-397eab55-170c3363-a16b0ab3 \
$HOME/Dropbox/.cipherdir $HOME/plaindir
Using explicit master key.
THE MASTER KEY IS VISIBLE VIA "ps ax" AND MAY BE STORED IN YOUR SHELL HISTORY!
ONLY USE THIS MODE FOR EMERGENCIES
Filesystem mounted and ready.
Per evitare il warning, si può ricorrere al flag stdin che obbliga all'inserimento manuale da tastiera della master key:
gocryptfs -masterkey stdin $HOME/Dropbox/.cipherdir $HOME/plaindir
Masterkey:
Using explicit master key.
Filesystem mounted and ready.
Caso 1: Smarrimento password
Se è solo la password, basterà accedere alla directory cifrata con la master key usando lo stesso file di configurazone e inserire una nuova password:
# Cambio password
gocryptfs \Inserimento
-masterkey dcceb426-75724350-f53566f6-2991cfa9-7a091a4f-397eab55-170c3363-a16b0ab3 \
-config /run/media/$USER/<pendrive>/gocryptfs.conf \
-passwd
$HOME/Dropbox/.cipherdir
Using config file at custom location /run/media/$USER/<pendrive>/gocryptfs.conf
Using explicit master key.
THE MASTER KEY IS VISIBLE VIA "ps ax" AND MAY BE STORED IN YOUR SHELL HISTORY!
ONLY USE THIS MODE FOR EMERGENCIES
Please enter your new password.
Password:
Repeat:
A copy of the old config file has been created at "/run/media/$USER/<pendrive>/gocryptfs.conf.bak".
Delete it after you have verified that you can access your files with the new password.
Password changed.
N.B. Siccome il file di configurazione verrà modificato con un nuovo salt e una nuova password, del file di configurazione verrà fatta una copia di backup precauzionale,
Caso 2: Ricostruzione file di configurazione
È praticamente lo stesso procedimentod di prima solo che in questo caso occorre ricostruire il file di configurazione.
- Si ricrea un file di configurazione con
-init avente cura di replicare le stesse impostazioni di quello compromesso (nel mio caso è semplice, tutto default) su una directory cifrata temporanea
- il file di configurazione così ottenuto, si sposta nella directory cifrata effettiva e si imposta la nuova password
# inizializzo una directory cifrata temporanea
gocryptfs -init $HOME/cipher_temp
# Sposto il nuovo file di configurazione dalla directory
# temporanea cifrata al punto in cui si trovava in precedenza
# (la nostra nuova pendrive)
mv $HOME/cipher_temp/gocryptfs.conf /run/media/$USER/<nuova_pendrive>/gocryptfs.conf
# Inserimento password
gocryptfs \
-masterkey dcceb426-75724350-f53566f6-2991cfa9-7a091a4f-397eab55-170c3363-a16b0ab3 \
-config /run/media/$USER/<nuova_pendrive>/gocryptfs.conf \
-passwd
$HOME/Dropbox/.cipherdir
Using config file at custom location /run/media/$USER/<nuova_pendrive>/gocryptfs.conf
Using explicit master key.
THE MASTER KEY IS VISIBLE VIA "ps ax" AND MAY BE STORED IN YOUR SHELL HISTORY!
ONLY USE THIS MODE FOR EMERGENCIES
Please enter your new password.
Password:
Repeat:
A copy of the old config file has been created at "/run/media/$USER/<nuova_pendrive>/gocryptfs.conf.bak".
Delete it after you have verified that you can access your files with the new password.
Password changed.
E ora il volume può essere montato nuovamente.