Volumi criptati LUKS - Creazione e uso con cryptmount
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. 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 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.
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 |
La distribuzione cui ci si riferisce è Etch, ma il discorso dovrebbe subire modifiche minime o nulle sia per Lenny che per Sid.
Prerequisiti e preparazione del sistema
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. I kernel precompilati di debian sono tutti già abilitati, quindi il controllo non dovrebbe essere necessario. In un terminale eseguiamo
cat /proc/crypto
e con il kernel 2.6.18 di etch dovremmo ottenere (in base anche ai moduli caricati) qualcosa tipo
name : sha256driver : sha256-generic module : sha256 priority : 0 type : digest blocksize : 64 digestsize : 32
name : aes driver : aes-generic module : aes priority : 100 type : cipher blocksize : 16 min keysize : 16 max keysize : 32
...
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:
lsmod | grep aes aes 28160 2
.
Se l'output dovesse essere vuoto dobbiamo caricare il modulo aes con l'usuale comando modprobe aes.
Se non usaimo 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 cryptsetup
che installerà tutte le dipendenze necessarie (piccole: l'installazione completa di tutte le sue dipendenze sta sotto i 2MB di spazio disco!).
Preparazione del file o della periferica
Creare una loop device da un file
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 di "nomeutente" (perdonate la poca fantasia). Autentichiamoci come root e montiamo il file appena creato in loop. Prima di tutto impostiamo il file appena creato come una loop device (ammettendo che questa sia la prima periferica in loop del sistema):
/sbin/losetup /dev/loop/0 /home/nomeutente/immagine_cifrata
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 kenrel (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.
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 periferca 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 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:
/sbin/losetup -d /dev/loop0
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
Scritp 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 if [ $? = 0 ]; then /sbin/cryptsetup luksClose criptata else echo "Smontaggio non riuscito." fi if [ $? = 0 ]; then /sbin/losetup -d /dev/loop0 else echo "Chiusura periferica criptata non riuscita." fi ;; *) echo "Usage: $1 {monta|smonta}" >&2 exit 1 ;; esac
Scritp 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