Sommaire

Introduction

Si vous avez un ou plusieurs disques chiffrés sur une machine qu’il faut monter il est parfois fastidieux de le faire à la main à chaque reboot.

Le prérequis principal est d’avoir la partition système chiffrée également car la clé de déchiffrement sera stockée en clair dans un fichier.

A noter que les tests ici présents ont été effectués sur une Ubuntu 14.04.3 LTS.

Initialisation du disque

Toutes les actions qui suivent s’exécutent sous l’identifiant root.

Lister les disques

Tout d’abord il faut détecter le disque à chiffrer et pour cela on va utiliser la commande lsblk :

root@demo:~# lsblk 
NAME                         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                            8:0    0     8G  0 disk  
|-sda1                         8:1    0   243M  0 part  /boot
|-sda2                         8:2    0     1K  0 part  
`-sda5                         8:5    0   7.8G  0 part  
  `-sda5_crypt (dm-0)        252:0    0   7.8G  0 crypt 
    |-demo--vg-root (dm-1)   252:1    0     7G  0 lvm   /
    `-demo--vg-swap_1 (dm-2) 252:2    0   764M  0 lvm   [SWAP]
sdb                            8:16   0     8G  0 disk  
sr0                           11:0    1  1024M  0 rom 

le disque sdb est celui qu’il faut chiffrer. Inutile de partitionner nous allons utiliser le device /dev/sdb directement. Pour chiffre le disque on va utiliser la commande cryptosetup et LUKS.

Chiffrement du disque

En théorie pour faire les choses correctement il est préférable d’initialiser proprement le disque avec des données aléatoires, de la manière suivante et :

dd if=/dev/urandom of=/dev/sdb bs=4096

Ça prend beaucoup de temps surtout si le disque est de taille importante. Il est aussi possible, une fois formaté, de le remplir complètement avec des données réelles et d’éviter l’initialisation préalable.

Pour activer le chiffrement en utilisant LUKS il faut utiliser la commande crytosetup.

Le disque sera chiffré en AES XTS-Plain64, avec une clé de 512 bits et un Hash en SHA512.

root@demo:~# cryptsetup luksFormat --cipher aes-xts-plain64 --key-size 512 --hash sha512 /dev/sdb

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

Are you sure? (Type uppercase yes): YES
Enter passphrase: 
Verify passphrase: 

Il faut saisir YES (/!\ tout en lettre capitale) et entrer deux fois votre passphrase.

Vérifier les informations du chiffrement du disque

root@demo:~# cryptsetup luksDump /dev/sdb
LUKS header information for /dev/sdb

Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha512
Payload offset:	4096
MK bits:       	512
MK digest:     	44 17 a5 f6 52 4a 67 1e c5 f4 1d 6e fe 20 2d f6 c2 eb 97 d9 
MK salt:       	27 b0 ef f2 66 c2 51 a4 ee 7b 13 cf 88 1d 5c 6f 
               	15 8b af dc 15 b9 80 fa 56 98 27 60 de 19 57 d0 
MK iterations: 	21000
UUID:          	a3c31bf4-34a8-4917-b5b5-4496070beff5

Key Slot 0: ENABLED
	Iterations:         	84543
	Salt:               	da 45 d3 bf ba 32 2f e4 24 23 1d 34 cb d9 48 35 
	                      	38 32 42 f8 5d 32 6e e1 5f 4a 2f 9a 31 87 38 8b 
	Key material offset:	8
	AF stripes:            	4000
Key Slot 1: DISABLED
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

On vérifie les informations suivantes :

  • chiffrement AES xts-plain64
  • taille de la clé 512 bits
  • Utilisation du SHA512

Le slot 0 est utilisé par la première passphrase.

Formatage du disque

Pour formater le disque il faut mapper le disque chiffré avec un device (que l’on va trouver dans /dev/mapper), ici il va s’appeler ENCDISK_sdb.

root@demo:~# cryptsetup luksOpen /dev/sdb ENCDISK_sdb
Enter passphrase for /dev/sdb: 
root@demo:~# ls /dev/mapper/
ENCDISK_sdb  control  demo--vg-root  demo--vg-swap_1  sda5_crypt

Ensuite on formate le device mappé en ext4 par exemple.

root@demo:~# mkfs.ext4 /dev/mapper/ENCDISK_sdb 
mke2fs 1.42.9 (4-Feb-2014)
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=0 blocks, Stripe width=0 blocks
524288 inodes, 2096640 blocks
104832 blocks (5.00%) reserved for the super user
First data block=0
Maximum filesystem blocks=2147483648
64 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

Allocating group tables: done                            
Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done 

Puis on monte le device mappé dans /mnt par exemple, pour vérifier que tout se passe bien.

root@demo:~# mount /dev/mapper/ENCDISK_sdb /mnt/
root@demo:~# df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/demo--vg-root  6.8G  1.4G  5.0G  22% /
none                       4.0K     0  4.0K   0% /sys/fs/cgroup
udev                       358M   12K  358M   1% /dev
tmpfs                       75M  488K   74M   1% /run
none                       5.0M     0  5.0M   0% /run/lock
none                       371M     0  371M   0% /run/shm
none                       100M     0  100M   0% /run/user
/dev/sda1                  236M   79M  145M  36% /boot
/dev/mapper/ENCDISK_sdb    7.8G   18M  7.4G   1% /mnt

Enfin on démonte et détache le disque chiffré afin de préparer le montage automatique

umount /mnt
cryptsetup luksClose ENCDISK_sdb

Automatisation du montage

Création du fichier contenant la clé

Il est important de stocker la clé dans un répertoire uniquement accessible à root.

root@demo:~# mkdir /etc/securitykeys
root@demo:~# chown root: /etc/securitykeys
root@demo:~# chmod 700 /etc/securitykeys
root@demo:~# dd if=/dev/urandom of=/etc/securitykeys/ENCDISK_sdb.key bs=1024 count=4 iflag=fullblock
4+0 records in
4+0 records out
4096 bytes (4.1 kB) copied, 0.00103909 s, 3.9 MB/s
root@demo:~# chmod 400 /etc/securitykeys/ENCDISK_sdb.key
root@demo:~# ls -la /etc/securitykeys/
total 12
drwx------  2 root root 4096 Oct 16 23:59 .
drwxr-xr-x 91 root root 4096 Oct 16 23:59 ..
-r--------  1 root root 4096 Oct 16 23:59 ENCDISK_sdb.key

Ajout de la clé dans un slot LUKS

root@demo:~# cryptsetup luksAddKey /dev/sdb /etc/securitykeys/ENCDISK_sdb.key 
Enter any passphrase: 

Il faut entrer votre première passphrase pour ajouter la clé au trousseau.

On peut vérifier que la deuxième clé a bien été ajoutée.

root@demo:~# cryptsetup luksDump /dev/sdb
LUKS header information for /dev/sdb

Version:       	1
Cipher name:   	aes
Cipher mode:   	xts-plain64
Hash spec:     	sha512
Payload offset:	4096
MK bits:       	512
MK digest:     	44 17 a5 f6 52 4a 67 1e c5 f4 1d 6e fe 20 2d f6 c2 eb 97 d9 
MK salt:       	27 b0 ef f2 66 c2 51 a4 ee 7b 13 cf 88 1d 5c 6f 
               	15 8b af dc 15 b9 80 fa 56 98 27 60 de 19 57 d0 
MK iterations: 	21000
UUID:          	a3c31bf4-34a8-4917-b5b5-4496070beff5

Key Slot 0: ENABLED
	Iterations:         	84543
	Salt:               	da 45 d3 bf ba 32 2f e4 24 23 1d 34 cb d9 48 35 
	                      	38 32 42 f8 5d 32 6e e1 5f 4a 2f 9a 31 87 38 8b 
	Key material offset:	8
	AF stripes:            	4000
Key Slot 1: ENABLED
	Iterations:         	83550
	Salt:               	9f 44 a2 01 02 aa 72 5b a9 29 f9 f1 9c d6 d1 c6 
	                      	70 13 db 81 59 8d f5 6e 99 71 80 03 53 69 3d f2 
	Key material offset:	512
	AF stripes:            	4000
Key Slot 2: DISABLED
Key Slot 3: DISABLED
Key Slot 4: DISABLED
Key Slot 5: DISABLED
Key Slot 6: DISABLED
Key Slot 7: DISABLED

Ajouter le disque dans crypttab et fstab

On va déclarer le disque chiffré dans le fichier /etc/crypttab, et dans un premier il faut récupérer l’UUID du disque.

root@demo:~# blkid
/dev/sda1: UUID="c2d5971b-1548-4484-a4fd-c3334555a715" TYPE="ext2" 
/dev/sda5: UUID="08836fe1-a24a-4c7e-b538-4c225f72f012" TYPE="crypto_LUKS" 
/dev/mapper/sda5_crypt: UUID="zpnPXD-WQ07-30q6-66W6-i6Tq-jcPL-y4kmbf" TYPE="LVM2_member" 
/dev/mapper/demo--vg-root: UUID="ca14c49c-ac67-4852-b631-1af91a516f74" TYPE="ext4" 
/dev/mapper/demo--vg-swap_1: UUID="28c4577f-e692-44b2-a379-a28b0227cff1" TYPE="swap" 
/dev/sdb: UUID="a3c31bf4-34a8-4917-b5b5-4496070beff5" TYPE="crypto_LUKS" 

l’UUID du disque est a3c31bf4-34a8-4917-b5b5-4496070beff5. Et on va utiliser comme identifiant ENCDISK_sdb qui nous servira de référence pour le montage via la fstab.

cat /etc/crypttab
sda5_crypt UUID=08836fe1-a24a-4c7e-b538-4c225f72f012 none luks,discard
ENCDISK_sdb UUID=a3c31bf4-34a8-4917-b5b5-4496070beff5 /etc/securitykeys/ENCDISK_sdb.key  luks
cat /etc/fstab
/dev/mapper/demo--vg-root /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda1 during installation
UUID=c2d5971b-1548-4484-a4fd-c3334555a715 /boot           ext2    defaults        0       2
/dev/mapper/demo--vg-swap_1 none            swap    sw              0       0

## disque chiffre
/dev/mapper/ENCDISK_sdb /DATA     ext4    defaults        0       2

Ne pas oublier de faire le point de montage qui est /DATA.

mkdir /DATA

Ensuite on va monter le disque :

root@demo:~# cryptdisks_start ENCDISK_sdb 
 * Starting crypto disk...
 * ENCDISK_sdb (starting)..
 * ENCDISK_sdb (started)...                                              [ OK ] 

mount /DATA
df -h
Filesystem                 Size  Used Avail Use% Mounted on
/dev/mapper/demo--vg-root  6.8G  1.4G  5.0G  22% /
none                       4.0K     0  4.0K   0% /sys/fs/cgroup
udev                       358M   12K  358M   1% /dev
tmpfs                       75M  488K   74M   1% /run
none                       5.0M     0  5.0M   0% /run/lock
none                       371M     0  371M   0% /run/shm
none                       100M     0  100M   0% /run/user
/dev/sda1                  236M   79M  145M  36% /boot
/dev/mapper/ENCDISK_sdb    7.8G   18M  7.4G   1% /DATA

Ensuite on reboot pour vérifier que le montage s’effectue bien automatiquement.

root@demo:~# lsblk 
NAME                         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
sda                            8:0    0     8G  0 disk  
|-sda1                         8:1    0   243M  0 part  /boot
|-sda2                         8:2    0     1K  0 part  
`-sda5                         8:5    0   7.8G  0 part  
  `-sda5_crypt (dm-0)        252:0    0   7.8G  0 crypt 
    |-demo--vg-root (dm-1)   252:1    0     7G  0 lvm   /
    `-demo--vg-swap_1 (dm-2) 252:2    0   764M  0 lvm   [SWAP]
sdb                            8:16   0     8G  0 disk  
`-ENCDISK_sdb (dm-3)         252:3    0     8G  0 crypt /DATA
sr0                           11:0    1  1024M  0 rom