Re: [OT] Consiglio per cifratura file

Alessandro Baggi <[email protected]>
Newsgroups gmane.linux.debian.user.italian
Message-ID <[email protected]>
Il 10/02/25 14:20, Gerlos ha scritto:
> Imho prima di tutto dovresti fare qualche prova e scegliere se vuoi 
> usare un sistema di crittografia stacked o a blocchi:
> 
> - Stacked: i file vengono criptati individualmente nel volume criptato, 
> se modifichi un file deve essere ri-trasmesso solo quello, e non 
> l'intero volume criptato. È possibile desumere informazioni sui file 
> esaminando  dimensioni e orario di modifica dei file criptati. In 
> generale continua a funzionare anche se si "rompe" qualcosa durante un 
> trasferimento (al peggio perdi il singolo file interessato).
> 
> - A blocchi: i file sono contenuti in un intero blob criptato, che può 
> venir modificato in modo imprevedibile, e che deve essere elaborato 
> nella sua interezza prima di essere trasmesso. È più sicuro perché non 
> c'è modo di sapere nulla sui metadati dei file contenuti. Ma non è detto 
> che questo sia rilevante per il tuo caso d'uso. Occhio che se qualcosa 
> va storto durante il trasferimento potresti trovarti con l'impossibilità 
> di montare l'intero volume!
> 
> Uscendo dal ragionamento paranoico, a seconda di che dati tieni e dove 
> li tieni, i vantaggi di un sistema meno sicuro ma più adatto alla 
> trasmissione via rete possono superarne gli svantaggi.
> 
> In definitiva io proverei a implementare entrambi e vedrei quale dei due 
> finisce prima il trasferimento, impiegando meno risorse, e quale è più 
> "robusto" in caso di problemi di connettività o se il processo di 
> trasferimento viene killato per qualche ragione.
> 
> saluti,
> Gerlos
> 
> 

Ciao Gerlos e grazie per la risposta,

Il motivo per cui gocryptfs è uno dei due candidati è proprio per il 
fatto che ogni singolo file viene cifrato senza creare un blob unico. 
gocryptfs è nato proprio per ottimizzare il trasferimento su cloud. Ho 
fatto molte prove con file cifrati con gocryptfs ed in ogni caso il 
danno è limitato al singolo file, o per esempio corruzione dell'IV di 
una directory si perdeva la directory (ma se hai l'IV backuppato e lo 
ripristini problema risolto, inoltre si può recuperare il contenuto dei 
file con una procedura ma non il nome del file). La sincronizzazione 
remota di un volume gocryptfs con rsync è come sincronizzare un 
directory normale con rsync. È molto semplice da usare, monti, usi e 
smonti (e se non smonti ha un timeout in cui se il volume non viene 
usato per N tempo lo smonta automaticamente). Inoltre l'overhead di 
gocryptfs è certamente minore rispetto al container LUKS.

Il motivo per cui LUKS file container è il secondo candidato è perche è 
integrato in Linux in maniera profonda ed è testato. Ma devo dire che ho 
riscontrato diversi svantaggi nell'uso dopo svariato tempo di utilizzo, 
dei file container:

1) È più complicata/lunga l'inizializzazione a gocryptfs. Per 
quest'ultimo basta inizializzare la directory che si vuole, montarlo e 
usarlo mentre con il file container dovrei allocare il file e preservare 
spazio con fallocate, poi per buona pratica questo file dovrebbe essere 
riempito di valori urandom per non far identificare dove sono i dati 
cifrati (e questo richiede tempo soprattutto se un file container è 
grosso qualche centinaio di GB), poi devo formattarlo per LUKS 
scegliendo un cipher, un iteration time (se l'iteration time è 
abbastanza lungo si ha una maggiore prevenzione sul bruteforce perche 
aumenta l'entropia ma aumenta anche il tempo di apertura del volume, 
quindi devi trovare un compromesso per le prestazioni), hash, pbkdf, 
eccc, poi devo aprirlo con 'luksOpen', creare sul device virtuale un fs 
come ext4 (o xfs o btrfs) e chiuderlo.

