[Résolu] Déverrouiller deux volumes chiffrés au boot avec une seule passphrase

Bonjour,

je viens de réinstaller mon système sur deux disques durs avec LVM chiffrés.
Lors de l’install, j’ai du créer deux volumes chiffrés. Puis le groupe de volumes et enfin les volumes logiques.
Or lors de la création des volumes chiffrés, j’ai du saisir une passphrase pour chaque disque dur.
Par conséquent au démarrage, je suis obligé de saisir les deux passphrases.
Y-a-t-il un moyen pour ne saisir qu’une fois la passphrase ?
Ai-je mal effectué quelquechose lors de l’installation ?

Pour info mon install est organisée de la manière suivante : la racine et le home sur SSD et reste (/tmp, /var et repertoire de sauvegarde) sur le HDD. Donc les deux disques sont montés au démarrage en même temps.

Merci :slight_smile:

1 J'aime

Si je comprends bien le premier paragraphe, tu as créé un seul VG (groupe de volumes) étendu sur deux PV (volumes physiques), chaque PV étant un volume chiffré stocké dans une partition située sur chacun des deux disques. Dans ce cas il me semble normal que les mots de passe des deux volumes chiffrés soit demandé pour activer les volumes logiques.

Mais dans le second paragraphe tu écris que la racine et divers répertoires système sont sur tel ou tel disque. Or par défaut LVM prend les blocs alloués aux LV (volumes logiques) où bon lui semble et pas dans un PV particulier. Un LV peut même occuper des blocs de plusieurs PV (mais quand on fait ça il est recommandé de mettre en place de la redondance comme du RAID car si on perd un PV on perd tout le LV). La racine est-elle dans le VG chiffré ou dans une partition classique non LVM ?

Si la racine fait partie d’un unique VG étendu sur deux PV chiffrés, même si elle n’est physiquement contenue que dans un des deux PV et même dans l’hypothèse où LVM est capable d’activer les LV contenus dans les PV présents quand d’autres PV du VG sont absents (à vérifier), je doute que l’initramfs soit assez fûté pour ne déchiffrer que le volume contenant la racine (le mot de passe de l’autre volume chiffré pouvant être mis dans un fichier lisible par root seul référencé dans /etc/crypttab).

Pour qu’un seul mot de passe soit demandé, il faudra qu’il n’y ait qu’un seul volume chiffré. C’est faisable en concaténant deux partitions avec du RAID de type “linear” (JBOD), et en chiffrant l’ensemble RAID au lieu des deux partitions. Par contre, si un disque est défectueux c’est tout l’ensemble qui risque d’être inaccessible.

Mais pour ma part, je n’aurais pas créé un unique VG étendu sur deux supports aux caractéristiques aussi différentes qu’un SSD et un disque dur, surtout si c’est pour forcer l’allocation des blocs des LV sur tel ou tel PV. J’aurais plutôt créé un VG distinct sur chaque disque. Pour qu’un seul mot de passe de déchiffrement soit demandé, j’aurais mis tous les LV activés par l’initramfs (racine, /usr, swap utilisé par l’hibernation) dans un même VG, et stocké le mot de passe de l’autre volume chiffré dans un fichier référencé dans /etc/crypttab (chiffré puisque la racine l’est) pour qu’il ne soit pas demandé.

1 J'aime

Merci Pascal pour cette réponse détaillée. J’ai adoré le troisième paragraphe que j’ai dû relire au mois 10 fois :smile:

Alors je me suis en effet peut être mal exprimé.

En fait, j’ai crée un VG que j’ai nommé VG-SSD dans lequel il y a le SSD (sdb5) et un autre nommé VG-HDD dans lequel il y a le disque classique (sda1).
D’après ce que j’ai compris de tes conseils, ce que j’ai fait est correct jusque là.
Car en effet je soupçonnais le fait de tout perdre dans le cas d’un seul VG avec les deux disques physiques en son sein.

Ensuite j’ai crée les LV :

  • 2 LV sur VG-SSD : la racine + home
  • 4 LV sur VG-HDD : /var, /tmp, /Datas, et SWAP

Donc d’après ce que j’ai compris, c’est absolument normal d’avoir à saisir deux passphrases, une par PV chiffré.

En cherchant un peu, j’ai en effet trouvé un moyen de faire lire la passphrase du second disque dans le premier.
En fait, on saisi celle du premier et le second va lire sa passphrase dans le premier dans la mesure ou celui-ci est déchiffré.

