EncryptedFilesystemUsingLUKS » Cronologia » Versione 16
Simone Piccardi, 14-03-2017 13:02
1 | 16 | Simone Piccardi | h1. Gestire filesystem cifrati usando LUKS |
---|---|---|---|
2 | 1 | Amministratore Truelite | |
3 | 16 | Simone Piccardi | Benché sia possibile (ad esempio nel caso di Debian e derivate) installare direttamente il sistema cifrando il disco, nel qual caso tutte le operazioni vengono gestire dal sistema di installazione, si pone talvolta la necessità di effettuare la stessa operazione quando si aggiunge un disco esterno. E' ad esempio il caso di farlo in caso di dischi di backup rimuovibili (nel caso si realizzi un sistema di disaster recovery che preveda lo spostamento degli stessi in una diversa locazione), in modo da proteggere i dati in essi contenuti, o in generale tutte le volte che si vuole proteggere i dati salvati su un supporto esterno. In tal caso occorre eseguire le operazioni manualmente, nelle modalità che esamineremo più avanti. |
4 | 1 | Amministratore Truelite | |
5 | 16 | Simone Piccardi | 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 lo standard per la crittografia dei dischi in sistemi Linux (e non solo), offrendo un formato standard "on-disc", la possibilità di avere più di una coppia chiave-passphrase per l'accesso ed una gestione sicura di tutte le chiavi. |
6 | |||
7 | 13 | Simone Piccardi | h2. Creazione di un disco cifrato |
8 | 1 | Amministratore Truelite | |
9 | 16 | Simone Piccardi | 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. Per utilizzarlo è necessaria una versione del programma @cryptsetup@ (che viene usato anche per la cifratura diretta con ''dm-crypt'') che lo supporti, ma questa è ormai disponibile su tutte le distribuzioni recenti. So 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 il comando non fosse presente, su Debian lo si può installare semplicemente con: |
10 | 9 | Simone Piccardi | |
11 | 1 | Amministratore Truelite | <pre> |
12 | 10 | Simone Piccardi | apt-get install cryptsetup |
13 | 9 | Simone Piccardi | </pre> |
14 | 8 | Amministratore Truelite | |
15 | 12 | Simone Piccardi | A questo punto è possibile iniziare il lavoro di preparazione del dispositivo, nel nostro esempio prenderemo il caso una chiavetta USB rilevata dal sistema come @/dev/sdc@. |
16 | 1 | Amministratore Truelite | |
17 | 12 | Simone Piccardi | La prima cosa da fare è verificare l'affidabilità del dispositivo ed, al tempo stesso, riempire tutto lo spazio disponibile con dei dati casuali rendendo di fatto molto più difficoltosi eventuali tentativi di attacco e compromissione del filesystem cifrato che verrà 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. |
18 | 1 | Amministratore Truelite | |
19 | <pre> |
||
20 | 12 | Simone Piccardi | badblocks -c 10240 -s -w -t random -v /dev/sdc |
21 | 2 | Amministratore Truelite | </pre> |
22 | 1 | Amministratore Truelite | |
23 | 10 | Simone Piccardi | Se siete particolarmente paranoici potete utilizzare @/dev/urandom@ come sorgente di dati casuali e riempirci il disco. 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. Il comando da eseguire è: |
24 | 1 | Amministratore Truelite | |
25 | 9 | Simone Piccardi | Il comando da eseguire è: |
26 | 1 | Amministratore Truelite | <pre> |
27 | 12 | Simone Piccardi | dd if=/dev/urandom of=/dev/sdc |
28 | 9 | Simone Piccardi | </pre> |
29 | 12 | Simone Piccardi | |
30 | 1 | Amministratore Truelite | Successivamente va partizionato il disco. In questo caso l'obiettivo è di 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 supponga comunque di aver creata una sola partizione, riconosciuta dal sistema come @/dev/sdc1@. |
31 | |||
32 | A questo punto è possibile cifrare la partizione con LUKS e poi "agganciarla" al _device-mapper_, in modo che ''dm-crypt'' possa presentarla 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. |
||
33 | |||
34 | 16 | Simone Piccardi | Il primo passo è inizializzare il disco per la cifratura con LUKS, per questo si usa il comando: |
35 | 1 | Amministratore Truelite | |
36 | <pre> |
||
37 | 16 | Simone Piccardi | # cryptsetup --verbose --verify-passphrase luksFormat /dev/sdd1 |
38 | |||
39 | WARNING! |
||
40 | ======== |
||
41 | Ciò sovrascriverà i dati in /dev/sdd1 in modo irreversibile. |
||
42 | |||
43 | Are you sure? (Type uppercase yes): YES |
||
44 | Inserire la passphrase: |
||
45 | Verifica passphrase: |
||
46 | Comando eseguito con successo. |
||
47 | 1 | Amministratore Truelite | </pre> |
48 | |||
49 | 16 | Simone Piccardi | in cui occorre confermare la formattazione del disco, e poi inserire la passphrase ripetendola due volte per verifica. 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 | 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_, che 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 | |||
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 | 13 | Simone Piccardi | <pre> |
67 | 1 | Amministratore Truelite | 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 | 16 | Simone Piccardi | dopo 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 | |||
79 | Si tenga presente che una volta che si sia 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@. In particolare nel nostro caso potremo individuare eventuali dischi cifrati con: |
||
80 | |||
81 | <pre> |
||
82 | # blkid -t TYPE="crypto_LUKS" |
||
83 | /dev/sdd1: UUID="695fb63b-bb47-45d5-9561-15f6664c0296" TYPE="crypto_LUKS" PARTUUID="05548b2f-01" |
||
84 | </pre> |
||
85 | |||
86 | 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@). |
||
87 | |||
88 | |||
89 | 13 | Simone Piccardi | h2. Utilizzo dei dischi cifrati |
90 | |||
91 | Le distribuzioni sufficientemente moderne usano ??hal??, ??d-bus?? e ??gnome-volume-manager?? (o l'equivalente per KDE) per la gestione dei volumi disponibili nel sistema: quando viene collegata al sistema una chiavetta USB 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. |
||
92 | 1 | Amministratore Truelite | |
93 | 13 | 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 di norma la passphrase sarà chiesta all'avvio, che si bloccherà alla richiesta di montaggio del dispositivo se questa non viene fornita. |
94 | |||
95 | 16 | Simone Piccardi | Il formato del file prevede quattro campi, separati da spazi, il primo indica il nome che si darà al device cifrato sotto @/dev/mapper@ (nel caso sarebbe @cifrato@), il secondo indica il dispositivo fisico e si può indicare con il nome dello stesso (nel nostro esempio @/dev/sdd1@), o con l'UUID dello stesso, che si può ottenere anche con il comando: |
96 | 1 | Amministratore Truelite | |
97 | <pre> |
||
98 | 16 | Simone Piccardi | # cryptsetup luksUUID /dev/sdd1 |
99 | 695fb63b-bb47-45d5-9561-15f6664c0296 |
||
100 | 13 | Simone Piccardi | </pre> |
101 | |||
102 | 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 i device cifrato, nel nostro caso dovrà essere @luks@. |
||
103 | |||
104 | Pertanto con un contenuto di @/etc/crypttab@ del tipo: |
||
105 | 1 | Amministratore Truelite | |
106 | 13 | Simone Piccardi | <pre> |
107 | 1 | Amministratore Truelite | # <target name> <source device> <key file> <options> |
108 | 16 | Simone Piccardi | cifrato UUID=695fb63b-bb47-45d5-9561-15f6664c0296 none luks |
109 | 1 | Amministratore Truelite | </pre> |
110 | |||
111 | potremo montare il disco cifrato sotto @/cifrato@ inserendo in @/etc/fstab@ la riga: |
||
112 | |||
113 | <pre> |
||
114 | /dev/mapper/cifrato /cifrato ext4 defaults 0 2 |
||
115 | 13 | Simone Piccardi | </pre> |
116 | 1 | Amministratore Truelite | |
117 | 16 | 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 rimuovibile) 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: |
118 | 13 | Simone Piccardi | |
119 | 16 | Simone Piccardi | <pre> |
120 | echo -n passphraselungaecomplicata|cryptsetup luksOpen /dev/sdd1 cifrato --key-file=- |
||
121 | </pre> |
||
122 | |||
123 | (dove il @-n@ è importante, perché l'a capo inserito da @echo@ nella invocazione normale verrebbe letto come carattere della passphrase). |
||
124 | |||
125 | Ovviamente in questo caso la password sarà leggibile da chi ha accesso amministrativo alla macchina, ma in questo caso la protezione è pensata per proteggere il disco quando viene rimosso e spostato altrove. |
||
126 | |||
127 | 10 | Simone Piccardi | h2. Gestione delle passphrase |
128 | |||
129 | 16 | Simone Piccardi | Una delle funzionalità più interessanti di LUKS, che lo rende preferibile rispetto all'uso diretto del ''dm-crypt'' elementare, è che il sistema consente l'uso di più password (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 password o cambiare quella esistente (che si realizza comunque per con una aggiunta seguita da una rimozione). |
130 | 10 | Simone Piccardi | |
131 | 12 | Simone Piccardi | Il comando che consente di aggiungere una passphrase è il seguente: |
132 | 10 | Simone Piccardi | |
133 | <pre> |
||
134 | 16 | Simone Piccardi | cryptsetup luksAddKey /dev/sdd1 |
135 | 10 | Simone Piccardi | </pre> |
136 | |||
137 | verrà chiesta una delle passphrase presenti (all'inizio ce ne è una sola, quella impostata in fase di creazione, cui viene sempre assegnato l'indice 0) per sbloccare l'accesso e poi l'immissione due volte della nuova passwphrase. 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 quelle presenti. Se lo scopo non era quello di aggiungere una passhprase, ma quello di cambiare la precedente, si potrà a questo punto passare alla rimozione di quella non voluta, cancellando il relativo slot. |
||
138 | 12 | Simone Piccardi | |
139 | Per individuare lo slot si può usare il comando @cryptsetup luksDump@, ottenendo un risultato del tipo: |
||
140 | 10 | Simone Piccardi | <pre> |
141 | 16 | Simone Piccardi | cryptsetup luksDump /dev/sdd1 |
142 | LUKS header information for /dev/sdd1 |
||
143 | 10 | Simone Piccardi | |
144 | ... |
||
145 | |||
146 | Key Slot 0: ENABLED |
||
147 | 1 | Amministratore Truelite | Iterations: 182965 |
148 | 10 | Simone Piccardi | Salt: 50 6d 67 70 63 33 19 c6 41 e7 c1 55 b6 02 49 89 |
149 | 54 79 7b 56 4e b6 78 92 c8 f8 66 e8 bb e6 a8 f1 |
||
150 | Key material offset: 8 |
||
151 | 1 | Amministratore Truelite | AF stripes: 4000 |
152 | 10 | Simone Piccardi | Key Slot 1: ENABLED |
153 | Iterations: 144406 |
||
154 | Salt: 56 35 b1 33 8d c9 0e b8 ba 10 a0 1c 4f 16 2b 8c |
||
155 | d3 ec fe c8 5f 7f 23 74 79 ab 5d 96 ec 4c 4c 4a |
||
156 | Key material offset: 264 |
||
157 | AF stripes: 4000 |
||
158 | Key Slot 2: DISABLED |
||
159 | Key Slot 3: DISABLED |
||
160 | Key Slot 4: DISABLED |
||
161 | Key Slot 5: DISABLED |
||
162 | Key Slot 6: DISABLED |
||
163 | Key Slot 7: DISABLED |
||
164 | 11 | Simone Piccardi | </pre> |
165 | 10 | Simone Piccardi | |
166 | 12 | Simone Piccardi | e a questo punto la rimozione della passhprase indesiderata (nello specifico quella dello slot 0) sarà effettuata con: |
167 | 10 | Simone Piccardi | <pre> |
168 | 16 | Simone Piccardi | cryptsetup luksKillSlot /dev/sdd1 0 |
169 | 1 | Amministratore Truelite | </pre> |