2) Nel mio caso di utilizzo dovrebbe essere preferito avere l'header 
distaccato dal file container nel caso di salvataggio remoto (basta un 
cryptsetup luksDump file.img e ti spara fuori un sacco di cose e non 
richiede la chiave per avere queste info). Qui nasce un altro problema: 
se hai l'header distaccato devo backupparlo regolarmente perche se lo 
perdi o è corrotto addio al volume cifrato (non credo ci sia un modo per 
recuperarlo o rigenerarlo).

3) Utilizzo macchinoso. Per usare un LUKS file container devi aprire il 
device LUKS , montare l'fs, usare il device, smontare l'fs e chiudere il 
device (sempre che l'header sia intatto, che la chiave sia intatta e che 
il file container sia intatto, che il filesystem sul file container sia 
intatto).

4) Come hai detto giustamente, viene creato un file blob e se viene 
corrotto, chissà se mai si riesce a riaprirlo, montarlo ecc.... (Non ho 
ancora provato a corrompere un Luks file container)

5) Overhead sull'utilizzo. Qui ci tengo a precisare che non ho fatto 
misurazioni tecniche in modo tale da avere una netta distinzione, ma da 
alcune prove di scrittura con dd c'è un calo di prestazioni dovuto ai 
diversi strati.

6) Troppo strati da gestire: disco fisico,(altri strati come mdadm o 
LVM, o VDO), FS, luks, FS. Per non parlare del problema di usare FS COW 
uno sopra all'altro tipo XFS (ok non è completamente COW) o btrfs o un 
mix (tipo host su zfs/btrfs e container su xfs) e si va in write 
amplification (che su SSD è pessimo per non parlare del degrado di 
prestazioni)

7) fallocate su un filesystem COW come ZFS e btrfs con compressione 
attiva è un delirio perche non permette di riservare spazio 
correttamente. Con fallocate il file viene visto pieno di \0 e su ZFS lo 
comprime all'osso (non ho provato con btrfs ma credo sia uguale) quindi 
bisognerebbe riempirlo di valori casuali con /dev/urandom ma anche in 
questo caso non è assicurato che n Gb vengano riservati per via della 
compressione. Il problema non è di fallocate ma di luks che richiede cmq 
uno spazio definito su cui lavorare. Giustamente è stato progettato per 
device e non file.

8) A volte potrebbe essere necessario aumentare la dimensione del file 
container e anche qui risulta complesso e rischioso. Praticamente 
bisogna riservare altro spazio con fallocate (cercando di non cancellare 
il vecchio), fare il resize del luks, aprire il device, fare il resize 
dell'fs (nel caso di XFS bisogna montare l'fs prima del resize, nel caso 
di ext4 se montato va fatto online se non montato richiede che il 
filesystem sia marcato come 'clean' quindi richiede e2fsck -f /dev/...) 
e via dicendo

Non ho fatto molte prove di trasferimento con rsync del LUKS file 
container, ho notato solo che con rsync e destinazione remota utilizza 
il delta-transfer per minimizzare i dati da trasferire. Con gocryptfs è 
come sincronizzare una semplice dir. Posso dire che se il processo di 
trasferimento viene killato con LUKS file container potrei ritrovarmi 
con un blob non utilizzabile/corrotto e con gocryptfs (quasi 
sicuramente) solo il file che sta trasferendo riporterebbe un problema 
(ma il resto del dataset rimane accessibile)

Al momento sto preferendo gocryptfs per i motivi sopra riportati (anche 
perche con LUKS file container si complica troppo). Se qualcuno ha 
esperienza su LUKS file container e ha consigli da darmi per risolvere i 
problemi riportati sono a disposizione.

Se ho detto cappe---te chiedo scusa in anticipo.

Saluti, Alessandro.
lmpx.com only provides a reader for public news (NNTP) servers. It is not affiliated with the servers or forums shown here and is not responsible for the content of articles, which is written by their respective authors.