Volumi criptati LUKS - Creazione e uso con cryptmount: differenze tra le versioni
m (ha spostato Creare una partizione criptata nello standard LUKS a Volumi criptati LUKS - Creazione e uso con cryptmount: Titolo cambiato su richiesta dell'autore della guida.) |
S3v (discussione | contributi) m (modifiche minori) |
||
Riga 1: | Riga 1: | ||
{{Versioni compatibili|Lenny|Squeeze|}} | {{Versioni compatibili|Lenny|Squeeze|}} | ||
== Introduzione == | == Introduzione == | ||
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. | 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.<br/> | ||
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.<br/> | ||
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.<br/> | ||
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 riflettendo sull'accresciuta rilevanza data alla riservatezza dei propri dati digitali, 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 riflettendo sull'accresciuta rilevanza data alla riservatezza dei propri dati digitali, anche dagli utenti semplici. | ||
{{Box|Disclaimer|Questa guida è in fase di aggiornamento. Verrà introdotto l'uso di cryptmount per consentire di lavorare completamente da utente, dovendo root solo compilare un file di configurazione globale (in /etc).}} | {{Box|Disclaimer|Questa guida è in fase di aggiornamento. Verrà introdotto l'uso di cryptmount per consentire di lavorare completamente da utente, dovendo [[root]] solo compilare un file di configurazione globale (in <code>/etc</code>).}} | ||
La distribuzione cui ci si riferisce è Squeeze, ma il discorso dovrebbe subire modifiche minime o nulle per Lenny, Wheezy e Sid. | La distribuzione cui ci si riferisce è Squeeze, ma il discorso dovrebbe subire modifiche minime o nulle per Lenny, Wheezy e Sid. | ||
== Prerequisiti e preparazione del sistema == | == Prerequisiti e preparazione del sistema == | ||
=== Kernel precompilato Debian === | === Kernel precompilato Debian === | ||
{{Box|Hardware|A livello hardware la cifratura con algoritmo AES è molto leggera quindi può essere eseguita anche su macchine molto datate, o piccoli sistemi embedded.}} | {{Box|Hardware|A livello hardware la cifratura con algoritmo AES è molto leggera quindi può essere eseguita anche su macchine molto datate, o piccoli sistemi embedded.}} | ||
La prima cosa da controllare prima di cimentarsi nella criptazione è l'abilitazione del kernel a usare l'algoritmo AES. | La prima cosa da controllare prima di cimentarsi nella criptazione è l'abilitazione del kernel a usare l'algoritmo AES.<br/> | ||
In un terminale eseguiamo<pre>$ cat /proc/crypto</pre> e con il kernel 3.0.0-1-686-pae (attualmente in Sid) dovremmo ottenere (in base anche ai moduli caricati) qualcosa tipo<pre>name : aes | In un terminale eseguiamo: | ||
<pre>$ cat /proc/crypto</pre> | |||
e con il kernel 3.0.0-1-686-pae (attualmente in Sid) dovremmo ottenere (in base anche ai moduli caricati) qualcosa tipo: | |||
<pre> | |||
name : aes | |||
driver : aes-asm | driver : aes-asm | ||
module : aes_i586 | module : aes_i586 | ||
Riga 42: | Riga 46: | ||
blocksize : 64 | blocksize : 64 | ||
digestsize : 16</pre> | digestsize : 16</pre> | ||
Ovviamente a noi interessano le sezioni che iniziano con <code>'''name : aes'''</code>. Se non dovessero comparire dobbiamo controllare che i moduli responsabili dell'<code>'''aes'''</code> siano caricati e ottenere un output simile a questo: <pre>$ lsmod |grep aes | Ovviamente a noi interessano le sezioni che iniziano con <code>'''name : aes'''</code>. Se non dovessero comparire dobbiamo controllare che i moduli responsabili dell'<code>'''aes'''</code> siano caricati e ottenere un output simile a questo: | ||
<pre> | |||
$ lsmod |grep aes | |||
aes_i586 16608 0 | aes_i586 16608 0 | ||
aes_generic 37066 1 aes_i586 | aes_generic 37066 1 aes_i586 | ||
</pre>(o aes-x86_64 in caso di architettura per kernel amd64). | </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). È precompilato nel kernel Debian, ma non è detto che sia caricato (nel <code>/proc/crypto</code>, soprariportato, non è infatti presente) quindi carichiamolo:<pre># modprobe sha256_generic</pre> | (o aes-x86_64 in caso di architettura per kernel amd64).<br/> | ||
Nel file <code>/proc/crypto</code> si dovrebbero essere aggiunte le seguenti righe:<pre>name : sha256 | 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). È precompilato nel kernel Debian, ma non è detto che sia caricato (nel <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 | |||
driver : sha256-generic | driver : sha256-generic | ||
module : sha256_generic | module : sha256_generic | ||
Riga 71: | Riga 81: | ||
=== Kernel personalizzato === | === Kernel personalizzato === | ||
Se non usiamo un kernel precompilato Debian, dobbiamo controllare che l'algoritmo di cifratura sia stato compilato: dal menu "'''Linux Kernel Configuration'''" seguiamo la voce "'''Cryptographic options --->'''" e abilitiamo la voce <pre>AES cipher algorithms</pre> o la strettamente legata <pre>AES cipher algorithms (i586)</pre> | Se non usiamo un kernel precompilato Debian, dobbiamo controllare che l'algoritmo di cifratura sia stato compilato: dal menu "'''Linux Kernel Configuration'''" seguiamo la voce "'''Cryptographic options --->'''" e abilitiamo la voce: | ||
<pre>AES cipher algorithms</pre> | |||
o la strettamente legata: | |||
<pre>AES cipher algorithms (i586)</pre> | |||
Sistemato il kernel passiamo all'installazione del software necessario:<pre># aptitude install cryptmount cryptsetup</pre>che installerà tutte le dipendenze necessarie (poche e piccole: l'installazione completa di tutte le dipendenze sta nei 2MB di spazio disco). | Sistemato il kernel passiamo all'installazione del software necessario: | ||
<pre># aptitude install cryptmount cryptsetup</pre> | |||
che installerà tutte le dipendenze necessarie (poche e piccole: l'installazione completa di tutte le dipendenze sta nei 2MB di spazio disco). | |||
== Preparazione del file o della periferica == | == Preparazione del file o della periferica == | ||
Per la preparazione del file system (su file o su periferica a blocchi fisica) criptato secondo LUKS possiamo usare cryptmount se vogliamo caratteristiche base di quest'ultimo. Per avere accesso a un supporto completo di LUKS, come dice il manuale stesso di crytpmount, è necessario usare cryptsetup. | Per la preparazione del file system (su file o su periferica a blocchi fisica) criptato secondo LUKS possiamo usare cryptmount se vogliamo caratteristiche base di quest'ultimo. Per avere accesso a un supporto completo di LUKS, come dice il manuale stesso di crytpmount, è necessario usare cryptsetup. | ||
===Cryptsetup=== | ===Cryptsetup=== | ||
Per preparare un file di dimensione fissata (in base alla quantità e tipo di dati che vorremo salvare cifrati) usiamo il comando <code>dd</code>:<pre>$ dd if=/dev/zero of=/home/nomeutente/immagine_cifrata ibs=1M count=10</pre>per creare un file da poi usare di 10MB nella home dell'utente nomeutente (queste dimensioni ridottissime sono adatte a una prova o per pochi dati che possono essere anche spediti in modo sicuro come allegato a un messaggio di posta). | Per preparare un file di dimensione fissata (in base alla quantità e tipo di dati che vorremo salvare cifrati) usiamo il comando <code>dd</code>:<pre>$ dd if=/dev/zero of=/home/nomeutente/immagine_cifrata ibs=1M count=10</pre> | ||
per creare un file da poi usare di 10MB nella home dell'utente ''nomeutente'' (queste dimensioni ridottissime sono adatte a una prova o per pochi dati che possono essere anche spediti in modo sicuro come allegato a un messaggio di posta). | |||
==== File ordinario montato in loop ==== | ==== File ordinario montato in loop ==== | ||
Autentichiamoci come root e montiamo il file appena creato in loop. Prima di tutto impostiamo il file appena creato come una loop device (controllare la prima periferica loop libera con <code>losetup -f</code>):<pre># /sbin/losetup /dev/loop/0 /home/nomeutente/immagine_cifrata</pre> | Autentichiamoci come root e montiamo il file appena creato in loop. Prima di tutto impostiamo il file appena creato come una loop device (controllare la prima periferica loop libera con <code>losetup -f</code>): | ||
<pre># /sbin/losetup /dev/loop/0 /home/nomeutente/immagine_cifrata</pre> | |||
==== Periferica a blocchi fisica ==== | ==== Periferica a blocchi fisica ==== | ||
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 <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}} | {{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 | |||
WARNING! | WARNING! | ||
Riga 90: | Riga 108: | ||
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 <code>'''YES'''</code> interamente maiuscolo. | Are you sure? (Type uppercase yes): </pre> | ||
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: | Come dice il messaggio bisogna rispondere con uno <code>'''YES'''</code> interamente maiuscolo.<br/> | ||
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 <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 | 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 ==== | ||
Per rimuovere la periferica cifrata bisogna innanzi tutto smontarla, poi bisogna dire a ''cryptsetup'' di chiudere la periferica (il che automaticamente eliminerà il nodo creato dal device mapper):<pre># umount /mnt/prova | Per rimuovere la periferica cifrata bisogna innanzi tutto smontarla, poi bisogna dire a ''cryptsetup'' di chiudere la periferica (il che automaticamente eliminerà il nodo creato dal device mapper): | ||
# /sbin/cryptsetup luksClose criptata</pre> | <pre> | ||
# umount /mnt/prova | |||
# /sbin/cryptsetup luksClose criptata | |||
</pre> | |||
==== Rimozione di una loop device ==== | ==== Rimozione di una loop device ==== | ||
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> | 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> | |||
=== Cryptmount === | === Cryptmount === | ||
Il passo di base da compiere con cryptmount è compilare il file di configurazione. Per questa operazione e per usare l'opzione <code>--generate-key</key> è necessario essere super utente (quello col costumino azzurro attillatissimo sotto i mutandoni rossi...). | Il passo di base da compiere con cryptmount è compilare il file di configurazione. Per questa operazione e per usare l'opzione <code>--generate-key</key> è necessario essere super utente (quello col costumino azzurro attillatissimo sotto i mutandoni rossi...).<br/> | ||
Eccone un esempio | Eccone un esempio: | ||
<pre>criptata { | <pre>criptata { | ||
keyformat=luks | keyformat=luks | ||
Riga 116: | Riga 145: | ||
cipher=aes | cipher=aes | ||
}</pre> | }</pre> | ||
Gli aspetti che merita notare sono il formato per gestione delle chiavi (per visualizzare i formati disponibili dare il comando <code>cryptmount -k</code>) impostato qui a luks. Il formato <code>builtin</code> salva la chiave in un file separato (da specificare nel campo <code>keyfile</code>). In luks invece la chiave è conservata all'inizio del file system. {{Box|Nota|Questa assunzione fatta da luks (che le chiavi, che possono essere multiple, risiedano all'inizio del file system) impedisce l'uso di luks con la possibilità di cryptmount di creare più file system criptati all'interno della stessa periferica. }} | Gli aspetti che merita notare sono il formato per gestione delle chiavi (per visualizzare i formati disponibili dare il comando <code>cryptmount -k</code>) impostato qui a luks. Il formato <code>builtin</code> salva la chiave in un file separato (da specificare nel campo <code>keyfile</code>). In luks invece la chiave è conservata all'inizio del file system. | ||
Questo è il motivo per cui il file della chiave (<code>keyfile</code>) e la periferica (<code>dev</code>) coincidano. | {{Box|Nota|Questa assunzione fatta da luks (che le chiavi, che possono essere multiple, risiedano all'inizio del file system) impedisce l'uso di luks con la possibilità di cryptmount di creare più file system criptati all'interno della stessa periferica. }} | ||
Nell'esempio si è configurato cryptmount per usare un file ordinario, da montare in loop; si sarebbe potuto specificare una periferica a blocchi fisica, modificando il parametro <code>dev</code>. | Questo è il motivo per cui il file della chiave (<code>keyfile</code>) e la periferica (<code>dev</code>) coincidano.<br/> | ||
Nell'esempio si è configurato cryptmount per usare un file ordinario, da montare in loop; si sarebbe potuto specificare una periferica a blocchi fisica, modificando il parametro <code>dev</code>.<br/> | |||
Ultima considerazione, è l'opportunità di creare la cartella <code>/path/mount-point-crip</code>. | Ultima considerazione, è l'opportunità di creare la cartella <code>/path/mount-point-crip</code>. | ||
Se usiamo un file in loop, creiamolo con dd, esattamente come fatto per cryptsetup. | Se usiamo un file in loop, creiamolo con il comando <code>dd</code>, esattamente come fatto per cryptsetup. | ||
==== Creazione della chiave ==== | ==== Creazione della chiave ==== | ||
Diamo a cryptmount, necessariamente da super utente, istruzioni per creare la chiave:<pre>cryptmount --generate-key 32 criptata</pre>Si noti che basta indicare a cryptmount <code>criptata</code> non solo durante l'uso ma anche nella fase di creazione. | Diamo a cryptmount, necessariamente da super utente, istruzioni per creare la chiave: | ||
<pre>cryptmount --generate-key 32 criptata</pre> | |||
Si noti che basta indicare a cryptmount <code>criptata</code> non solo durante l'uso ma anche nella fase di creazione. | |||
==== Formattazione ==== | ==== Formattazione ==== | ||
Diciamo a cryptmount di preparare il | Diciamo a cryptmount di preparare il volume per la formattazione: | ||
Chiudiamo la fase di preparazione (a parte l'attenzione da mettere ai permessi da dare alla cartella di più alto livello creata da mkfs, come sempre al primo montaggio di un file system appena creato)<pre>cryptmount --release criptata</pre> | <pre>cryptmount --prepare criptata</pre> | ||
Diamo il comando di formattazione vero e proprio: | |||
<pre>mkfs -t ext2 /dev/mapper/criptata</pre> | |||
{{Box|Nota|Si noti che la periferica su cui scrivere in chiaro e che è poi mappata, attraverso il cifratore, su quella fisica, è in <code>/dev/mapper</code> esattamente come quando si fanno le cose manualmente con cryptsetup, che altro non è che uno strumento più a basso livello per l'interazione con <code>dm_crypt</code>.}} | |||
Chiudiamo la fase di preparazione (a parte l'attenzione da mettere ai permessi da dare alla cartella di più alto livello creata da mkfs, come sempre al primo montaggio di un file system appena creato): | |||
<pre>cryptmount --release criptata</pre> | |||
== Uso del volume cifrato == | == Uso del volume cifrato == | ||
Il grande vantaggio rispetto a cryptsetup è nell'uso quotidiano. Infatti, non è più richiesta l'autenticazione come super utente per montare o smontare il volume criptato (né che sia un volume fisico o un file in loop). | Il grande vantaggio rispetto a cryptsetup è nell'uso quotidiano. Infatti, non è più richiesta l'autenticazione come super utente per montare o smontare il volume criptato (né che sia un volume fisico o un file in loop). | ||
Ogni utente può dare<pre>cryptmount -m criptata</pre>o anche semplicemente<pre>cryptmount criptata</pre>inserire la parola d'ordine, e usare il file system appena montato. Tutta la sicurezza è, a parte gli ottimi algoritmi di hash e | Ogni utente può dare: | ||
Uno schema di funzionamento | <pre>cryptmount -m criptata</pre> | ||
Per smontare la periferica criptata basta, essendo autenticati come l'utente che ha montato il volume o super user<pre>cryptmount -u criptata</pre> | o anche semplicemente: | ||
<pre>cryptmount criptata</pre> | |||
inserire la parola d'ordine, e usare il file system appena montato. Tutta la sicurezza è, a parte gli ottimi algoritmi di hash e cifratura usati che scongiurano, ragionevolmente, attacchi di forza bruta, nella parola d'accesso.<br/> | |||
Uno schema di funzionamento diverso, quello con la chiave conservata altrove è interessante perché separa chiave e dati, lasciando alla memoria dell'utente solo il terzo ingrediente. Questo non è però nello standard luks, quindi non relativo a questa guida. | |||
{{Box|Disclaimer|Se LUKS prevede l'uso di chiavi esterne, un minimo di studio lo rivelerà e in caso affermativo tornerò ad aggiornare questa guida.}} | |||
Per smontare la periferica criptata basta, essendo autenticati come l'utente che ha montato il volume o super user: | |||
<pre>cryptmount -u criptata</pre> | |||
== Automatizzazione dei passi necessari == | == Automatizzazione dei passi necessari == | ||
A questo punto dobbiamo solo creare uno script da eseguire come root, per fare tutte le operazioni di creazione e montaggio, o viceversa di smontaggio e rimozione automaticamente. | A questo punto dobbiamo solo creare uno script da eseguire come root, per fare tutte le operazioni di creazione e montaggio, o viceversa di smontaggio e rimozione automaticamente.<br/> | ||
Di seguito sono riportati due script, uno per il caso di file montato ricorsivamente, l'altro per il caso di periferica ordinaria. | Di seguito sono riportati due script, uno per il caso di file montato ricorsivamente, l'altro per il caso di periferica ordinaria.<br/> | ||
In entrambi i casi il montaggio della periferica criptata avviene nella cartella "criptata" nella home dell'utente; è necessario quindi creare la cartella:<pre>$ mkdir /home/'''nomeutente'''/criptata</pre> | In entrambi i casi il montaggio della periferica criptata avviene nella cartella "criptata" nella home dell'utente; è necessario quindi creare la cartella: | ||
<pre>$ mkdir /home/'''nomeutente'''/criptata</pre> | |||
=== Script per file immagine === | === Script per file immagine === | ||
<pre>#Utilizzo di un file immagine come periferica criptata | <pre>#Utilizzo di un file immagine come periferica criptata | ||
Riga 189: | Riga 233: | ||
;; | ;; | ||
esac</pre> | esac</pre> | ||
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. | Nello script ho inserito il comando <code>touch</code> per impostare all'ora attuale le date di ultimo accesso e modifica del file <code>criptata.img</code>.<br/> | ||
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.<br/> | ||
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. | ||
Versione delle 17:10, 20 set 2011
Attenzione. Questa guida è da considerarsi abbandonata, per via del tempo trascorso dall'ultima verifica.
Potrà essere resa obsoleta, previa segnalazione sul forum, se nessuno si propone per l'adozione. |
Versioni Compatibili Debian 5 "lenny" Debian 6 "squeeze" |
Introduzione
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.
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 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 riflettendo sull'accresciuta rilevanza data alla riservatezza dei propri dati digitali, anche dagli utenti semplici.
Disclaimer Questa guida è in fase di aggiornamento. Verrà introdotto l'uso di cryptmount per consentire di lavorare completamente da utente, dovendo root solo compilare un file di configurazione globale (in /etc ).
|
La distribuzione cui ci si riferisce è Squeeze, ma il discorso dovrebbe subire modifiche minime o nulle per Lenny, Wheezy e Sid.
Prerequisiti e preparazione del sistema
Kernel precompilato Debian
Hardware A livello hardware la cifratura con algoritmo AES è molto leggera quindi può essere eseguita anche su macchine molto datate, o piccoli sistemi embedded. |
La prima cosa da controllare prima di cimentarsi nella criptazione è l'abilitazione del kernel a usare l'algoritmo AES.
In un terminale eseguiamo:
$ cat /proc/crypto
e con il kernel 3.0.0-1-686-pae (attualmente in Sid) dovremmo ottenere (in base anche ai moduli caricati) qualcosa tipo:
name : aes driver : aes-asm module : aes_i586 priority : 200 refcnt : 1 selftest : passed type : cipher blocksize : 16 min keysize : 16 max keysize : 32 name : aes driver : aes-generic module : aes_generic priority : 100 refcnt : 1 selftest : passed type : cipher blocksize : 16 min keysize : 16 max keysize : 32 [...] name : md5 driver : md5-generic module : kernel priority : 0 refcnt : 1 selftest : passed type : shash blocksize : 64 digestsize : 16
Ovviamente a noi interessano le sezioni che iniziano con name : aes
. Se non dovessero comparire dobbiamo controllare che i moduli responsabili dell'aes
siano caricati e ottenere un output simile a questo:
$ lsmod |grep aes aes_i586 16608 0 aes_generic 37066 1 aes_i586
(o aes-x86_64 in caso di architettura per kernel amd64).
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). È precompilato nel kernel Debian, ma non è detto che sia caricato (nel /proc/crypto
, soprariportato, non è infatti presente) quindi carichiamolo:
# modprobe sha256_generic
Nel file /proc/crypto
si dovrebbero essere aggiunte le seguenti righe:
name : sha256 driver : sha256-generic module : sha256_generic priority : 0 refcnt : 3 selftest : passed type : shash blocksize : 64 digestsize : 32 name : sha256 driver : sha256-generic module : sha256_generic priority : 0 refcnt : 1 type : digest blocksize : 64 digestsize : 32
Infine l'ultimo modulo da caricare nel kernel è dm-crypt
, la cui assenza impedisce a cryptmount di completare le operazioni richieste.
# modprobe dm-crypt
Nota: bisogna caricare i moduli?
Questi moduli richiesti sono stati indicati per esteso per capire un po' meglio cosa usiamo e perché. Non è necessario caricare manualmente alcun modulo, però, perché cryptmount dà istruzioni a chi di competenza per caricare tutti quelli necessario in modo trasparente all'utente.
Kernel personalizzato
Se non usiamo un kernel precompilato Debian, dobbiamo controllare che l'algoritmo di cifratura sia stato compilato: dal menu "Linux Kernel Configuration" seguiamo la voce "Cryptographic options --->" e abilitiamo la voce:
AES cipher algorithms
o la strettamente legata:
AES cipher algorithms (i586)
Sistemato il kernel passiamo all'installazione del software necessario:
# aptitude install cryptmount cryptsetup
che installerà tutte le dipendenze necessarie (poche e piccole: l'installazione completa di tutte le dipendenze sta nei 2MB di spazio disco).
Preparazione del file o della periferica
Per la preparazione del file system (su file o su periferica a blocchi fisica) criptato secondo LUKS possiamo usare cryptmount se vogliamo caratteristiche base di quest'ultimo. Per avere accesso a un supporto completo di LUKS, come dice il manuale stesso di crytpmount, è necessario usare cryptsetup.
Cryptsetup
Per preparare un file di dimensione fissata (in base alla quantità e tipo di dati che vorremo salvare cifrati) usiamo il comando dd
:
$ dd if=/dev/zero of=/home/nomeutente/immagine_cifrata ibs=1M count=10
per creare un file da poi usare di 10MB nella home dell'utente nomeutente (queste dimensioni ridottissime sono adatte a una prova o per pochi dati che possono essere anche spediti in modo sicuro come allegato a un messaggio di posta).
File ordinario montato in loop
Autentichiamoci come root e montiamo il file appena creato in loop. Prima di tutto impostiamo il file appena creato come una loop device (controllare la prima periferica loop libera con losetup -f
):
# /sbin/losetup /dev/loop/0 /home/nomeutente/immagine_cifrata
Periferica a blocchi fisica
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).
Creiamo la partizione LUKS:
# cryptsetup --verify-passphrase --verbose --hash=sha256 --cipher=aes-cbc-essiv:sha256 --key-size=256 luksFormat /dev/periferica WARNING! ======== ======== This will overwrite data on /dev/periferica irrevocably. Are you sure? (Type uppercase yes):
Come dice il messaggio bisogna rispondere con uno YES
interamente maiuscolo.
Ci verrà di seguito chiesta una parola d'ordine e la sua conferma; mentre le digiteremo non vedremo nulla cambiare nel terminale:
Enter LUKS passphrase: Verify passphrase: Command successful.
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
):
# cryptsetup luksOpen /dev/periferica criptata
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):
# mkfs -t ext2 /dev/mapper/criptata
Non ci rimane che montarla in una cartella di prova per verificare che sia tutto corretto (funzionamento, dimensioni desiderate ecc.):
# mount -t auto /dev/mapper/criptata /mnt/prova
Rimozione della periferica criptata
Per rimuovere la periferica cifrata bisogna innanzi tutto smontarla, poi bisogna dire a cryptsetup di chiudere la periferica (il che automaticamente eliminerà il nodo creato dal device mapper):
# umount /mnt/prova # /sbin/cryptsetup luksClose criptata
Rimozione di una loop device
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:
# /sbin/losetup -d /dev/loop0
Cryptmount
Il passo di base da compiere con cryptmount è compilare il file di configurazione. Per questa operazione e per usare l'opzione --generate-key</key> è necessario essere super utente (quello col costumino azzurro attillatissimo sotto i mutandoni rossi...).
Eccone un esempio:
criptata {
keyformat=luks
dev=/path/criptata.img
keyfile=/path/criptata.img
dir=/path/criptata
fstype=ext2
mountoptions=defaults
cipher=aes
}
Gli aspetti che merita notare sono il formato per gestione delle chiavi (per visualizzare i formati disponibili dare il comando cryptmount -k
) impostato qui a luks. Il formato builtin
salva la chiave in un file separato (da specificare nel campo keyfile
). In luks invece la chiave è conservata all'inizio del file system.
Questo è il motivo per cui il file della chiave (keyfile
) e la periferica (dev
) coincidano.
Nell'esempio si è configurato cryptmount per usare un file ordinario, da montare in loop; si sarebbe potuto specificare una periferica a blocchi fisica, modificando il parametro dev
.
Ultima considerazione, è l'opportunità di creare la cartella /path/mount-point-crip
.
Se usiamo un file in loop, creiamolo con il comando dd
, esattamente come fatto per cryptsetup.
Creazione della chiave
Diamo a cryptmount, necessariamente da super utente, istruzioni per creare la chiave:
cryptmount --generate-key 32 criptata
Si noti che basta indicare a cryptmount criptata
non solo durante l'uso ma anche nella fase di creazione.
Formattazione
Diciamo a cryptmount di preparare il volume per la formattazione:
cryptmount --prepare criptata
Diamo il comando di formattazione vero e proprio:
mkfs -t ext2 /dev/mapper/criptata
Chiudiamo la fase di preparazione (a parte l'attenzione da mettere ai permessi da dare alla cartella di più alto livello creata da mkfs, come sempre al primo montaggio di un file system appena creato):
cryptmount --release criptata
Uso del volume cifrato
Il grande vantaggio rispetto a cryptsetup è nell'uso quotidiano. Infatti, non è più richiesta l'autenticazione come super utente per montare o smontare il volume criptato (né che sia un volume fisico o un file in loop).
Ogni utente può dare:
cryptmount -m criptata
o anche semplicemente:
cryptmount criptata
inserire la parola d'ordine, e usare il file system appena montato. Tutta la sicurezza è, a parte gli ottimi algoritmi di hash e cifratura usati che scongiurano, ragionevolmente, attacchi di forza bruta, nella parola d'accesso.
Uno schema di funzionamento diverso, quello con la chiave conservata altrove è interessante perché separa chiave e dati, lasciando alla memoria dell'utente solo il terzo ingrediente. Questo non è però nello standard luks, quindi non relativo a questa guida.
Disclaimer
Se LUKS prevede l'uso di chiavi esterne, un minimo di studio lo rivelerà e in caso affermativo tornerò ad aggiornare questa guida.
Per smontare la periferica criptata basta, essendo autenticati come l'utente che ha montato il volume o super user:
cryptmount -u criptata
Automatizzazione dei passi necessari
A questo punto dobbiamo solo creare uno script da eseguire come root, per fare tutte le operazioni di creazione e montaggio, o viceversa di smontaggio e rimozione automaticamente.
Di seguito sono riportati due script, uno per il caso di file montato ricorsivamente, l'altro per il caso di periferica ordinaria.
In entrambi i casi il montaggio della periferica criptata avviene nella cartella "criptata" nella home dell'utente; è necessario quindi creare la cartella:
$ mkdir /home/'''nomeutente'''/criptata
Script per file immagine
#Utilizzo di un file immagine come periferica criptata
#!/bin/bash
case $1 in
monta)
if [ -f /home/'''nomeutente'''/immagine_cifrata ]; then
echo "Impostazione periferica ricorsiva (loop)."
/sbin/losetup /dev/loop0 /home/'''nomeutente'''/immagine_cifrata
fi
if [ $? = 0 ]; then
/sbin/cryptsetup luksOpen /dev/loop0 criptata
else
echo "Impostazione periferica ricorsiva non riuscita."
fi
if [ $? = 0 ]; then
mount /dev/mapper/criptata /home/'''nomeutente'''/criptata
fi
if [ $? !=0 ]; then
echo "Impossibile montare la periferica criptata."
/sbin/cryptsetup luksClose criptata
/sbin/losetup -d /dev/loop0
fi
;;
smonta)
umount /dev/mapper/criptata
echo "Smontaggio riuscito"
if [ $? = 0 ]; then
/sbin/cryptsetup luksClose criptata
else
echo "Smontaggio non riuscito."
fi
if [ $? = 0 ]; then /sbin/losetup -d /dev/loop0
if [ $? = 0 ]; then
echo "Periferica criptata chiusa"
touch /home/'''nomeutente'''/criptata.img
else echo "Chiusura periferica criptata non riuscita"
fi
fi
;;
*)
echo "Usage: $1 {monta|smonta}" >&2
exit 1
;;
esac
Nello script ho inserito il comando touch
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.
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
In questo esempio viene usata la prima partizione di una scheda di memoria SD (/dev/mmcblk0p1
con lettore compatibile con il modulo sdhci).
#!/bin/bash
case $1 in
monta)
echo "Verifica presenza SD:"
if [ -b /dev/mmcblk0p1 ] ; then
echo "."
else
echo "La periferica non è inserita!"
exit 2
fi
if [ $? = 0 ]; then /sbin/cryptsetup luksOpen /dev/mmcblk0p1 criptata
fi
if [ $? = 0 ]; then
mount /dev/mapper/criptata /home/'''nomeutente'''/criptata
fi
if [ $? != 0 ]; then
echo "Il file system cifrato non può essere montato."
/sbin/cryptsetup luksClose criptata
fi
;;
smonta)
#Smonto il file system criptato e controllo che lo smontaggio sia avvenuto correttamente
umount /dev/mapper/criptata
if [ $? != 0 ]; then
echo "Smontaggio non riuscito."
fi
#Chiudo il nodo in /dev/mapper e controllo
/sbin/cryptsetup luksClose criptata
if [ $? = 0 ]; then
echo "Nodo cifrato in /dev/mapper rimosso."
else echo "Chiusura periferica criptata non riuscita"
fi
;;
*)
echo "Usage: $1 {monta|smonta}" >&2
exit 1
;;
esac