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.

Image non disponible

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 :

Image non disponible

Image non disponible

Image non disponible

Image non disponible

Image non disponible

Image non disponible

Image non disponible

4-1. Création partitions

Nous ouvrons ensuite un terminal. (avec ctrl-alt-t sur Ubuntu):

Image non disponible

Nous passons en root avec la commande :

 
Sélectionnez
~# sudo -i

Nous lançons ensuite GParted pour créer les partitions :

 
Sélectionnez
~# gparted

Il nous faudra commencer par créer une table de partitions, en GPT (pour l’UEFI) :

Image non disponible

Image non disponible

Nous créons ensuite une partition FAT32 pour l’ESP :

Image non disponible

Image non disponible

Et enfin une partition lvm2 pv pour le reste de l’espace disque :

Image non disponible

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 :

 
Sélectionnez
~# pvcreate /dev/sda2

ce qui retournera :

 
Sélectionnez
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 :

 
Sélectionnez
~# 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 :

 
Sélectionnez
~# vgcreate vg0 /dev/sda2

ce qui retournera :

 
Sélectionnez
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 :

 
Sélectionnez
~# 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 / :

 
Sélectionnez
~# 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 :

 
Sélectionnez
~# 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 :

 
Sélectionnez
~# cryptsetup luksFormat --type luks2 /dev/vg0/lvroot

Il nous sera demandé de confirmer l’écrasement du contenu du volume en tapant « YES » :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
~# 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 :

 
Sélectionnez
~# mkfs.ext4 /dev/mapper/root-crypt

qui retournera :

 
Sélectionnez
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 :

 
Sélectionnez
~# 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 :

 
Sélectionnez
apt update
apt install deboostrap

Nous installons ensuite la base de la distribution Debian Buster  dans le point de montage /mnt :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
/# 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é :

 
Sélectionnez
apt install cryptsetup

Il vous sera alors demandé les réglages clavier, nous sélectionnerons un clavier AZERTY français :

Image non disponible

Image non disponible

Image non disponible

Image non disponible

Nous installons ensuite LVM :

 
Sélectionnez
apt install lvm2

Il est tout à fait possible d’installer cryptsetup et lvm en même temps avec la commande :

 
Sélectionnez
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.

 
Sélectionnez
/# 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 :

 
Sélectionnez
:/# 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 :

 
Sélectionnez
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.

 
Sélectionnez
blkid | grep lvroot >> /etc/crypttab
 
Sélectionnez
blkid | grep lvboot >> /etc/crypttab

Nous nous retrouverons avec un fichier crypttab contenant :

 
Sélectionnez
# <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 :

 
Sélectionnez
# <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 :

 
Sélectionnez
nano /etc/fstab
 
Sélectionnez
# 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 :

 
Sélectionnez
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 :

 
Sélectionnez
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.

 
Sélectionnez
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 :

 
Sélectionnez
mkdir /boot/efi

Nous ajoutons l’entrée suivante dans le fstab pour la partition ESP (qui est en fait une partition FAT32) :

 
Sélectionnez
/dev/sda1  /boot/efi   vfat    rw     0       1

Suivi de :

 
Sélectionnez
mount -a

Nous installons ensuite GRUB proprement dit :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
# blkid | grep root-crypt >> /etc/default/grub

Nous modifions la ligne ajoutée :

 
Sélectionnez
/dev/mapper/root-crypt: UUID="799c1cc5-5c91-41d0-8a21-b315bda934a6" TYPE="ext4"

par :

 
Sélectionnez
GRUB_CMDLINE="cryptdevice=UUID=799c1cc5-5c91-41d0-8a21-b315bda934a6:luks"

Nous appliquons ensuite la configuration GRUB :

 
Sélectionnez
update-grub

suivi de :

 
Sélectionnez
grub-install

5-3. Finalisation

Nous quittons ensuite le chroot avec :

 
Sélectionnez
exit

Et copions les fichiers network/interfaces et resolv.confdepuis le live-cd :

 
Sélectionnez
cp /etc/network/interfaces etc/network
cp /etc/resolv.conf etc/

Nous arrêtons ensuite le système :

 
Sélectionnez
poweroff

6. Premier démarrage de l’OS préparé

Au démarrage, GRUB vous demandera le mot de passe :

Image non disponible

Après un délai lié à l’ouverture du conteneur LUKS, vous aurez l’écran GRUB normal :

Image non disponible

Le système demandera ensuite la clé de déverrouillage de la partition racine :

Image non disponible

Sera ensuite redemandée la clé du volume /boot :

Image non disponible

Et vous aurez enfin la demande d’authentification habituelle du shell :

Image non disponible

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 :

 
Sélectionnez
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 :

 
Sélectionnez
apt install locales

qu’il est nécessaire de paramétrer :

 
Sélectionnez
dpkg-reconfigure locales

Image non disponible

Image non disponible

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 :

 
Sélectionnez
apt update

6-1-3. Mise à jour du fuseau horaire

La mise à jour du fuseau horaire se fera en reconfigurant tzdata :

 
Sélectionnez
dpkg-reconfigure tzdata

Image non disponible

Image non disponible

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 :

 
Sélectionnez
mkdir /etc/keys

Nous créons le fichier proprement dit :

 
Sélectionnez
~#/ 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 :

 
Sélectionnez
~#/ 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 :

 
Sélectionnez
~#/ 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 :

 
Sélectionnez
boot-crypt      UUID=8c7557b5-caab-4f0c-9df4-1a050209b872       none    luks

par :

 
Sélectionnez
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 :

 
Sélectionnez
#!/bin/sh
cp /etc/keys/boot.key "${DESTDIR}"

Nous lui affectons les droits d’exécution :

 
Sélectionnez
~# 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 :

 
Sélectionnez
root-crypt     UUID=2a2cfaca-97e6-4047-b610-d78ec05c094c       none    luks

par :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
chmod 600 /swapfile

Création du swap proprement dit :

 
Sélectionnez
~# 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 :

 
Sélectionnez
/swapfile       swap    swap    defaults        0       0

et enfin, activer celui-ci :

 
Sélectionnez
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 :

 
Sélectionnez
cryptsetup luksOpen /dev/vg0/lvroot root-crypt

Puis le monter :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
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 :

 
Sélectionnez
~# cryptsetup luksDump /dev/vg0/lvroot

Ceci retournera :

 
Sélectionnez
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 :

 
Sélectionnez
~# cryptsetup luksChangeKey /dev/vg0/lvroot

Il vous sera demandé la clé à modifier et la nouvelle clé de remplacement :

 
Sélectionnez
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.