Volumi criptati LUKS - Creazione e uso con cryptmount: differenze tra le versioni

nessun oggetto della modifica
Nessun oggetto della modifica
Nessun oggetto della modifica
Riga 1: Riga 1:
{{Versioni compatibili|Debian Lenny 5.0<br/>Debian Squeeze|}}
{{Versioni compatibili|Debian Lenny 5.0<br/>Debian Squeeze|}}
=Introduzione=
=Introduzione=
Un accesso indesiderato ai nostri dati si tende a pensare che possa avvenire da un'intrusione da rete. Certamente questo è lo scenario tipico, ma non bisognerebbe scordare che il più delle volte per accedere a un dato contenuto su un certo supporto, basta avere accesso "fisico" al supporto stesso.
Generalmente si tende a pensare che un accesso indesiderato ai nostri dati possa avvenire da un'intrusione da rete. Certamente questo è lo scenario tipico, ma non bisognerebbe scordare che il più delle volte per accedere a un dato contenuto su un certo supporto, basta avere accesso "fisico" al supporto stesso.
Questo è molto più importante oggi giorno di quanto non fosse fino a pochi anni fa a causa della diffusione di sistemi di memorizzazione di massa portabili, estremamente comodi e che ci stiamo abituando ad avere sempre con noi, nello zaino, in una tasca o marsupio.
Questo è molto più importante oggi giorno di quanto non fosse fino a pochi anni fa a causa della diffusione di sistemi di memorizzazione di massa portabili, estremamente comodi e che ci stiamo abituando ad avere sempre con noi, nello zaino, in una tasca o marsupio.
Altro scenario interessante è quello nel quale i dati in questione sono contenuti in un computer acceso e connesso alla rete, ma sono dati che ci interessa avere a disposizione esclusiva del nostro utente, e quindi se un'intrusione ci deve proprio essere è utile rendere all'intruso la vita molto dura nell'ottenimento di quei dati sensibili.
Altro scenario interessante è quello nel quale i dati in questione sono contenuti in un computer acceso e connesso alla rete, ma sono dati che ci interessa avere a disposizione esclusiva del nostro utente, e quindi se un'intrusione ci deve proprio essere è utile rendere all'intruso la vita molto dura nell'ottenimento di quei dati sensibili.
In questa guida sono contenuti i passi necessari per cifrare una partizione o una periferica (rimovibile o meno) o creare un file che useremo come loop device cifrata (con il vantaggio di essere estremamente trasportabile e archiviabile). Questo sarà mostrato nello scenario più semplice, quello con accesso ai file da parte di un singolo utente. La tecnologia usata però è quella nota col nome di [http://luks.endorphin.org/ LUKS] (Linux Unified Keys Setup) che consente l'utilizzo della crittografia in scenari molto più articolati, con una base di compatibilità che andrà sempre crescendo in tutto il mondo linux (questo è uno degli obiettivi del progetto). È bene fare le cose fin da subito compatibili con uno standard che sarà sempre più importante oltre che ricco di potenzialità, soprattutto pensando a quanto la riservatezza dei propri dati digitali sia sempre più sentita come importante anche dagli utenti semplici.
In questa guida sono contenuti i passi necessari per cifrare una partizione o una periferica (rimovibile o meno) o creare un file che useremo come loop device cifrata (con il vantaggio di essere estremamente trasportabile e archiviabile). Questo sarà mostrato nello scenario più semplice, quello con accesso ai file da parte di un singolo utente. La tecnologia usata però è quella nota col nome di [http://luks.endorphin.org/ LUKS] (Linux Unified Keys Setup) che consente l'utilizzo della crittografia in scenari molto più articolati, con una base di compatibilità che andrà sempre crescendo in tutto il mondo Linux (questo è uno degli obiettivi del progetto). È bene fare le cose fin da subito compatibili con uno standard che sarà sempre più importante oltre che ricco di potenzialità, soprattutto pensando a quanto la riservatezza dei propri dati digitali sia sempre più sentita come importante anche dagli utenti semplici.


Le tecniche mostrate in questa guida sono ancora "rozze" nel senso che richiedono per l'utente che le usa di autenticarsi come root, però possono costituire una base di partenza. {{Box|Disclaimer|Appena riuscirò a trovare la tecnica per evitare l'autenticazione come root, aggiornerò questa guida, rendendo la cifratura più adatta a sistemi multi-utente}}
Le tecniche mostrate in questa guida sono ancora "rozze" nel senso che richiedono per l'utente che le usa di autenticarsi come root, però possono costituire una base di partenza. {{Box|Disclaimer|Appena riuscirò a trovare la tecnica per evitare l'autenticazione come root, aggiornerò questa guida, rendendo la cifratura più adatta a sistemi multi-utente}}
Riga 42: Riga 42:


