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.