1. Introduction▲
Dans la suite de mes articles sur le chiffrement des disques système, dont vous trouverez les liens en fin de tutorielArticles 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.
1-1. Cadre des tests▲
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.
2. Logical Volume Manager▲
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.
3. Système à base de LVM et 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.
3-1. Pourquoi LUKS 2 au lieu de LUKS 1 ?▲
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.
4. Préparation préinstallation▲
Depuis le live-cd Ubuntu 18 démarré en UEFI, nous commençons par activer le clavier en français :
4-1. Création partitions▲
Nous ouvrons ensuite un terminal. (avec ctrl-alt-t sur Ubuntu):
Nous passons en root avec la commande :
~# sudo -i
Nous lançons ensuite GParted pour créer les partitions :
~# gparted
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 :
4-2. Création des volumes logiques▲
Comme présenté au chapitre 2, il est nécessaire de créer les différentes structures utilisées par LVM :
- un « Physical Volume » (PV) par partition qui sera utilisé avec LVM ;
- un « Volume Group » dans lequel seront intégrés un ou plusieurs PV ;
- un ou plusieurs « Logical Volume » (LV) créés dans le « Volume Group ».
4-2-1. Création d’un « Physical Volume »▲
Nous allons ensuite affecter notre volume physique (notre partition PV LVM2) à l’usage de LVM :
~# pvcreate /dev/sda2
ce qui retournera :
Physical volume "/dev/sda2"
successfully created.
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 :
~# pvdisplay
"/dev/sda2"
is a new physical volume of "24.80 GiB"
--- NEW Physical volume ---
PV Name /dev/sda2
VG Name
PV Size 24
.80
GiB
Allocatable NO
PE Size 0
Total PE 0
Free PE 0
Allocated PE 0
PV UUID 1vGPfB-Tj6q-XZc3-x4f6-EVmv-Lx4B-yvbW71
Le champ « VG Name » est vide, le PV n’étant actuellement affecté à aucun groupe.
4-2-2. Création d’un « Volume Group »▲
Nous créons ensuite notre Volume Group avec pour nom vg0 :
~# vgcreate vg0 /dev/sda2
ce qui retournera :
Volume group "vg0"
successfully created
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 :
~# vgdisplay
--- Volume group ---
VG Name vg0
System ID
Format lvm2
Metadata Areas 1
Metadata Sequence No 1
VG Access read/write
VG Status resizable
MAX LV 0
Cur LV 0
Open LV 0
Max PV 0
Cur PV 1
Act PV 1
VG Size 24
.80
GiB
PE Size 4
.00
MiB
Total PE 6349
Alloc PE / Size 0
/ 0
Free PE / Size 6349
/ 24
.80
GiB
VG UUID 8AS248-bAfV-WQYy-DYSa-RLdl-IKuR-xHoz65
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.
4-2-3. Création des volumes logiques▲
Nous créons ensuite un Logical Volume (un volume logique) pour /boot et un autre pour le / :
~# lvcreate -L1G -nlvboot vg0
Logical volume "lvboot"
created.
~# lvcreate -L22G -nlvroot vg0
Logical volume "lvroot"
created.
- -l : taille du volume logique (exprimé ici en Go) ;
- -n : nom du volume logique ;
- suivi du nom du Volume Group où créer les volumes logiques.
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 :
~# lvdisplay
--- Logical volume ---
LV Path /dev/vg0/lvboot
LV Name lvboot
VG Name vg0
LV UUID 14PQ5I-te2V-248c-Ik4N-CHV8-jeKh-2q9XE1
LV Write Access read/write
LV Creation host, time ubuntu, 2023
-08
-17
06
:05
:34
+0000
LV Status available
# open 0
LV Size 1
.00
GiB
Current LE 256
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253
:0
--- Logical volume ---
LV Path /dev/vg0/lvroot
LV Name lvroot
VG Name vg0
LV UUID spYmuJ-HWEf-FBPW-sS5v-Mpur-IHZw-KCyJKn
LV Write Access read/write
LV Creation host, time ubuntu, 2023
-08
-17
06
:06
:39
+0000
LV Status available
# open 0
LV Size 22
.00
GiB
Current LE 5632
Segments 1
Allocation inherit
Read ahead sectors auto
- currently set to 256
Block device 253
:1
J’ai nommé ici mon volume de démarrage lvboot et mon volume racine lvroot.
4-3. Création volume LUKS▲
Nous allons créer maintenant le volume LUKS pour la racine / dans la partition LVM :
~# cryptsetup luksFormat --type luks2 /dev/vg0/lvroot
Il nous sera demandé de confirmer l’écrasement du contenu du volume en tapant « YES » :
WARNING!
========
This will overwrite data on /dev/vg0/lvroot irrevocably.
Are you sure? (
Type uppercase yes): YES
Il nous sera demandé le code du volume, sa « passphrase » ainsi que la confirmation :
Enter passphrase for
/dev/vg0/lvroot:
Verify passphrase:
root@ubuntu:~#
La console sera bloquée pendant quelques secondes.
4-3-1. Ouverture du volume LUKS▲
Le volume LUKS créé, il va nous falloir l’ouvrir :
~# cryptsetup luksOpen /dev/vg0/lvroot root-crypt
Enter passphrase for
/dev/vg0/lvroot:
root@ubuntu:~#
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.
4-4. Création du système de fichiers▲
Nous créons ensuite un système de fichiers Ext4 dans le volume LUKS :
~# mkfs.ext4 /dev/mapper/root-crypt
qui retournera :
mke2fs 1
.44
.1
(
24
-Mar-2018
)
Creating filesystem with 5766144
4k blocks and 1441792
inodes
Filesystem UUID: 5d7baddc-725e-4ada-9d6b-da042ba18bba
Superblock backups stored on blocks:
32768
, 98304
, 163840
, 229376
, 294912
, 819200
, 884736
, 1605632
, 2654208
,
4096000
Allocating group tables: done
Writing inode tables: done
Creating journal (
32768
blocks): done
Writing superblocks and filesystem accounting information: done
4-4-1. Montage du système de fichiers▲
Nous effectuons enfin le montage du nouveau système de fichiers :
~# mount /dev/mapper/root-crypt /mnt
5. Installation du système▲
5-1. Préparation à base de debootstrap et chroot▲
Deboostrap est un utilitaire permettant l'installation d’une base Debian dans le sous-répertoire d'un autre système déjà existant.
5-1-1. Debootstrap▲
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 :
apt update
apt install deboostrap
Nous installons ensuite la base de la distribution Debian Buster dans le point de montage /mnt :
debootstrap buster /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.
5-1-2. chroot▲
Nous passons ensuite en chroot :
cd /mnt
mount –bind /proc proc
mount –bind /sys sys
mount –bind /dev dev
mount –bind /run run
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.
5-2. Préparation du système chrooté▲
Nous commençons par créer un mot de passe root :
/# passwd root
New password:
Retype new password:
passwd: password updated successfully
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é :
apt install cryptsetup
Il vous sera alors demandé les réglages clavier, nous sélectionnerons un clavier AZERTY français :
Nous installons ensuite LVM :
apt install lvm2
Il est tout à fait possible d’installer cryptsetup et lvm en même temps avec la commande :
apt install cryptsetup lvm2
5-2-1. Création volume /boot▲
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.
/# cryptsetup luksFormat --type luks1 /dev/vg0/lvboot
WARNING!
========
This will overwrite data on /dev/vg0/lvboot irrevocably.
Are you sure? (
Type uppercase yes): YES
Enter passphrase for
/dev/vg0/lvboot:
Verify passphrase:
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 :
:/# cryptsetup luksOpen /dev/vg0/lvboot boot-crypt
Enter passphrase for
/dev/vg0/lvboot:
Rappel : Il y a aura un lag avant que la console vous redonne la main.
Nous créons ensuite le système de fichiers :
mkfs.ext4 /dev/mapper/boot-crypt
mke2fs 1
.44
.5
(
15
-Dec-2018
)
ext2fs_check_if_mount: Can't check if filesystem is mounted due to missing mtab file while determining whether /dev/mapper/boot-crypt is mounted.
Creating filesystem with 261632 4k blocks and 65408 inodes
Filesystem UUID: ca2caa24-ad04-4f92-ae7f-24555648a329
Superblock backups stored on blocks:
32768, 98304, 163840, 229376
Allocating group tables: done
Writing inode tables: done
Creating journal (4096 blocks): done
Writing superblocks and filesystem accounting information: done
5-2-2. Création du fichier de configuration crypttab▲
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.
blkid |
grep lvroot >>
/etc/crypttab
blkid |
grep lvboot >>
/etc/crypttab
Nous nous retrouverons avec un fichier crypttab contenant :
# <target name> <source device> <key file> <options>
/dev/mapper/vg0-lvroot: UUID
=
"cc6e3d92-804c-462c-b479-b9e12f71dded"
TYPE
=
"crypto_LUKS"
/dev/mapper/vg0-lvboot: UUID
=
"8c7557b5-caab-4f0c-9df4-1a050209b872"
TYPE
=
"crypto_LUKS"
qu‘il nous faudra remplacer par :
# <target name> <source device> <key file> <options>
root-crypt UUID
=
cc6e3d92-804c-462c-b479-b9e12f71dded none luks
boot-crypt UUID
=
8c7557b5-caab-4f0c-9df4-1a050209b872 none luks
Les UUID étant, par définition, uniques, ils seront différents à chaque installation.
5-2-3. Création fstab▲
Nous complétons maintenant notre fichier fstab :
nano /etc/fstab
# UNCONFIGURED FSTAB FOR BASE SYSTEM
/dev/mapper/root-crypt / ext4 defaults,rw 0
1
/dev/mapper/boot-crypt /boot ext4 defaults,rw 0
1
Nous lançons ensuite la commande :
mount -a
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.
5-2-4. Installation d’un noyau▲
L’étape suivante sera l’installation d’un noyau.
Commençons par rechercher ceux disponibles dans les dépôts :
apt-cache search linux-image
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.
apt install linux-image-4
.19
.0
-20
-amd64-unsigned
5-2-5. GRUB▲
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 :
mkdir /boot/efi
Nous ajoutons l’entrée suivante dans le fstab pour la partition ESP (qui est en fait une partition FAT32) :
/dev/sda1 /boot/efi vfat rw 0
1
Suivi de :
mount -a
Nous installons ensuite GRUB proprement dit :
apt install grub-efi
Pour que GRUB gère nos volumes chiffrés, il va nous falloir ajouter la ligne suivante dans le fichier /etc/default/grub :
GRUB_ENABLE_CRYPTODISK
=
y
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 :
# blkid | grep root-crypt >> /etc/default/grub
Nous modifions la ligne ajoutée :
/dev/mapper/root-crypt: UUID
=
"799c1cc5-5c91-41d0-8a21-b315bda934a6"
TYPE
=
"ext4"
par :
GRUB_CMDLINE
=
"cryptdevice=UUID=799c1cc5-5c91-41d0-8a21-b315bda934a6:luks"
Nous appliquons ensuite la configuration GRUB :
update-grub
suivi de :
grub-install
5-3. Finalisation▲
Nous quittons ensuite le chroot avec :
exit
Et copions les fichiers network/interfaces et resolv.confdepuis le live-cd :
cp /etc/network/interfaces etc/network
cp /etc/resolv.conf etc/
Nous arrêtons ensuite le système :
poweroff
6. Premier démarrage de l’OS préparé▲
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.
6-1. Finalisation de la configuration▲
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.
6-1-1. Configuration réseau▲
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 :
ip a
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.
6-1-2. Configuration des locales▲
La configuration se fait par l’installation du paquet locales :
apt install locales
qu’il est nécessaire de paramétrer :
dpkg-reconfigure locales
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 :
apt update
6-1-3. Mise à jour du fuseau horaire▲
La mise à jour du fuseau horaire se fera en reconfigurant tzdata :
dpkg-reconfigure tzdata
6-1-4. Mise à jour système▲
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.
7. Suppression des demandes de clés▲
Nous allons paramétrer le système pour qu’une seule clé de déchiffrement ne soit demandée qu’au niveau de GRUB.
7-1. Clé pour le volume /boot▲
Nous allons créer un fichier de déverrouillage pour le volume /boot.
7-1-1. Création du fichier de déverrouillage▲
Commençons par créer un dossier pour les clés :
mkdir /etc/keys
Nous créons le fichier proprement dit :
~#/ dd if=/dev/urandom of=/etc/keys/boot.key bs=1024 count=4
4
+0
enregistrements lus
4
+0
enregistrements écrits
4096
octets (
4
,1
kB, 4
,0
KiB) copiés, 0
,00046406
s, 8
,8
MB/s
Nous affectons les bons droits au fichier :
~#/ chmod 0400 /etc/keys/boot.key
Lecture seule pour root, et aucun accès pour les autres utilisateurs.
Nous ajoutons ensuite la clé au conteneur LUKS :
~#/ cryptsetup luksAddKey /dev/vg0/lvboot /etc/keys/boot.key
Entrez une phrase secrète existante :
À ce stade, le conteneur est montable soit avec le code soit en passant le fichier .key en paramètre.
7-1-2. Intégration du fichier de clé dans le fichier /etc/crypttab▲
Dans le fichier /etc/crypttab, il va falloir remplacer :
boot-crypt UUID
=
8c7557b5-caab-4f0c-9df4-1a050209b872 none luks
par :
boot-crypt UUID
=
8c7557b5-caab-4f0c-9df4-1a050209b872 /etc/keys/boot.key luks
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.
7-2. Clé pour le volume root▲
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).
7-2-1. Hook initramfs▲
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 :
#!/bin/sh
cp /etc/keys/boot.key "
${DESTDIR}
"
Nous lui affectons les droits d’exécution :
~# chmod +x /etc/initramfs-tools/hooks/keyfile
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 :
root-crypt UUID
=
2a2cfaca-97e6-4047
-b610-d78ec05c094c none luks
par :
root-crypt UUID
=
2a2cfaca-97e6-4047
-b610-d78ec05c094c /boot.key luks,keyscript
=
/bin/cat
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 :
update-initramfs -u
Au redémarrage, la clé ne sera demandée qu’au niveau de GRUB.
8. Swap▲
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 :
fallocate -l 1G /swapfile
Vous pouvez aussi créer le fichier avec la commande dd.
Je lui attribue les droits de lecture et d’écriture pour root :
chmod 600
/swapfile
Création du swap proprement dit :
~# mkswap /swapfile
Setting up swapspace version 1
, size =
1024
MiB (
1073737728
bytes)
no label, UUID
=
cb64a865-9ee0-482c-8963
-32aa9c1f33bb
Il faut ajouter une nouvelle entrée dans le fichier fstab :
/swapfile swap swap defaults 0
0
et enfin, activer celui-ci :
swapon -a
9. Maintenance▲
9-1. Dépannage avec un système chiffré▲
Si vous avez besoin d’accéder au système depuis un live-cd, il vous faudra ouvrir le volume LUKS :
cryptsetup luksOpen /dev/vg0/lvroot root-crypt
Puis le monter :
mount /dev/mapper/lvroot-crypt /mnt
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 :
cd /mnt
mount --bind /proc proc
mount --bind /sys sys
mount --bind /dev dev
mount --bind /run run
chroot .
Le volume /boot n’est ici pas monté. Pour pouvoir le monter, il va falloir tout d’abord ouvrir le volume LUKS :
cryptsetup luksOpen /dev/vg0/lvboot boot-crypt
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.
9-2. Changement de clé de chiffrement▲
Un volume LUKS va contenir plusieurs emplacements de mot de passe ou clé, nommés slots.
Pour lister les clés du volume lvroot :
~# cryptsetup luksDump /dev/vg0/lvroot
Ceci retournera :
LUKS header information
Version: 2
Epoch: 4
Metadata area: 16384
[bytes]
Keyslots area: 4161536
[bytes]
UUID: 39c7d3d1-03bd-40f4-a41e-c0de278716aa
Label: (
no label)
Subsystem: (
no subsystem)
Flags: (
no flags)
Data segments:
0
: crypt
offset: 4194304
[bytes]
length: (
whole device)
cipher: aes-xts-plain64
sector: 512
[bytes]
Keyslots:
0
: luks2
Key: 256
bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 256
bits
PBKDF: argon2i
Time cost: 4
Memory: 118683
Threads: 1
Salt: 33
30
2a d0 82
a6 2f 18
9d 0f 44
3f 0f 2c e9 4c
50
a8 d4 ec 8f 2b bb 60
37
41
2d 65
51
70
44
fc
AF stripes: 4000
AF hash: sha256
Area offset:32768
[bytes]
Area length:131072
[bytes]
Digest ID: 0
1
: luks2
Key: 256
bits
Priority: normal
Cipher: aes-xts-plain64
Cipher key: 256
bits
PBKDF: argon2i
Time cost: 4
Memory: 293847
Threads: 1
Salt: 72
6c 02
59
45
fc b9 5a 1b 97
cf b3 6a 08
0d 09
97
2d 07
80
4c b4 fe c7 ad f8 da 28
3d 39
ca a7
AF stripes: 4000
AF hash: sha256
Area offset:163840
[bytes]
Area length:131072
[bytes]
Digest ID: 0
Tokens:
Digests:
0
: pbkdf2
Hash: sha256
Iterations: 87497
Salt: 5e 7d 41
99
a3 50
16
38
e4 63
2a b2 94
39
73
42
e5 0c ac dc 6b c3 28
70
57
02
6d 19
1c e8 eb a2
Digest: 25
db 0e 36
9f 2a 8c 65
e1 70
ea b3 65
40
0d b7
54
34
7e 5d 79
2e fc 28
86
3a f5 1e 17
ef db a2
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 :
~# cryptsetup luksChangeKey /dev/vg0/lvroot
Il vous sera demandé la clé à modifier et la nouvelle clé de remplacement :
Entrez la phrase secrète à changer :
Entrez la nouvelle phrase secrète :
Vérifiez la phrase secrète :
Vous pouvez également ajouter une nouvelle clé avec cryptsetup luksAddKeyet supprimer ensuite celle d’origine avec cryptsetup luksRemoveKey.
10. Pour aller plus loin▲
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 :
- la présence d’une puce TPM ;
- l’utilisation de secureboot ;
- l’utilisation d’un noyau et de modules signés ;
- une version de Debian (ou une base Debian) supportant l’utilisation de TPM.
11. Conclusion▲
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é.
11-1. Articles en lien avec le sujet▲
11-2. Remerciements▲
Je remercie LittleWhite pour sa relecture technique ainsi que f-leb pour sa relecture orthographique.