Root cifrata

Contenuti

Premessa

Questa guida propone un esempio di cifratura dell'harddisk e in particolare della cifratura della root (/), inroducendo i principali concetti per poi lasciare il resto alla documentazione gia on-line in lingua italiana o inglese.

I concetti principali sono:

  1. comprendere come funziona il tool cryptsetup-luks che cifra una intera partizione.
  2. comprendere come avviare un ambiente in grado di decrifrare e avviare la root

Il tool cryptsetup-luks

Con luks utilizziamo il modulo dm-crypt del kernel linux.
Quando creiamo una nuova partizione cifrata viene generata una chiave per leggere-scrivere la partizione.
Questa chiave a sua volta e cifrata con un passfrase inserita da tastiera o da file e viene scritta in uno SLOT.

| Header | Slot 0 | ... | Slot 7 | Encrypted Data |

In questo modo noi possiamo decifrare una partizione prendendo la passfrase da un file magari presente su chiave usb o su un'altra partizione precedentemente decifrata oppure immettendo una stringa da tastiera. Infatti puo' risultare molto utile in caso della perdita del file con la chiave avere una passfrase per recuperare i dati.

Formattazione, aprire e chiudere con la passfrase

  • creare la partizione
cryptsetup -y -s 256 luksFormat /dev/sda3
  • aprirla
cryptsetup luksOpen /dev/sda3 encrypted
  • chiuderla
cryptsetup luksClose encrypted
  • aggiungere una passfrase in un nuovo slot
cryptsetup -y luksAddKey /dev/sda3
  • rimouvere una passfrase di uno slot
cryptsetup luksDelKey /dev/sda3 1
# il numero 1 in fondo alla riga indica il numero dello slot
# ATTENZIONE a non eliminare tutti gli slot alrimenti avrete perso tutti i dati!!!
  • per avere info sulla cifratura e gli slot e altro
cryptsetup luksDump /dev/sda3

Montaggio delle partizioni

Cryptsetup quando apre una partizione cifrata crea un device virtuale in /dev/mapper/ con il nome scelto da noi ad esempio root ( il device sara' quindi /dev/mapper/root ). Questo device sara' quindi un device alla stregua del nostro vecchio /dev/sda3.
Esempi

  • partizione non cifrata
mkfs.ext3 /dev/sda3
mount /dev/sda3 /mnt/magazzino

umount /mnt/magazzino
  • partizione cifrata
cryptsetup luksOpen /dev/sda3 encrypted
mkfs.ext3 /dev/mapper/encrypted
mount /dev/mapper/encrypted /mnt/magazzino

umount /mnt/magazzino
cryptsetup luksClose encrypted

Montare una partizione cifrata al boot

decifrarla

Debian
modificare il file /etc/crypttab secondo le proprie preferenze (attenzione il file cambia nome e sintassi a seconda della distribuzione)

  • esempio
# <target name> <source device>         <key file>                      <options>
home            /dev/sda5               /etc/chiavi/key_home            luks

mettendo "none" sotto <key file> verra' chiesta la passfrase durante l'avvio

Montarla

nel file /etc/fstab la riga che monta la partizione delle home diventa

/dev/mapper/home        /home   ext3    defaults        0       2

Sistema cifrato

ora per cifrare la root io ho seguito questo howto:
http://gentoo-wiki.com/SECURITY_System_Encryption_DM-Crypt_with_LUKS

In questo howto si spiega come creare un sistema scegliendo uno tra vari livelli di sicurezza

  1. cifrarura di una sola partizione(non root) per esempio contenente i dati della /home/
  2. cifratura della root con passfrase
  3. cifratura completa del disco fisso con boot da pen-drive su cui sono i file-chiave per decifrare la root
  4. cifratura completa del disco fisso con boot da pen-drive su cui sono le chiavi per decifrare la root a loro volta cifrate con gpg con una passfrase da tastiera

ora vedremo rapidamente i concetti che si affronteranno nell'howto

Boot di un sistema con root cifrata

il concetto e' che si parte da un sistema minimale per decifrare la root per poi passare ad usarla.
Questo sistema deve trovarsi su una partizione non cifrata che si puo a sistema avviato montare come /boot ed
e' cosi composto:

  1. kernel
  2. initrd
  3. file di grub

kernel

Per quanto riguarda il kernel e' il vostro solito kernel con compilati staticamente alcuni moduli necessari al
l'avvio e alla decifratura del disco; dovrebbe essere possibile utilizzare qualsiasi kernel con i moduli separati facendoli caricare dallo script di init (che vedremo poi).

initrd

L'inird possiamo vederlo come la nostra root non cifrata contiene i file della cartella /bin, /sbin, /lib/modules/ ecc e il file /init che sara' quello piu importante poiche' sara' quello che ci permette di dare le istruzioni di avvio.

Per creare il file initrd bisongna innanzi tutto sapere che non e' nient'altro che una cartella contenente la nostra root minimale compressa come un file di estensione .cpio.gz.
Di conseguenza noi creeremo prima una cartella con dentro la nostra mini-root e poi la comprimeremo.

creare la mini-root

per gli eseguibili fondamentali tipo ls, grep, mount, modprobe si puo usare busibox (per la procedura vedere l'howto) e ci aggiungeremo cryptsetup e volendo gpg COMPILATI STATICAMENTE.
I moduli, se ce ne servono, prenderemo quelli nella nostra cartella /lib/modules/_versione-kernel_
Il file init che e' uno script in sh e fornito dall'howto

il file init

Come abbiamo appena detto e' uno script in sh che ha le seguenti capacita

  1. avvio di un sistema con root cifrata con passfrase o file o file protetto con gpg
  2. risveglio di un sistema dalla sospensione su swap cifrato

avvio da pen-drive

L'howto consiglia di usare ext-linux per avviare il sistema da usb, io ho provato copiando la /boot sul pen-drive e installandoci grub proprio come se fosse un normale hardisk, ho aggiustato il file di configurazione di grub e funziona.

Conclusioni

Spero di avere spianato la strada per la lettura dell'howto che ho indicato che, anche se molto lungo, mi sembra molto completo e comprensibile. Se avessi commesso errori, imprecisioni o avete suggerimenti per completare alcuni aspetti rimasti un po oscuri fatevi sentire.

Scritto da Sacero