Linux CryptoAPI
Semplice guida all’utilizzo di filesystem cifrati.
Prima di tutto ammetto le mie colpe, questo semplice testo non ha nessuna ambizione teorica, e’ composto semplicemente da una serie di appunti su cose apprese in rete compilata perche’ potesse risultare d’aiuto a chi avesse voluto realizzare una partizione cifrata con GNU/Linux senza doversi sbattere troppo.
Non era infatti un pilastro dell’etica hacker fare in modo che non si dovesse ogni volta reinventare la ruota ? 🙂
[ Perche’ ? ]
Perche’ utilizzare una partizione cifrata ?
Perche’ farsi questa domanda ?
Sono cose a cui non sono io a dover rispondere.
Quando ho scelto di avere una partizione cifrata avevo semplicemente intenzione di custodire i dati degli utenti dentro la “home” in maniera piu’ sicura.
Ognuno degli interessati avra’ sicuramente il suo buon motivo.
[ Kernel ]
Cominciamo col dire che in base ad alcuni accordi internazionali la crittografia pesante e’ considerata una pericolosa arma, uno strumento
prettamente militare, e quindi ci sono stati che ne proibiscono l’esportazione.
Per questi motivi il supporto crittografico non e’ integrato nel kernel ma bisogna installare una patch non ufficiale, rintracciabile attraverso
il sito www.kerneli.org.
Inizialmente questa era denominata patch di internazionalizzazione del kernel, ma adesso, anche se il nome del file e’ ancora lo stesso, il
progetto ha preso il nome di “GNU/Linux CryptoAPI Project”.
Sul mio computer e con il kernel 2.4.20 senza modifiche, ho dovuto applicare in sequenza queste 2 patch:
[tritticho][/usr/src/linux]# patch -p1 < patch-int-2.4.20.1
[tritticho][/usr/src/linux]# patch -p1 < loop-jari-2.4.20.0.patch
La prima e’ per il supporto delle cryptoapi e dei cifrari, la seconda una patch per i loopback device che permette di non dover attivare degli hack non troppo stabili per far funzionare il tutto.
Patchato il kernel si deve far partire il tool di configurazione dello stesso, che sia a linea di comando o con interfaccie varie non cambia molto, e abilitare alcune cose:
Block devices —>
< *> Loopback device support
Cryptography support (CryptoAPI) —>
< *> CryptoAPI support
[*] Cipher Algorithms
< *> AES (aka Rijndael) cipher
[*] Crypto Devices
< *> Loop Crypto support
Naturalmente questa e’ la scelta che io ho adottato, gli algoritmi di cifratura supportati sono molti e sta’ a voi scegliere quello che preferite.
Da notare l’assenza di moduli (sempre una scelta personale) fatta per avere la crittografia subito al boot e il supporto per i loop device che poi spieghero’ meglio.
Diamo una bella ricompilata al kernel e torniamo alla luce con la nostra nuova creatura.
[ E adesso ? ]
Spiego un attimo perche’ abbiamo inserito il supporto per i loop device…
Astrazione!
Si’, e’ come se applicassimo un filtro tra il device fisico e la rappresentazione che ne abbiamo dentro la struttura del filesystem.
Sarebbe risultato sicuramente piu’ complesso modificare i driver di tutti i device e dei filesystem per inserire le funzionalita’ di cifratura e
decifratura, e dove non piu’ complesso sicuramente noioso 🙂
Semplicemente quello che facciamo e’ questo: montiamo la partizione che ci interessa su un loop device e questo in una directory del filesystem in modo che tutti i comandi del kernel passino attraverso il nostro loop device che avra’ il supporto crittografico e si occupera’ di cifrare e decifrare le informazioni in transito.
Oltre ai nostri dati saranno infatti cifrate anche le informazioni relative al filesystem stesso; inoltre grazie ai loop device abbiamo la possibilita’ di creare dei filesystem cifrati “virtuali” dove immagazzinare informazioni o creare immagini cifrate per da scrivere su cd, floppy, penne usb et similia.
Cominciamo creando un piccolo file pieno di “immondizia” 🙂
[tritticho][~]#dd if=/dev/urandom of=prova bs=1M count=20
20+0 records in
20+0 records out
[tritticho][~]#
Abbiamo utilizzato /dev/urandom come consigliato anche sulla documentazione ufficiale solo per avere un margine maggiore di PARANOIA 😉
Adesso associamo uno dei nostri loop device (scegliamo loop0) al file che abbiamo appena creato:
[tritticho][~]# losetup /dev/loop0 prova -e aes
Available keysizes (bits): 128 192 256
Keysize: 128
Password :
[tritticho][~]#
Diamo una formattata al tutto…
[tritticho][~]# mke2fs /dev/loop0
mke2fs 1.27 (8-Mar-2002)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
5136 inodes, 20480 blocks
1024 blocks (5.00%) reserved for the super user
First data block=1
3 block groups
8192 blocks per group, 8192 fragments per group
1712 inodes per group
Superblock backups stored on blocks:
8193
Writing inode tables: done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 21 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
[tritticho][~]#
Fatto, montiamo il file “prova” che abbiamo creato e siamo a cavallo 🙂
[tritticho][~]# mount -o loop /dev/loop0 /mnt/ -t ext2
[tritticho][~]# cd /mnt/
[tritticho][/mnt]# ls
. .. lost+found
[tritticho][~]#
Possiamo utilizzare il file come un qualsiasi device, una volta smontato il contenuto non sara’ accessibile a chi non conosce la passphrase che abbiamo fornito al primo losetup.
Per rimontare il file una volta smontato:
[tritticho][~]# mount -o loop,encryption=aes prova /mnt/ -t ext2
[ Device fisici ]
E se invece di un device immaginario come un file volessimo cifrare un’intera partizione, ad esempio /home ?
Il procedimento e’ lo stesso, basta sostituire una partizione, ad esempio /dev/hda4, dove prima scrivevamo “prova”.
Se poi vogliamo che la partizione venga montata all’avvio dovremo fornire la passphrase, altrimenti il boot andra’ lo stesso a buon fine ma gli utenti non avranno una casa 🙂
Aggiungiamo dentro /etc/fstab una riga:
/dev/hda4 /home ext3 defaults,loop,encryption=aes 0 2
Naturalmente una volta smontata la /home solo root potra’ rimontarla.
E se volessimo scrivere una traccia cifrata su un cd ?
Il procedimento e’ semplice, creiamo il nostro file con riempiendolo con /dev/urandom (naturalmente senza andare oltre la capacita’ di un cd), usiamo losetup come precedentemente indicato, al momento della formattazione passiamo un’opzione ulteriore, cioe’:
mke2fs /dev/loopX -b 2048
La X e’ il numero del loop device associato naturalmente 🙂
[ Conclusioni ]
Bhe, che dire ?
Naturalmente niente.
E’ questo il momento di sperimentare, non di parlare 🙂