KeyEscrow: perché e come cifrare un disco con due chiavi

1

11554965345_cd1e35c7fa_z

In questo articolo parliamo di un concetto crittografico interessante: la escrow key.

Scenario tipico di utilizzo: computer aziendale con hard disk cifrato, il dipendente imposta la propria chiave per decifrare il disco e montarlo. Puó succedere che il dipendente per diecimila ragioni sia impossibilitato a sbloccare l’hard disk ma servono dei dati importati contenuti li dentro.

In questo caso ci viene in aiuto la tecnica di Key Escrow: una seconda password “aziendale” che funziona esattamente come la prima, l’unica differenza é che a saperla é solo il responsabile della sicurezza che avrá cura di conservarla in un luogo assolutamente protetto.

Aspetti tecnici

Quando cifriamo un hard disk, un file, il nostro smartphone solitamente ci viene chiesta una password. Erroneamente si pensa che quella password sia la chiave con cui viene cifrato tutto il disco. Pensiamoci bene, sarebbe una follia! Nel momento in cui volessimo cambiare la password dovremmo dacifrare e ricifrare tutto con tempi di elaborazione spaventosi.

In realtá quando inizializiamo un disco cifrato viene generata una chiave randomica ($$ k_1 $$) e il disco viene cifrato con quella. Poi cifriamo a sua volta la chiave $$k_1$$ con la nostra passphrase ($$p_1$$) generando $$ k_c_1 $$ e salviamo la chiave $$k_c_1$$ all’inizio dell’hard disk. Quando inseriamo $$ p_1 $$ per “sbloccare” l’hard disk viene letto $$k_c_1$$, decifrata e caricata in memoria $$k_1$$ pronta per essere utilizzata per cifrare/decifrare i dati sull’hard disk.

In pratica:

$$k_c_1 = E(k_1, p_1)$$
$$k_1 = D(k_c_1, p_1)$$

Con $$E( )$$ e $$D( )$$ due algoritmi rispettivamente di cifratura e decifratura.

Aggiungere la seconda chiave é quindi molto semplice, basta salvare nell’hard disk la chiave cifrata $k_c_e$ generata in questo modo:

$$k_c_e = E(k_1, p_e)$$

In cui $p_e$ é la chave aziendale.

Nel momento in cui andiamo inserire una o l’altra password il sistema tenterá di decifrare le due chiavi $$k_c_1$$ e $$k_c_e$$ con la password inserita dall’utente.

Mano alla tastiera!

Okkey, dopo la parte “seriosa” grabbate una chiavetta usb e iniziamo a giocare un po’ con luks!

Assumo che giá abbiate un’infarinatura di come funziona LUKS, nel caso provvederemo a fare un altro articolo di base 😉 .

# dd if=/dev/zero of=/dev/sdb bs=4M                                                                                                                                       
^C
4314+0 records in
4314+0 records out
18094227456 bytes (18 GB) copied, 1326.32 s, 13.6 MB/s

Ok, dopo un po’  ho barato e ho interrotto il dd.  😉
pwgen é un comando carino che genera password casuali. Ne genero una per l’utente.

# pwgen 10 1
Hohl6eevei

E ora creo il disco cifrato e lo apro con la password utente

# cryptsetup luksFormat /dev/sdb

WARNING!
========
This will overwrite data on /dev/sdb irrevocably.

Are you sure? (Type uppercase yes): YES
Enter passphrase: Hohl6eevei
Verify passphrase: Hohl6eevei
# cryptsetup luksOpen /dev/sdb luks-escrow
Enter passphrase for /dev/sdb: 
# mkfs -t ext4 /dev/mapper/luks-escrow
mke2fs 1.42.8 (20-Jun-2013)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
1957888 inodes, 7831040 blocks
391552 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=4294967296
239 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
        32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632, 2654208, 
        4096000

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 
# mkdir luks-escrow
# mount /dev/mapper/luks-escrow luks-escrow/
# date > luks-escrow/important-data.txt
# umount luks-escrow/
# cryptsetup luksClose luks-escrow 

In questo stato abbiamo un disco cifrato con una password utente e un file al suo interno.

Sono cambiate le policy aziendali ed ogni disco cifrato deve avere una escrow key generata randomicamente dal responsabile della sicurezza IT. Iniziamo a generare le password

# cat utenti.txt | while read user; do echo $user `pwgen 10 1 ` ; done
user1 phaibuxaif
user2 ieghoongah
user3 emahshiele
user4 uoyeineeng

L’output generato andrebbe stampato e messo al sicuro, ma prima andiamo sulla prima macchina ad aggiungere la password.

# cryptsetup luksAddKey /dev/sdb
Enter any existing passphrase: Hohl6eevei
Enter new passphrase for key slot: phaibuxaif
Verify passphrase: phaibuxaif

Che cosa ha fatto luks? Ha richiesto una password valida, decifrato e caricato in memoria la chiave di cifratura, ri-cifrato la chiave con la nuova password, salvata su disco e cancellato tutto dalla memoria.

Verifichiamo di poter leggere il file segreto e importante all’interno del disco con la nostra key escrow:

# cryptsetup luksOpen /dev/sdb luks-escrow
Enter passphrase for /dev/sdb: phaibuxaif
# mount /dev/mapper/luks-escrow luks-escrow/
# ls -l luks-escrow/
total 20
-rw-r--r-- 1 root root    29 Nov 21 15:15 important-data.txt
drwx------ 2 root root 16384 Nov 21 15:12 lost+found
# cat luks-escrow/important-data.txt 
Fri Nov 21 15:15:33 CET 2014

Non solo key escrow

Possiamo sfruttare le password multiple non solo come key escrow aziendale ma anche per utilizzare una risorsa cifrata tra piú persone senza necessariamente condividere la stessa password, unica limitazione sono gli 8 slot per le chiavi cifrate.

Buona cifratura! 🙂