</pre>
</pre>
Ovviamente a noi interessa la sezione che inizia con '''name        : aes'''. Se non dovesse comparire dobbiamo controllare che il modulo '''aes''' sia caricato e ottenere un output simile a questo: <pre>$ lsmod | grep aes
Ovviamente a noi interessa la sezione che inizia con <code>'''name        : aes'''</code>. Se non dovesse comparire dobbiamo controllare che il modulo <code>'''aes'''</code> sia caricato e ottenere un output simile a questo: <pre>$ lsmod | grep aes
aes                    28160  2</pre>.
aes                    28160  2</pre>.
Se l'output dovesse essere vuoto dobbiamo caricare il modulo '''aes''' con l'usuale comando:<pre># modprobe aes</pre>
Se l'output dovesse essere vuoto dobbiamo caricare il modulo <code>'''aes'''</code> con l'usuale comando:<pre># modprobe aes</pre>


AES ci serve per la cifratura, ora dobbiamo pensare all'hash. Per l'hash serve l'algoritmo sha256 (ovviamente potremmo voler usare lo sha512, per cui basterebbe cambiare il 256 in 512 in ogni occorrenza). Dovrebbe essere precompilato nel kernel Debian, ma non è detto che sia caricato (in /proc/crypto, soprariportato, non è infatti presente) quindi carichiamolo:<pre># modprobe sha256_generic</pre>
AES ci serve per la cifratura, ora dobbiamo pensare all'hash. Per l'hash serve l'algoritmo <code>sha256 </code>(ovviamente potremmo voler usare lo <code>sha512</code>, per cui basterebbe cambiare il 256 in 512 in ogni occorrenza). Dovrebbe essere precompilato nel kernel Debian, ma non è detto che sia caricato (in <code>/proc/crypto</code>, soprariportato, non è infatti presente) quindi carichiamolo:<pre># modprobe sha256_generic</pre>
Nel file <code>/proc/crypto</code> si dovrebbero essere aggiunte le seguenti righe:<pre>name        : sha256
Nel file <code>/proc/crypto</code> si dovrebbero essere aggiunte le seguenti righe:<pre>name        : sha256
driver      : sha256-generic
driver      : sha256-generic
Riga 65: Riga 65:
digestsize  : 28</pre>
digestsize  : 28</pre>


Infine l'ultimo modulo da caricare nel kernel è dm-crypt, la cui assenza impedisce a cryptsetup di completare le operazioni richieste.<pre># modprobe dm-crypt</pre>
Infine l'ultimo modulo da caricare nel kernel è <code>dm-crypt</code>, la cui assenza impedisce a cryptsetup di completare le operazioni richieste.<pre># modprobe dm-crypt</pre>


==Kernel personalizzato==
==Kernel personalizzato==
Riga 79: Riga 79:
==Creare la partizione criptata==
==Creare la partizione criptata==
Per chi invece di cifrare un file montato in loop, deve cifrare una block device ordinaria, basta che sappia quale nome le abbia assegnato il kernel (con precisione, perché la procedura seguente cancellerà tutti i dati nella periferica).
Per chi invece di cifrare un file montato in loop, deve cifrare una block device ordinaria, basta che sappia quale nome le abbia assegnato il kernel (con precisione, perché la procedura seguente cancellerà tutti i dati nella periferica).
{{Box|Periferiche|D'ora in poi chiameremo /dev/periferica la block device sulla quale scriveremo i dati cifrati, sia essa la periferica in loop del paragrafo precedente (/dev/loop/0) o una periferica ordinaria}}
{{Box|Periferiche|D'ora in poi chiameremo <code>/dev/periferica</code> la block device sulla quale scriveremo i dati cifrati, sia essa la periferica in loop del paragrafo precedente (<code>/dev/loop/0</code>) o una periferica ordinaria}}
Creiamo la partizione LUKS:<pre># cryptsetup --verify-passphrase --verbose --hash=sha256 --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/periferica
Creiamo la partizione LUKS:<pre># cryptsetup --verify-passphrase --verbose --hash=sha256 --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/periferica


Riga 86: Riga 86:
This will overwrite data on /dev/periferica irrevocably.
This will overwrite data on /dev/periferica irrevocably.


Are you sure? (Type uppercase yes):  </pre>Come dice il messaggio bisogna rispondere con uno '''YES''' interamente maiuscolo.
Are you sure? (Type uppercase yes):  </pre>Come dice il messaggio bisogna rispondere con uno <code>'''YES'''</code> interamente maiuscolo.
Ci verrà di seguito chiesta una parola d'ordine e la sua conferma; mentre le digiteremo non vedremo nulla cambiare nel terminale:<pre>Enter LUKS passphrase:
Ci verrà di seguito chiesta una parola d'ordine e la sua conferma; mentre le digiteremo non vedremo nulla cambiare nel terminale:<pre>Enter LUKS passphrase:
Verify passphrase:
Verify passphrase:
Command successful.</pre>
Command successful.</pre>
==Mappare e montare la partizione criptata==
==Mappare e montare la partizione criptata==
A questo punto dobbiamo dare istruzioni al device mapper di mappare la periferica LUKS appena creata in una block device virtuale sulla quale scrivere i nostri dati in chiaro (e poi essi saranno scritti cifrati su /dev/periferica):<pre># cryptsetup luksOpen /dev/periferica criptata</pre>Questo creerà la periferica '''/dev/mapper/criptata''', sulla quale noi andremo a creare il file system che più ci interessa (su periferiche piccole come quella in esempio non conviene usare un file system con indicizzazione come reiserfs o ext3, bensì un più semplice ext2 o una fat):<pre># mkfs -t ext2 /dev/mapper/criptata</pre>Non ci rimane che montarla in una cartella di prova per verificare che sia tutto corretto (funzionamento, dimensioni desiderate ecc.):<pre># mount -t auto /dev/mapper/criptata /mnt/prova</pre>
A questo punto dobbiamo dare istruzioni al device mapper di mappare la periferica LUKS appena creata in una block device virtuale sulla quale scrivere i nostri dati in chiaro (e poi essi saranno scritti cifrati su <code>/dev/periferica</code>):<pre># cryptsetup luksOpen /dev/periferica criptata</pre>Questo creerà la periferica <code>'''/dev/mapper/criptata'''</code>, sulla quale noi andremo a creare il file system che più ci interessa (su periferiche piccole come quella in esempio non conviene usare un file system con indicizzazione come reiserfs o ext3, bensì un più semplice ext2 o una fat):<pre># mkfs -t ext2 /dev/mapper/criptata</pre>Non ci rimane che montarla in una cartella di prova per verificare che sia tutto corretto (funzionamento, dimensioni desiderate ecc.):<pre># mount -t auto /dev/mapper/criptata /mnt/prova</pre>


=Rimozione della periferica criptata=
=Rimozione della periferica criptata=
Riga 97: Riga 97:
# /sbin/cryptsetup luksClose criptata</pre>
# /sbin/cryptsetup luksClose criptata</pre>
==Rimozione di una loop device==
==Rimozione di una loop device==
Nel caso che la nostra periferica sia un file montato in loop, è consigliabile eliminare il collegamento che il nostro file immagine ha con la periferica loop cui l'abbiamo associato; questo ci permetterà di spostare o eliminare il file senza creare malfunzionamenti nelle periferiche di loop, così come ci consentirà di aprire nuove periferiche in loop ripartendo dalla numero 0:<pre># /sbin/losetup -d /dev/loop0</pre>
Nel caso in cui la nostra periferica sia un file montato in loop, è consigliabile eliminare il collegamento che il nostro file immagine ha con la periferica loop cui l'abbiamo associato; questo ci permetterà di spostare o eliminare il file senza creare malfunzionamenti nelle periferiche di loop, così come ci consentirà di aprire nuove periferiche in loop ripartendo dalla numero 0:<pre># /sbin/losetup -d /dev/loop0</pre>


=Automatizzazione dei passi necessari=
=Automatizzazione dei passi necessari=
Riga 153: Riga 153:
         ;;
         ;;
esac</pre>
esac</pre>
Nello script ho inserito il comando ''touch'' per impostare all'ora attuale le date di ultimo accesso e modifica del file criptata.img.
Nello script ho inserito il comando <code>touch</code> per impostare all'ora attuale le date di ultimo accesso e modifica del file criptata.img.
Ho ritenuto importante una modifica esplicita di queste informazioni del file, perché può risultare molto più comodo sapere quali file cifrati sono stati aperti di recente, nel caso se ne vogliano fare delle copie di backup.
Ho ritenuto importante una modifica esplicita di queste informazioni del file, perché può risultare molto più comodo sapere quali file cifrati sono stati aperti di recente, nel caso se ne vogliano fare delle copie di backup.
Se non si inserisce quella riga, programmi di backup (che spesso si appoggiano su ''librsync'') non possono accorgersi che il file cifrato è stato cambiato o è stato aperto di recente e non lo considerano nel sincronizzare le varie copie.
Se non si inserisce quella riga, programmi di backup (che spesso si appoggiano su ''librsync'') non possono accorgersi che il file cifrato è stato cambiato o è stato aperto di recente e non lo considerano nel sincronizzare le varie copie.


==Script per periferica ordinaria==
==Script per periferica ordinaria==
In questo esempio viene usata la prima partizione di una scheda di memoria SD (/dev/mmcblk0p1 con lettore compatibile con il modulo sdhci).
In questo esempio viene usata la prima partizione di una scheda di memoria SD (<code>/dev/mmcblk0p1</code> con lettore compatibile con il modulo sdhci).
<pre>#!/bin/bash
<pre>#!/bin/bash


1 508

contributi