Progetto

Generale

Profilo

EncryptedFilesystemUsingLUKS » Cronologia » Versione 30

Simone Piccardi, 22-05-2024 22:49

1 16 Simone Piccardi
h1. Gestire filesystem cifrati usando LUKS
2 1 Amministratore Truelite
3 30 Simone Piccardi
Un'opportuna protezione dei dati è una delle componenti essenziali di una politica di sicurezza, in particolare quando questi possono essere sensibili. Dato che i dati di un computer sono in genere mantenuti su disco, un eventuale furto (o copia) dello stesso comporta la possibilità di acquisirne tutti i contenuti. Per prevenire questa evenienza la soluzione utilizzata prevalentemente è quella di cifrare il contenuto del disco, in modo che i suoi contenuti non possano essere acceduti senza una opportuna autenticazione da parte di chi lo vuole utlizzare. 
4 19 Chiara Barbucci
5 30 Simone Piccardi
Sui sistemi Linux per cifrare i contenuti di un intero disco viene normalmente utilizzato "LUKS":https://gitlab.com/cryptsetup/cryptsetup, acronimo di "Linux Unified Key Setup", che si propone come standard per la crittografia dei dischi, offrendo un formato di cifratura "on-disc", la possibilità di avere più di una coppia chiave-passphrase per l'accesso ai contenuti ed una gestione sicura di tutte le chiavi. Varie distribuzioni (ad esempio Debian e derivate) consentono installare direttamente il sistema cifrando il disco; in questo caso tutte le operazioni vengono gestite dal programma di installazione e non le tratteremo qui, prenderemo in esame invece come effettuare la stessa operazione quando si aggiunge un disco esterno. 
6 1 Amministratore Truelite
7 30 Simone Piccardi
Dato che cifrare il disco ha comunque un impatto sulle prestazioni, in genere questo non viene fatto per i server, confidando sulla sicurezza dell'accesso fisico degli stessi, che si presume non consenta l'acquisizione dei loro dischi da parte di terzi malintenzionati. Ma anche con questa assunzione l'esigenza di cifrare il contenuto di un disco rimane, in particolare quando si usano dischi di backup rimovibili (che in genere devono essere spostati in una diversa collocazione per la realizzazione di una procedura elementare di disaster recovery) in modo da proteggere i dati in essi contenuti. 
8 29 Simone Piccardi
9
Più in generale si ha questa esigenza tutte le volte che si vogliono proteggere i dati salvati su un supporto esterno o su un disco aggiunto in un secondo tempo. In tal caso occorre eseguire le operazioni di gestione dei dischi cifrati manualmente, nelle modalità che esamineremo nel seguito. Infine un disco cifrato con LUKS, nel caso lo si sia formattato con una filesystem compatibile (es. vfat), è accessibile anche dai sistemi Windows usando "LibreCrypt":https://github.com/t-d-k/librecrypt. 
10 17 Simone Piccardi
11 13 Simone Piccardi
h2. Creazione di un disco cifrato
12 1 Amministratore Truelite
13 30 Simone Piccardi
Per utilizzare LUKS da Linux è necessaria una versione del programma @cryptsetup@ che lo supporti, ormai disponibile come pacchetto su tutte le distribuzioni. Si può comunque verificare la presenza del supporto con il comando @cryptsetup --help@ controllando in coda la presenza delle opzioni relative a LUKS. Nel caso in cui questo comando non fosse presente, su Debian lo si può installare semplicemente con:
14 1 Amministratore Truelite
15
<pre>
16 10 Simone Piccardi
apt-get install cryptsetup
17 9 Simone Piccardi
</pre>
18 8 Amministratore Truelite
19 27 Simone Piccardi
A questo punto è possibile iniziare il lavoro di preparazione del dispositivo, nel nostro esempio assumeremo il caso una chiavetta USB rilevata dal sistema come @/dev/sdd@.
20 1 Amministratore Truelite
21 27 Simone Piccardi
La prima cosa da fare è verificare l'affidabilità del dispositivo e, al tempo stesso, riempire tutto lo spazio disponibile con dei dati casuali, cosa che renderà molto più difficoltosi eventuali tentativi di attacco e compromissione del filesystem cifrato creato in seguito. Prima di iniziare, va tenuto presente il fatto che a seconda della dimensione del disco, questo processo può richiedere molte ore, quindi se dovete lanciarlo su di un disco molto grande, vi conviene farlo prima di andare a dormire.
22 1 Amministratore Truelite
23
<pre>
24 28 Simone Piccardi
shred -n2 -v -x /dev/sdd
25 1 Amministratore Truelite
</pre>
26 27 Simone Piccardi
27 28 Simone Piccardi
Se poi siete particolarmente paranoici potete aggiungere l'opzione @--random-source=/dev/urandom@ che usa il generatore di numeri casuali del sistema come sorgente di dati casuali. La casualità dei dati sarà migliore rispetto a quella del metodo precedente, ma l'operazione farà un uso intensivo della CPU e richiederà ancora più tempo.
28 12 Simone Piccardi
29 27 Simone Piccardi
Una volta completata la sovrascrittura, il disco deve essere partizionato. In questo caso l'obiettivo è creare un'unica partizione che occupi tutto lo spazio disponibile e per farlo ci sono diverse alternative, sia da linea di comando come @fdisk@ o @cfdisk@ che grafiche come @gparted@ e @qtparted@. Si assumerà di avere creato una sola partizione, riconosciuta dal sistema come @/dev/sdd1@. 
30 1 Amministratore Truelite
31 18 Simone Piccardi
A questo punto è possibile cifrare la partizione con LUKS e poi "agganciarla" al _device mapper_, in modo che possa essere presentata in maniera "trasparente" al sistema. E' molto importante la scelta di una passphrase abbastanza lunga e complessa poiché l'utilizzo di una frase corta e/o facilmente indovinabile vanificherebbe l'utilizzo della crittografia.
32 1 Amministratore Truelite
33 17 Simone Piccardi
Il primo passo è inizializzare il disco per la cifratura con LUKS; per questo si usa il comando:
34 1 Amministratore Truelite
35
<pre>
36 16 Simone Piccardi
# cryptsetup --verbose --verify-passphrase luksFormat /dev/sdd1
37
38
WARNING!
39
========
40 20 Chiara Barbucci
Questo sovrascriverà i dati in /dev/sdd1 in modo irreversibile.
41 16 Simone Piccardi
42
Are you sure? (Type uppercase yes): YES
43
Inserire la passphrase: 
44 1 Amministratore Truelite
Verifica passphrase: 
45 16 Simone Piccardi
Comando eseguito con successo.
46
</pre>
47 1 Amministratore Truelite
48 20 Chiara Barbucci
occorrerà confermare la formattazione del disco e poi inserire la passphrase, ripetendola due volte per verifica. 
49
A questo punto si potrà attivare il disco cifrato con:
50 1 Amministratore Truelite
51
<pre>
52 16 Simone Piccardi
# cryptsetup luksOpen /dev/sdd1 cifrato
53
Inserire la passphrase per /dev/sdd1: 
54
</pre>
55
56
dove si dovrà inserire, per poter accedere in chiaro ai dati del disco, la passphrase fornita con il comando precedente. 
57
58 17 Simone Piccardi
Se tutto è andato a buon fine, l'output del comando @ls /dev/mapper/@ dovrebbe restituire anche @cifrato@ fra i file presenti, confermando l'avvenuto "aggancio" della partizione criptata al _device mapper_, il quale fornirà su @/dev/mapper/cifrato@ il dispositivo su cui operare in chiaro. A questo punto si potrà creare un filesystem sulla partizione criptata con:
59 16 Simone Piccardi
60
<pre>
61 1 Amministratore Truelite
mkfs.ext4 /dev/mapper/cifrato
62
</pre>
63 12 Simone Piccardi
64 13 Simone Piccardi
e sarà possibile montarlo con:
65 1 Amministratore Truelite
66
<pre>
67
mount /dev/mapper/cifrato /mnt
68
</pre>
69
70 16 Simone Piccardi
Infine i comandi per smontare il filesystem e disabilitare l'accesso alla partizione criptata sono:
71 1 Amministratore Truelite
72
<pre>
73
umount /mnt
74
cryptsetup luksClose /dev/mapper/cifrato
75
</pre>
76
77
dove il secondo comando distacca il disco dal _device mapper_ (si potrà verificare che @/dev/mapper/cifrato@ non è più disponibile), rendendo impossibile l'accesso ai dati del disco.
78 17 Simone Piccardi
79 23 Chiara Barbucci
Si tenga presente che una volta formattato un disco con @luksFormat@ questo potrà essere identificato, oltre che con il nome di dispositivo classico, anche tramite l'UUID ad esso associato rendendo il riconoscimento dello stesso indipendente dall'eventuale presenza di altri dischi e dall'ordine con cui il kernel assegna i vari nomi @/dev/sdX@. 
80 20 Chiara Barbucci
In particolare nel nostro caso potremo individuare eventuali dischi cifrati con:
81 1 Amministratore Truelite
82
<pre>
83
# blkid -t TYPE="crypto_LUKS"
84 16 Simone Piccardi
/dev/sdd1: UUID="695fb63b-bb47-45d5-9561-15f6664c0296" TYPE="crypto_LUKS" PARTUUID="05548b2f-01"
85 1 Amministratore Truelite
</pre>
86
87
ed in tutti i comandi riguardanti LUKS si potrà usare, al posto dell'indicazione del dispositivo specifico (nel caso @/dev/sdd1@) l'indicazione dell'UUID (nella forma @UUID=695fb63b-bb47-45d5-9561-15f6664c0296@).
88
89
90 13 Simone Piccardi
h2. Utilizzo dei dischi cifrati
91
92 28 Simone Piccardi
Le distribuzioni sufficientemente moderne usano ??hal??, ??d-bus?? e ??gnome-volume-manager?? (o l'equivalente per altri desktop) per la gestione dei volumi disponibili nel sistema. Quando viene collegata al sistema una chiavetta USB (o altro disco rimovibile) contenente la partizione crittografata con LUKS, questa viene riconosciuta e compare una finestra che chiede di inserire la passphrase. Se la passphrase inserita è corretta, la partizione viene montata e sarà possibile utilizzarla normalmente da tutte le applicazioni.
93 1 Amministratore Truelite
94 26 Simone Piccardi
Qualora invece si intenda cifrare un disco di sistema (ad esempio un disco per i backup) da montare all'avvio, si deve ricorrere all'uso del file @/etc/crypttab@ che contiene l'elenco dei dischi cifrati che devono essere sbloccati, in modo tale da poterli poi usare normalmente dentro @/etc/fstab@. Si tenga conto che in questo caso la passphrase sarà chiesta all'avvio e che se non verrà fornita l'avvio si bloccherà sulla richiesta di montaggio del dispositivo. 
95 13 Simone Piccardi
96 20 Chiara Barbucci
Il formato di @/etc/crypttab@ prevede quattro campi separati da spazi. Il primo campo indica il nome che si darà al dispositivo cifrato sotto @/dev/mapper@ (nel caso dell'esempio precedente, @cifrato@), il secondo campo indica il dispositivo fisico e si può indicare con il nome dello stesso (nel nostro esempio @/dev/sdd1@), o con l'UUID come detto in precedenza. Oltre che con @blkid@ l'UUID si può ottenere anche con il comando:
97 1 Amministratore Truelite
98
<pre>
99 16 Simone Piccardi
# cryptsetup luksUUID /dev/sdd1 
100
695fb63b-bb47-45d5-9561-15f6664c0296
101 13 Simone Piccardi
</pre>
102
103 20 Chiara Barbucci
Il terzo campo indica le modalità con cui si sblocca il dispositivo ed il default di @none@ indica la necessità di fornire la passphrase sulla console. Si può comunque anche indicare un nome di un file (ad esempio da fornire su un dispositivo esterno) da cui questo verrà letto (in tal caso viene usato tutto il file e la passphrase in esso contenuta non deve terminare con un a capo). L'ultimo campo, che indica le opzioni con cui viene creato il dispositivo cifrato, nel nostro caso dovrà essere @luks@.
104 13 Simone Piccardi
105
Pertanto con un contenuto di @/etc/crypttab@ del tipo:
106 1 Amministratore Truelite
107 13 Simone Piccardi
<pre>
108 1 Amministratore Truelite
# <target name>	<source device>		<key file>	<options>
109 16 Simone Piccardi
cifrato		UUID=695fb63b-bb47-45d5-9561-15f6664c0296	none	luks
110 1 Amministratore Truelite
</pre>
111
112
potremo montare il disco cifrato sotto @/cifrato@ inserendo in @/etc/fstab@ la riga:
113
114
<pre>
115
/dev/mapper/cifrato   /cifrato      ext4    defaults        0       2
116
</pre>
117 13 Simone Piccardi
118 28 Simone Piccardi
Qualora invece si abbia la necessità di montare e smontare il disco in uno script (ad esempio in uno script per la gestione dei backup su un disco rimovibile) si pone il problema di come inserire la passphrase, che il comando normalmente richiede sia fornita su un terminale. In tal caso si potrà fargliela leggere da un file separato, ma è in genere preferibile inserire tutte le informazioni direttamente all'interno dello script, utilizzando una attivazione del disco cifrato nella forma:
119 16 Simone Piccardi
120 13 Simone Piccardi
<pre>
121 16 Simone Piccardi
echo -n passphraselungaecomplicata|cryptsetup luksOpen /dev/sdd1 cifrato --key-file=-
122
</pre>
123
124 1 Amministratore Truelite
(dove il @-n@ è importante, perché l'a capo inserito da @echo@ nella invocazione normale verrebbe letto come carattere della passphrase). 
125 16 Simone Piccardi
126 20 Chiara Barbucci
Ovviamente in questo caso la password sarà leggibile da chi ha accesso amministrativo alla macchina, ma la protezione è pensata per proteggere il disco quando viene rimosso e spostato altrove.
127 16 Simone Piccardi
128 17 Simone Piccardi
129 10 Simone Piccardi
h2. Gestione delle passphrase
130
131 30 Simone Piccardi
Una delle funzionalità più interessanti di LUKS è che il sistema consente l'uso di più passphrase (fino ad un massimo di 8) che possono essere aggiunte o rimosse (posto che almeno una resti presente per poter accedere al dispositivo). Il caso più comune è quello in cui si vuole aggiungere una nuova passphrase o cambiare quella esistente (che si realizza comunque per con una aggiunta seguita da una rimozione).
132 10 Simone Piccardi
133 12 Simone Piccardi
Il comando che consente di aggiungere una passphrase è il seguente:
134 10 Simone Piccardi
135
<pre>
136 16 Simone Piccardi
cryptsetup luksAddKey /dev/sdd1
137 10 Simone Piccardi
</pre>
138
139 17 Simone Piccardi
verrà chiesta una qualunque delle passphrase presenti per sbloccare l'accesso (all'inizio ce ne è una sola, quella impostata in fase di creazione, cui viene sempre assegnato l'indice 0) e poi l'immissione due volte della nuova passphrase. La passphrase sarà inserita nel primo degli slot disponibili (nel caso dell'esempio, se aggiunta dopo la creazione, questo sarà quello con indice 1) e potrà essere utilizzata in maniera equivalente a tutte le altre. Se lo scopo non era quello di aggiungere una nuova passhprase, ma solo quello di cambiarne una esistente, si potrà a questo punto passare alla rimozione di quella non voluta, cancellando il relativo slot.
140 12 Simone Piccardi
141
Per individuare lo slot si può usare il comando @cryptsetup luksDump@, ottenendo un risultato del tipo:
142 10 Simone Piccardi
<pre>
143 16 Simone Piccardi
cryptsetup luksDump /dev/sdd1
144
LUKS header information for /dev/sdd1
145 10 Simone Piccardi
146
...
147
148
Key Slot 0: ENABLED
149 1 Amministratore Truelite
        Iterations:             182965
150 10 Simone Piccardi
        Salt:                   50 6d 67 70 63 33 19 c6 41 e7 c1 55 b6 02 49 89 
151
                                54 79 7b 56 4e b6 78 92 c8 f8 66 e8 bb e6 a8 f1 
152
        Key material offset:    8
153 1 Amministratore Truelite
        AF stripes:             4000
154
Key Slot 1: ENABLED
155 10 Simone Piccardi
        Iterations:             144406
156
        Salt:                   56 35 b1 33 8d c9 0e b8 ba 10 a0 1c 4f 16 2b 8c 
157
                                d3 ec fe c8 5f 7f 23 74 79 ab 5d 96 ec 4c 4c 4a 
158
        Key material offset:    264
159
        AF stripes:             4000
160
Key Slot 2: DISABLED
161
Key Slot 3: DISABLED
162
Key Slot 4: DISABLED
163
Key Slot 5: DISABLED
164
Key Slot 6: DISABLED
165
Key Slot 7: DISABLED
166
</pre>
167 11 Simone Piccardi
168 10 Simone Piccardi
e a questo punto la rimozione della passhprase indesiderata (nello specifico quella dello slot 0) sarà effettuata con:
169 17 Simone Piccardi
170 10 Simone Piccardi
<pre>
171 16 Simone Piccardi
cryptsetup luksKillSlot /dev/sdd1 0
172 1 Amministratore Truelite
</pre>