Ajouter un disque à un système encrypté
J'ai dû ajouter un disque à un système Debian encrypté, ce disque devant lui aussi être encrypté.
La situation de départ
Le système de base est une Debian 9.0 installée avec LVM + encryption. Le système se présente comme suit:
- Une partition
/dev/sda1
en clair utilisée comme/boot
(elle contient le kernel et la config de GRUB, donc doit être en clair). - Une partition étendue
/dev/sda2
contenant une seule partition logique/dev/sda5
. - Cette partition logique est encryptée, le contenu décrypté étant accessible via
/dev/mapper/sda5_crypt
-
/dev/mapper/sda5_crypt
est utilisé comme physical volume pour le LVM, affecté à un volume group nommé<hostname>-vg
. - Le volume group est divisé en 2 logical volumes pour le système de fichiers racine et le swap.
L'intérêt de cette configuration est que, malgré les multiples partitions, un seul volume doit être déverrouillé au démarrage.
Encryption du nouveau disque
Une fois créée une partition (/dev/sdb1
) sur le nouveau disque, on peut activer l'encryption avec:
cryptsetup -y luksFormat /dev/sdb1
La commande demande d'entrer deux fois un mot de passe pour décrypter le volume.
Pour déverrouiller /dev/sdb1, la commande est:
cryptsetup open /dev/sdb1 sdb1_crypt
(sdb1_crypt
peut être choisi arbitrairement, c'est le nom sous lequel le volume décrypté sera accessible).
On peut maintenant, par exemple, formatter le volume, et ensuite l'ajouter à /etc/fstab
:
mkfs.ext4 /dev/mapper/sdb1_crypt
Pour le reverrouiller:
cryptsetup close /dev/mapper/sdb1_crypt
Tout comme /etc/fstab
pour les systèmes de fichiers, il y a un fichier /etc/crypttab
pour les volumes encryptés; la première chose à faire est de récupérer l'UUID de /dev/sdb1. Une des méthodes (qui donne au passage un aperçu complet des volumes disponibles est:
lsblk -o +uuid
Une fois l'UUID obtenu, on peut ajouter la ligne suivante dans /etc/crypttab
:
sdb1_crypt UUID=xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx none luks
Après avoir modifié ce fichier, il est nécessaire de rafraîchir le ramdisk initial:
update-initramfs -u
Au redémarrage, le système demandera deux mots de passes, pour respectivement /dev/sda5
et /dev/sdb1
.
Un seul mot de passe au démarrage
Les deux mots de passes au démarrage sont assez ennuyeux. On peut arranger ça en ajoutant une deuxième clé, et la stocker dans un fichier:
dd if=/dev/urandom of=/root/sdb1.key bs=1024 count=4 cryptsetup luksAddKey /dev/sdb1 /root/sdb1.key # cryptsetup demande d'entrer la clé déjà définie
Dans l'entrée de sdb1 dans /etc/crypttab, remplacer none par /root/sdb1.key, puis rafraîchier le ramdisk initial:
update-initramfs -u
La procédure de démarrage devient:
-
/dev/sdb5
est déverrouillé avec la clé entrée par l'utilisateur. - Le système de fichiers racine est monté.
-
/root/sdb1.key
est utilisé pour déverrouiller/dev/sdb1
.
Et avec LVM?
Au lieu de simplement formater /dev/sdb1/crypt
, on peut en faire un physical volume et l'ajouter au volume group défini lors de l'installation. Le système est assez intelligent pour initialiser partiellement le volume group et accéder à /root/sdb1.key
pour déverrouiller /dev/sdb1
et compléter le volume group. Par contre, il faudra éviter d'étendre le logical volume racine sur /dev/sdb1
, sans quoi la clé pour /dev/sdb1
ne pourra pas être accessible en temps utile. Au lieu, il faudra créer un nouveau logical volume et le monter quelque part.
Quand ça tourne mal
Si le disque supplémentaire lâche ou est déconnecté, la séquence de démarrage s'arrête, et on a la possibilité de se connecter en administrateur pour supprimer ses entrées dans /etc/crypttab
et /etc/fstab
. Le système sera ainsi capable de redémarrer normalement (sans les volumes hébergés sur /dev/sdb1
).
Pour réutiliser le nouveau disque tout seul, la clé initialement créée est toujours valide (un volume encrypté peut en avoir jusqu'à 8), il est donc toujours possible de le déverrouiller sans avoir accès à la clé stockée sur la racine (qu'on peut aussi sauvegarder dans cette éventualité). Toutes les opérations pour gérer les volumes encryptés se font via la commande cryptsetup, bien documentée dans sa page de man.