Je n’ai pas encore expérimenté la chose, mais pour ceux que ça intéresses, il faut voir du côté de "decrypt_derived"
C’est un script contenu dans la librairie de cryptsetup (/lib/cryptsetup/scripts/decrypt_derived)

Une fois l’opération réalisée, je reviendrai vous en donner des nouvelles.

@PascalHambourg : à propos de ma mise en place de LVM et mon partitionnement, cela te semble-t-il correct ?

Encore merci :slight_smile:

En supposant que l’utilisation du swap n’est pas intensive (sinon il faut penser à ajouter de la RAM), j’aurais mis le swap dans le SSD, pour la rapidité. Si l’espace est limité, tu peux créer un petit swap de priorité élevée (option pri=N dans /etc/fstab, cf. man swapon) sur le SSD et un gros swap de priorité faible sur le disque dur. Ainsi quand le système commence à swapper il utilisera d’abord le swap du SSD, puis, seulement si nécessaire, le swap du disque dur.

2 J'aime

Passage inutile, mais merci pour tes explications, PascalHambourg, c’est super intéressant.

1 J'aime

Bonsoir à tous,

désolé pour cette réponse tardive.
Entre temps j’ai attendu d’avoir le matos pour monter la même config sur un autre PC pour éviter une éventuelle bavure sur la machine principale :grin:

J’ai réussi à faire ce que je voulais grâce au script évoqué plus haut. Sachant qu’il y a encore quelques semaines cela ne fonctionnait pas car apparemment systemd ne lançait pas le script au démarrage. Un bug était d’ailleurs ouvert depuis quelques mois à ce sujet.
Mais cela a depuis été résolu.

Bref pour réaliser la manip voici la démarche :

L’idée est donc de créer une clé (passphrase) pour déverrouiller le second volume. Cette clé sera dérivée de la clé qui permet de déverrouiller le premier volume.
Donc au boot on saisi la passphrase du premier volume, puis le script est lancé pour dériver la clé qui servira à déverrouiller le second volume.
Pour cela il faudra ajouter cette clé dans un slot du second disque.

  1. Creation d’un espace de stockage temporaire en RAM (en root) pour y stocker la clé :

mkdir /mnt/ram
mount -t ramfs -o size=1m ramfs /mnt/ram
chmod 600 /mnt/ram

  1. Création de la clé qui permettra de déverrouiller le second volume (en root) :

sudo /lib/cryptsetup/scripts/decrypt_derived sdb5_crypt > /mnt/ram/cle

Note : sdb5_crypt => le volume (principal) duquel on va dériver la clé

  1. Ajout de cette clé dans le slot de déverrouillage du second disque :
cryptsetup luksAddKey /dev/sda1 /mnt/ram/cle
Entrez une phrase de passe : saisir l'une des passphrases qui permet de déverrouiller ce volume

Note : /dev/sda1 => second volume qui sera déchiffré

  1. Édition du fichier /etc/crypttab.
    Faire un copier puis coller en dessous la ligne qui commence par l’identifiant du second volume. Mettre un dièse en début de ligne pour la commenter.
    Modifier ensuite la ligne que vous avez collée :

sda1_crypt UUID=“UUID” sdb5_crypt luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived

Note :
sda1_crypt => second volume qui sera déverrouillé "automatiquement"
UUID => l’UUID du volume concerné
sdb5_crypt => le volume duquel on va dériver la clé

  1. Suppression du fichier temporaire :

/mnt/ram# shred -u cle

  1. Démonter le répertoire temporaire :

umount /mnt/ram/

  1. Mise à jour initramfs :

sudo update-initramfs -u

Il est recommandé de garder la passphrase sur le second volume. En effet, il ne sera pas possible de déverrouiller le second disque si le premier disque venait à ne pas démarrer…

En espérant que c’est assez clair et que ça aidera quelqu’un :slight_smile:

Encore merci à Pascal
@+

Quelqu’un a-t-il une idée de titre plus parlant pour ce problème/post ?
J’ai l’impression qu’il n’est pas très parlant et que par conséquent certains, rencontrant le même problème, pourraient passer à coté :worried:

Je n’ai pas d’avis sur le titre, mais une remarque : contrairement à tmpfs, le système de fichiers ramfs ne supporte aucune option de montage et donc pas l’option size permettant de limiter sa taille. Il faut donc faire attention à ce qu’on y écrit car il peut consommer toute la mémoire disponible. Je comprends néanmoins que tu préfères utiliser ramfs dont le contenu ne peut pas être swappé, pour éviter que la passphrase puisse se retrouver écrite sur un disque.