Dans la suite de mes articles sur le chiffrement des disques système, je vous présente le chiffrement dâun système Linux avec LUKS incorporé dans un volume logique.
Nâhésitez pas : Commentez
Publié le 25 avril 2024Â
Version PDF Version hors-ligne
Dans la suite de mes articles sur le chiffrement des disques système, dont vous trouverez les liens en fin de tutoriel Articles en lien avec le sujet , je vous présente le chiffrement dâun système Linux avec LUKS incorporé dans un volume logique.
LUKS, pour Linux Unified Key Setup est le système de chiffrement de volume intégré à Linux.
Lâincorporation dans un volume logique permettra une souplesse telle que lâagrandissement du volume logique en ajoutant un disque physique au volume, le remplacement dâun disque en déplaçant son contenu en tâche de fond, lâutilisation de clichés, la gestion de RAID depuis LVM, etc.
Lâinstallation a été faite à partir dâune distribution Ubuntu 18 Live et dâun système Debian Buster installé dans une machine virtuelle. Lâutilisation dâune version plus récente ne devrait pas entraîner de difficultés supplémentaires.
Lâinstallation depuis une distribution basée sur RedHat ou autre telle que Arch Linux nâa pas été testée, mais devrait être réalisable. Seule lâadaptation des commandes liées à la distribution (gestionnaire de paquets, par exemple) sera nécessaire.
Le système sera installé en UEFI .
LVM , pour Logical Volume Manager est un système qui permet une abstraction matérielle de lâespace disque.
Ci-dessous un schéma présentant lâutilisation de LVM et LUKS dans notre cas de figure.
Un ou plusieurs disques durs physiques (plus précisément des partitions) sont intégrés dans un Volume Group . Il sera possible dâajouter des disques ultérieurement et dâen supprimer tant quâaucune donnée nâest stockée dessus (des commandes permettent de déplacer des blocs occupés dâun disque physique à un autre). Ceci permet donc le remplacement dâun disque à chaud en migrant les blocs occupés sur un disque physique vers un autre disque.
Nous créerons nos volumes logiques dans ce Volume Group , dans lesquels nous encapsulerons nos conteneurs LUKS qui contiendront nos données chiffrées. Et enfin nous créerons notre (ou nos) système de fichiers dans ces conteneurs.
Il est tout à fait possible de créer un volume LUKS directement dans une partition, donc sans utiliser LVM, mais LVM permet une plus grande souplesse comme présenté en introduction. Câest également la méthode utilisée lors de lâinstallation dâun système Linux depuis lâinterface graphique.
Il est également possible de monter un volume chiffré dans un fichier image monté en loopback, mais cet aspect ne sera pas traité ici.
Dans ce schéma, dans notre conteneur LUKS de gauche, il pourrait y avoir plusieurs partitions (par exemple une partition /home ) ou même un autre système de fichiers. Dans lâabsolu, notre volume LVM pourrait même contenir plusieurs conteneurs LUKS .
Les installations depuis les live-cd permettent en général une installation automatique utilisant LUKS et LVM . Nous allons voir comment le faire manuellement et aussi gérer le fait que GRUB ne supporte que la version 1 de LUKS .
Nous commencerons par créer une partition FAT32 qui sera la partition ESP ( EFI System Partition ), puis nous ajouterons ensuite une partition de type « LVM2 PV » (PV pour Physical Volume ) qui contiendra nos conteneurs LUKS encapsulés dans des volumes logiques.
Nous créerons donc une partition /boot en LUKS 1, qui contiendra le noyau et lâ initramfs , et la partition racine / qui sera, elle, en LUKS 2, ceci permettant de nâavoir que la partition /boot en LUKS  1.
Nous ferons également en sorte que la clé de déverrouillage ne soit demandée quâau niveau de GRUB .
LUKS 2 est considéré comme plus robuste que LUKS 1, et permet notamment la modification de lâalgorithme de chiffrement.
Cependant, GRUB nâest pas compatible avec LUKS 2. Des patchs existent, mais ne sont pas toujours intégrés aux distributions.
Mon choix sâest donc porté sur un démarrage avec un volume boot chiffré en LUKS 1, le volume racine étant lui chiffré en LUKS 2.
Depuis le live-cd Ubuntu 18 démarré en UEFI , nous commençons par activer le clavier en français :
Nous ouvrons ensuite un terminal. (avec ctrl-alt-t sur Ubuntu):
Nous passons en root avec la commande :
Nous lançons ensuite GParted pour créer les partitions :
Il nous faudra commencer par créer une table de partitions, en GPT (pour lâ UEFI ) :
Nous créons ensuite une partition FAT32 pour lâ ESP  :
Et enfin une partition lvm2 pv pour le reste de lâespace disque :
Comme présenté au chapitre 2, il est nécessaire de créer les différentes structures utilisées par LVM :
Nous allons ensuite affecter notre volume physique (notre partition PV LVM2) Ã lâusage de LVM Â :
ce qui retournera :
Cette opération écrira des métadonnées dans la partition à lâusage de LVM.
La commande pvdisplay permet de voir le détail des partitions physiques affectées à LVM :
Le champ « VG Name » est vide, le PV nâétant actuellement affecté à aucun groupe.
Nous créons ensuite notre Volume Group avec pour nom vg0  :
Rappel : un Volume Group peut contenir plusieurs disques physiques, ce qui ne sera pas le cas ici.
La commande vgdisplay nous donne le détail du Volume Group  :
Nous voyons dans les informations que le VG est redimensionnable et quâil nâa aucun PE (bloc virtuel) alloué, ce qui est normal, nous nâavons créé à ce stade aucun volume logique.
Si nous réaffichons la commande pvdisplay après création du Volume Group , le champ « VG Name » contiendra vg0.
Nous créons ensuite un Logical Volume (un volume logique) pour /boot et un autre pour le /  :
La commande lvdisplay nous permet de voir le détail des volumes logiques (et dans quel Volume Group ils se trouvent, pertinent en cas de présence de plusieurs Volume Group  :
Jâai nommé ici mon volume de démarrage lvboot et mon volume racine lvroot.
Nous allons créer maintenant le volume LUKS pour la racine / dans la partition LVM :
Il nous sera demandé de confirmer lâécrasement du contenu du volume en tapant « YES » :
Il nous sera demandé le code du volume, sa « passphrase » ainsi que la confirmation :
La console sera bloquée pendant quelques secondes.
Le volume LUKS créé, il va nous falloir lâouvrir :
Vous aurez la même latence que lors de la création du volume LUKS.
à ce stade, le volume LUKS que jâai ici nommé root-crypt sera accessible depuis /dev/mapper/root-crypt .
Nous créons ensuite un système de fichiers Ext4 dans le volume LUKS  :
Nous effectuons enfin le montage du nouveau système de fichiers :
Deboostrap est un utilitaire permettant l'installation dâune base Debian dans le sous-répertoire d'un autre système déjà existant.
Pour effectuer notre installation, nous allons préparer un système de base avec Debootstrap , puis se placer à lâintérieur de celui-ci avec chroot pour effectuer les réglages nécessaires.
Pour pouvoir installer Debootstrap, il faudra commencer par ajouter « universe » en fin de la ligne principale du fichier /etc/apt/source.list .
Nous mettons ensuite à jour les dépôts et installons debootstrap :
Nous installons ensuite la base de la distribution Debian Buster dans le point de montage /mnt  :
Rappel : vous pouvez installer une autre version de Debian, le principe étant le même. Il pourrait y avoir de légères nuances sur la suite de lâinstallation non évoquées dans ce tutoriel.
Vous pouvez voir les versions supportées par Debootstrap en allant voir le dossier /usr/share/debootstrap/script .
Nous passons ensuite en chroot :
Pour effectuer un chroot sur un système existant, il est rarement nécessaire de monter /run dans celui-ci. Ce sera par contre indispensable pour ne pas avoir de problèmes avec LVM.
Nous commençons par créer un mot de passe root :
Vous pouvez aussi créer un utilisateur ayant les droits sudo comme cela est fait dans la distribution Ubuntu.
Nous installons ensuite cryptsetup dans le système chrooté :
Il vous sera alors demandé les réglages clavier, nous sélectionnerons un clavier AZERTY français :
Nous installons ensuite LVM Â :
Il est tout à fait possible dâinstaller cryptsetup et lvm en même temps avec la commande :
Nous allons préparer le conteneur LUKS pour la partition /boot . Pour rappel, la partition LVM qui accueillera ce conteneur a déjà été créée. Ce conteneur sera nommé boot-crypt.
Pour des raisons de facilité, jâai utilisé le même mot de passe pour les deux volumes LUKS, mais rien nâempêche dâen utiliser des différents.
Nous ouvrons ce conteneur :
Rappel : Il y a aura un lag avant que la console vous redonne la main.
Nous créons ensuite le système de fichiers :
Le fichier crypttab est le fichier de définition des volumes cryptés utilisé pendant la séquence de démarrage. Il va contenir la correspondance entre les noms des volumes cryptés vus dans /dev , leur UUID, lâéventuel fichier de clé (pour ne pas avoir à saisir de code), et les options.
Pour remplir celui-ci, nous allons utiliser la commande blkid avec un filtrage grep et envoyer le contenu dans le fichier crypttab , ceci pour nos deux volumes LUKS actuels : lvroot-crypt et lvboot-crypt.
Nous nous retrouverons avec un fichier crypttab contenant :
quâil nous faudra remplacer par :
Les UUID étant, par définition, uniques, ils seront différents à chaque installation.
Nous complétons maintenant notre fichier fstab :
Nous lançons ensuite la commande :
Ceci nous permet de monter le volume /boot (root étant déjà monté) et du coup de vérifier quâil nây a pas dâerreurs. Lâappel à la commande mount devra présenter /boot monté sâil nây a pas dâerreurs.
Lâétape suivante sera lâinstallation dâun noyau.
Commençons par rechercher ceux disponibles dans les dépôts :
Jâai choisi dans mon cas de figure le noyau linux-image-4.19.0-20-amd64-unsigned , nâutilisant pas Secureboot, et ne souhaitant pas devoir utiliser des modules signés.
Il va nous falloir maintenant installer le chargeur dâamorçage GRUB .
Nous commençons par créer le dossier /boot/efi sur lequel devra pointer la partition ESP  :
Nous ajoutons lâentrée suivante dans le fstab pour la partition ESP (qui est en fait une partition FAT32 ) :
Nous installons ensuite GRUB proprement dit :
Pour que GRUB gère nos volumes chiffrés, il va nous falloir ajouter la ligne suivante dans le fichier /etc/default/grub  :
GRUB doit connaître lâUUID du volume racine.
Nous ajoutons celui-ci dans le fichier avec le même principe que pour le fichier crypttab  :
Nous modifions la ligne ajoutée :
Nous appliquons ensuite la configuration GRUBÂ :
Nous quittons ensuite le chroot avec :
Et copions les fichiers network/interfaces et resolv.conf depuis le live-cd :
Nous arrêtons ensuite le système :
Au démarrage, GRUB vous demandera le mot de passe :
Après un délai lié à lâouverture du conteneur LUKS , vous aurez lâécran GRUB normal :
Le système demandera ensuite la clé de déverrouillage de la partition racine :
Sera ensuite redemandée la clé du volume /boot  :
Et vous aurez enfin la demande dâauthentification habituelle du shell :
Il aurait également été possible de créer un volume chiffré pour le /home . La clé vous aurait alors également été demandée.
Il nous reste à ce stade à configurer le réseau, utiliser les locales en français, et positionner le fuseau horaire.
Ces réglages auraient pu être faits depuis le chroot.
Il nous reste à finaliser les réglages réseau en modifiant les fichiers / etc/network/interfaces et /etc/resolv.conf .
Vous pouvez afficher les différentes cartes réseau vues par le système avec la commande :
Lâutilisation de NetworkManager (qui aurait dû être installé depuis le chroot) simplifie la gestion réseau, que vous devriez un minimum maîtriser si vous effectuez une installation en ligne de commande.
La configuration se fait par lâinstallation du paquet locales :
quâil est nécessaire de paramétrer :
Ceci effectué et pour que les changements soient pris en compte, la session doit être fermée et réouverte.
Finalement, une synchronisation des paquets peut être utile :
La mise à jour du fuseau horaire se fera en reconfigurant tzdata  :
Lâinstallation par debootstrap nâinstalle pas les dépôts de mises à jours (buster-updates et debian-security dans notre cas de figure). Il faudra les ajouter à la main puis effectuer un apt update suivi dâun apt-upgrade .
Nous allons paramétrer le système pour quâune seule clé de déchiffrement ne soit demandée quâau niveau de GRUB.
Nous allons créer un fichier de déverrouillage pour le volume /boot .
Commençons par créer un dossier pour les clés :
Nous créons le fichier proprement dit :
Nous affectons les bons droits au fichier :
Lecture seule pour root, et aucun accès pour les autres utilisateurs.
Nous ajoutons ensuite la clé au conteneur LUKS :
à ce stade, le conteneur est montable soit avec le code soit en passant le fichier .key en paramètre.
Dans le fichier /etc/crypttab, il va falloir remplacer :
Au redémarrage, la clé pour boot-crypt sera demandée au niveau de GRUB et celle pour root-crypt sera demandée ensuite, mais le système ne redemandera pas la clé pour /boot .
Dans le cas de figure présenté ici, jâai utilisé la même clé pour le volume /boot et pour / .
Dans le cas ou une clé différente est souhaitée, il faudra appliquer le même processus que vu pour le volume de boot dans le précédent chapitre (luksAddKey).
Une fois la clé intégrée au volume LUKS , nous allons utiliser le système de hook dâinitramfs pour y intégrer la clé.
Cela sâeffectue en créant un fichier /etc/initramfs-tools/hooks/keyfile  :
Nous lui affectons les droits dâexécution :
Ceci va à chaque création/modification de/dâun initramfs y intégrer le fichier boot.key.
Nous modifions le fichier crypttab en conséquence en remplaçant :
Ceci permettra, dans lâinitramfs, de passer le fichier boot.key en paramètre à LUKS par le biais de cat.
Nous mettons à jour lâinitramfs :
Au redémarrage, la clé ne sera demandée quâau niveau de GRUB.
Nous nâavons jusquâà présent pas utilisé de partition de swap. Pour garder la sécurité, cette partition doit elle aussi être chiffrée.
Plutôt que de créer un volume LUKS, il est possible dâutiliser un simple fichier (swapfile) que lâon peut placer dans la partition / . Ceci simplifiera la configuration.
La commande suivante permet de créer le fichier :
Vous pouvez aussi créer le fichier avec la commande dd.
Je lui attribue les droits de lecture et dâécriture pour root :
Création du swap proprement dit :
Il faut ajouter une nouvelle entrée dans le fichier fstab :
et enfin, activer celui-ci :
Si vous avez besoin dâaccéder au système depuis un live-cd, il vous faudra ouvrir le volume LUKS :
Il est supposé ici que le live-cd utilisé intègre la gestion de LVM, ce qui est le cas du live-cd dâUbuntu utilisé pour la réalisation de ce tutoriel. Un live-cd autre quâUbuntu peut ne pas intégrer LVM par défaut.
Vous pourrez si besoin effectuer un chroot :
Le volume /boot nâest ici pas monté. Pour pouvoir le monter, il va falloir tout dâabord ouvrir le volume LUKS :
Idem dans le cas de présence dâautres partitions chiffrées telle quâune partition pour /home .
Lâutilisation de la commande mount -a permettra de monter tous les volumes utilisés par le système (ou dâindiquer des messages dâerreur en cas de problème de montage, en cas de volume LUKS, ceux-ci doivent préalablement être ouverts).
Si vous avez besoin dâeffectuer un fcsk , nâoubliez pas que le volume LUKS doit être préalablement ouvert.
Une corruption au niveau de la structure LUKS proprement dite entraînera une perte des données. Un volume chiffré sera plus difficile à récupérer en cas de plantage.
Un volume LUKS va contenir plusieurs emplacements de mot de passe ou clé, nommés slots .
Pour lister les clés du volume lvroot :
Nous voyons ici la présence de deux clés, chacune présentée dans un keyslot. Vient ensuite une section token contenant un digest préfixé 0.
Ceci me permet de déterminer la différence entre un slot à passphrase et un slot à fichier de clé.
Pour changer le mot de passe, vous pouvez utiliser la commande :
Il vous sera demandé la clé à modifier et la nouvelle clé de remplacement :
Vous pouvez également ajouter une nouvelle clé avec cryptsetup luksAddKey et supprimer ensuite celle dâorigine avec cryptsetup luksRemoveKey .
Il pourrait être envisagé dâajouter lâutilisation du TPM , évitant la saisie du mot de passe tant que le disque nâest pas monté depuis une autre machine ou que la carte mère de la machine nâest pas changée. Cette option nâa cependant pas été testée dans le cadre de ce tutoriel.
Les prérequis seront dans ce cas :
Ce tutoriel nous a permis dâexplorer le fonctionnement de LUKS ainsi que de LVM , et leur combinaison, dont lâinstallation est transparente quand automatisée via un Live-CD/Live-USB, mais cache une relative complexité.
Je remercie LittleWhite pour sa relecture technique ainsi que f-leb pour sa relecture orthographique.