Julien De Bona
Free Software, Cooking, and Everything


Ajouter un disque à un système encrypté

Publié le 2019-05-27.

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:

  1. /dev/sdb5 est déverrouillé avec la clé entrée par l'utilisateur.
  2. Le système de fichiers racine est monté.
  3. /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.


Quelques tags ...