Il procedimento più semplice per trasferire documenti importanti da una macchina ad un’altra è conservali in una chiavetta USB, e mettiamo caso se la perdessimo? Senza le opportune precauzioni chiunque riuscirebbe a impadronirsi dei nostri documenti. Ma esiste un modo per risolvere questa problematica, è possibile creare un intero file system cifrato, e renderlo solamente accessibile tramite una password. Per raggiungere tale scopo, bisognerà utilizzare tre particolari servizi che ci mettono a disposizione i kernel della serie 2.6.x: le librerie di cifratura (Cryptographic API, saranno inoltre necessari i seguenti pacchetti ( tra parentesi i relativi comandi): mount (losetup), cryptsetup (crypsetup), dmsetup (dmsetup), dosfstools (mkdosfs), ricordo che tutte le operazioni vanno eseguite come utente root). In primo luogo bisogna scegliere un algoritmo di cifratura simmetrico, nel senso che deve utilizzare la stessa chiave sia per proteggere sia per decodificare i dati, a questo proposito si utilizzerà l’AES.
AES opera ripetutamente su blocchi di dati a lunghezza fissa e per questo appartiene alla classe degli algoritmi block cypher. Per gli algoritmi simmetrici una chiave lunga 128 bit garantisce un buon livello di sicurezza, nella realtà il proprietario dei dati sceglie e conserva una frase abbastanza lunga e quindi facilmente memorizzabile, quest’ultima viene poi trasformata tramite un apposito algoritmo di hash nella chiave vera e propria, di lunghezza definita e casualità appropiata. Nel nostro caso, come generatore di hash key, utilizzeremo il RIPEMD-160, creato nell’ambiente accademico e per ora privo di collisioni, un alternativa potrebbe essere SHA-256, che verrà utilizzato succesivamente per un’altra operazione di hashing.
RIPEMD-160 e SHA-256 sono versioni molto rubuste di RIPEMD e SHA-1, due algortimi che in seguito ad attacchi complessi hanno rilevato delle collisioni.
Come accennato precedentemente, i kernel della serie 2.6.x contengono tutti i principali algoritmi di cifratura, per utilizzarli bisogna verificare se sono presenti i relativi moduli, se non lo sono è neccessario compilarli, il controllo può essere eseguito con modprobe –l | grep aes e modprobe –l | grep sha.
Nel kernel esistono già dei componenti che utilizzano le librerie Crypto API sopra mensionate, l’infrastuttura dm-crypt è uno di questi.
Il suffisso dm sta per device mapper e rappresenta l’architettura base che consente la traduzione trasparente di un block device in un altro, tramite device-mapper vengono creati nella directory /dev/mapper dei device virtuali su cui si può leggere e scrivere analogamente a quanto avviene per quelli che rappresentano le periferiche reali. Per una completa e facile portabilità dei dati verrà utilizzata un’altra classe di pseudo device supportata dal kernel, che sono i loopback device o loop device, tramite questo procedimento è possibile trattare qualsiasi file regolare come un block device, come una partizione di un hd.
Grazie al programma losetup si associa un qualsiasi file a un device /dev/loopX sul quale in seguito si può creare un file system che può essere montato su una normale directory.
Adesso che abbiamo un pò analizzato i concetti di cifratura base e con il kernel configurato correttamente, possiamo occuparci degli script shell fsdown.sh e fsup.sh. Lo script fsup.sh serve a creare il file system, se sempre non esiste e a montarlo per renderlo accessibile sia in scrittura che in lettura.
Il FILESYSTEM_SIZE_MB è un parametro solamente valido nel caso di creazione ex novo del file system e contiene la grandezza desiderata del file in megabyte.
In CIPHER invece è contenuto il parametro passato al comando crysetup, che praticamente riassume l’algoritmo scelto per la cifratura del file system, la sottoscritta cbc sta per cipher block chaining e indica la modalità con cui verrà cifrato l’intero file.
Precedentemente abbiamo visto AES che opera sui dei blocchi di dati in chiaro di lunghezza fissa mentre i file possono avere una lunghezza qualunque, la modalità cbc prevede che ogni bloccho in chiaro venga preprocessato tramite l’operazione xor con il blocco cifrato precedentemente, prima di essere trattato da AES. Rimane il problema per il primo blocco, che non presenta un blocco precedente ma per in quale è previsto un initialization vector. Esso inizialmente era in chiaro ed ha inevitalbilmente esposto la procedura a nuovi watermark attack, a questa ulteriore problematica ha posto fine la modalità ESSIV, indicata nel nostro parametro e disponibile dalla versione del kernel 2.6.10
La varabiale HASH contiene invece la funzione crittografica scelta per l’hashing della frase segreta, invece il MOUNT_POINT indica la directory in cui si vuole montare il file system cifrato.
Lo script fsup.sh deve essere eseguito con un solo parametro che sarà il nome del file contenente il file system cifrato, e non solo, ma anche il nome del device mapper virtuale creato in /dev/mapper.
E’ quindi il momento di inserire i moduli del kernel di cui si è discusso prima, e che ci permettono il supporto a un loop device, delle Crypto API e dal device-mapper e dm-crypt. A questo punto il file viene associato a un loop device, dopo di che viene lanciato il programma di utilità cryptsetup che utilizzando i parametri illustrati sopra, crea un device virtuale sotto /dev/mapper con il nome scelto e lo associa al loop device.
In questo momento verrà chiesta la famosa password o meglio la frase di cifratura che rappresenterà la chiave di accesso al file system, una cosa abbastanza importante c’è la possibilità di creare un file system di qualsiasi tipo in vista di future esigenze di compatibilità con altri sistemi operativi, viene creato un file system di tipo FAT32.
Infine il file system cifrato deve essere montato sulla directory indicata all’inizio, come segue:
mount –t vfat /dev/mapper/${NAME} ${MOUNT_POINT}
Questo è un punto fondamentale in cui comprende la logica del comportamento dell’infrastuttura del device mapper; se l’operazione di mount non va a buon fine significa che la frase chiave che abbiamo scelto non era quella giusta. Infatti anche se abbiamo creato ugualmente il device sotto /dev/mapper tutte le operazioni su questo falliscono perché l’algoritmo, operando su quella frase chiave errata, non ci permette di riconoscere una struttura di dati validi:
if [ “$?” == “0” ]; then
echo “mounted under ${MOUNT_POINT}
elese
echo “bad passphrase”
cryptsetup remove ${NAME}
losetup -d /dev/loop0
modprobe –r dm-crypt
modprobe –r aes
fi
Per creare il file system cifrato, lo script va eseguito nel seguente modo: ./fsup.sh tempfile.
Il file cosi generato può essere trasferito sulla pendrive, sicuri che nessuno posso accedervi anche in caso di smarrimento della nostra chiavetta USB.
Per smontare il file system crifrato invece utilizzeremo lo script fsdown.sh, ed elimina le associazioni con i device virtuali e rimuove i moduli dal kernel rendendo impossibile un nuovo accesso ai dati senza la conoscenza della frase segreta, lo script va eseguito in questo modo: ./fsdown tempfile.
Come ultima cosa, è possibile una portabilità e una compatibilità con un sistema diverso da Gnu/Linux, per esempio, Windows.
In Windows possiamo utilizzare un software open source denominato FreeOTEE con il quale è possibile montare e usare il file system cifrato.
Questo è lo script fsup.sh:
#!/bin/bash
# Inserisce i moduli necessari
# crea, se non gia’ esistente, il file indicato come primo argomento,
# lo associa a un loop device, poi lo associa a un filesystem cifrato
# e lo monta sotto la directory MOUNT_POINT
# Parametri variabili
FILESYSTEM_SIZE_MB=64
CIPHER=aes-cbc-essiv:sha256
HASH=ripemd160
MOUNT_POINT=/mnt
if [ "$#" != "1" ]; then
echo “Usage: fsup.sh file_name”
exit
fi
NAME=${1}
test -f ${NAME}
if [ "$?" == "1" ]; then
IS_A_NEW_FILE=”TRUE”
fi
modprobe loop
modprobe aes
modprobe sha256
modprobe dm-crypt
if [ "${IS_A_NEW_FILE}" == "TRUE" ]; then
dd if=/dev/urandom of=${NAME} bs=1M count=${FILESYSTEM_SIZE_MB}
fi
losetup /dev/loop0 ${NAME}
if [ "${IS_A_NEW_FILE}" == "TRUE" ]; then
cryptsetup –cipher ${CIPHER} –hash ${HASH} –verify-passphrase create ${NAME} /dev/loop0
mkdosfs /dev/mapper/${1}
else
cryptsetup –cipher ${CIPHER} –hash ${HASH} create ${NAME} /dev/loop0
fi
cryptsetup status ${NAME}
mount -t vfat /dev/mapper/${NAME} ${MOUNT_POINT}
if [ "$?" == "0" ]; then
echo “mounted under ${MOUNT_POINT}”
else
echo “bad passphrase”
cryptsetup remove ${NAME}
losetup -d /dev/loop0
modprobe -r dm-crypt
modprobe -r aes
fi
Questo è lo script fsdown.sh:
#!/bin/bash
# Smonta il file cifrato montato sotto la directory MOUNT_POINT
# rimuove il device indicato nel primo argomento sotto /dev/mapper
# rimuove l’associazione con il loop device
# rimuove i moduli
# Parametri variabili
MOUNT_POINT=/mnt
if [ "$#" != "1" ]; then
echo “Usage: fsdown.sh file_name”
exit
fi
NAME=${1}
umount ${MOUNT_POINT}
cryptsetup remove ${NAME}
losetup -d /dev/loop0
modprobe -r dm-crypt
modprobe -r sha256
modprobe -r aes
modprobe -r loop

Eheh! Mi hai anticipato…
Oggi pomeriggio mi sono prefissato di crearmi, in questi giorni, uno script bash che mi gestisse il mount-umount-creazione di file system criptati, anche se effettivamente in maniera un pò diversa da questa.
Io farò invece in modo che il file criptato risieda sull’hard disk, e il keyfile nella pendrive usb con un determinato uuid in modo da non essere costretto a inserire ogni volta una password (che per essere sicura, sai meglio di me che deve avere certe caratteristiche non proprio amiche della memoria umana…)
Ciao!
Commento di [-Ar3s-] — Giugno 19, 2008 @ 9:25 pm