02 Feb 2019, 00:00

Notes sur dm-crypt et LUKS

Share

Source principale : la FAQ (ou en tout cas un mirroir) de cryptsetup

dm-crypt et LUKS

dm-crypt chiffre/déchiffre à la volée les données grâce à la master key, qui est directement dérivée du mot de passe fourni. Aucune structure spéciale n’est visible sur le disque, c’est un pur chiffrement 1:1. Si des secteurs sont corrompus, cela n’affectera aucunement les autres secteurs. Il n’y a aucun garde-fou intégré ; si on se trompe dans la clé entrée, ou dans les paramètres de chiffrement, les données seront lues/écrites avec la mauvaise clé, donc risque non-négligeable de perte de données si fausse manipulation.

LUKS est une surcouche à dm-crypt qui stocke la master key salée puis chiffrée dans une en-tête LUKS, qui précède les données chiffrées. Cette clé est déchiffrable grâce à plusieurs mots de passe (jusqu’à 8 différents) stockés dans des “key slots”, situés dans le header également. On peut donc ajouter/supprimer des mots de passe différents pour un même volume. Avec un mauvais mot de passe, LUKS ne nous laissera pas lire/écrire des données incorrectes.
Il est essentiel de backuper ce header à part, car sans lui, il sera impossible d’utiliser les données chiffrées. Il “décrit” la manière dont les données doivent être déchiffrées. Notamment grâce au sel, qui est cryptographiquement non-retrouvable.

Installation et chiffrement

On installe

apt install cryptsetup

Il faut consacrer un périphérique (disque, partition…) à LUKS. Toutes les données dessus seront bien sûr détruites. Ici, c’est sdX.
Il est conseillé d’effacer tous les headers d’anciens FS sur la cible, pour être sûr de ne pas avoir de fsck automatique ou autres joyeusetés qui détruiraient les données chiffrées :

sudo wipefs -a /dev/sdX

On crée le conteneur luks

sudo cryptsetup -y -v luksFormat /dev/sdX

-y : double check du mot de passe
-v : verbose

On déverrouille et mappe le conteneur :

sudo cryptsetup open /dev/sdX c1

Le conteneur sera accessible sur /dev/mapper/c1 (plus tard, lorsque udisks reconnaitra tout seul le conteneur (ou le FS dessus ?), ce sera typiquement /dev/mapper/luks-bla-bla-uuid)

On formate en ext4

sudo mkfs.ext4 /dev/mapper/c1

On peut ensuite monter la partition

sudo mount /dev/mapper/c1 /mnt

Et on a une partition chiffrée, qui s’utilise comme n’importe quel périphérique !

On peut la fermer avec

sudo cryptsetup close c1

Sauvegarde et restauration de l’en-tête !

Une fois que l’on compte se servir du périphérique pour stocker durablement des vraies données, il est indispensable de backuper le header du conteneur. Sans lui (corruption, création d’une table de partition sur le disque…), plus de données !

cryptsetup luksHeaderBackup /dev/sdX --header-backup-file /path/to/backup.img

Et pour restaurer en cas de besoin :

cryptsetup luksHeaderRestore /dev/sdX --header-backup-file /path/to/backup.img

Gestion des clés

Source

On peut créer un fichier clé aléatoire via le périphérique /dev/urandom, et le passer en read-only pour root. Pour ceci :

sudo dd if=/dev/urandom of=/root/keyfile bs=1024 count=4
sudo chmod 0400 /root/keyfile

pour un fichier de 4ko.
Puis on ajoute ce fichier clé à notre conteneur LUKS (qui doit déjà exister, et avoir donc au moins 1 mot de passe) :

sudo cryptsetup luksAddKey /dev/sdX /root/keyfile

Attention, l’en-tête du conteneur ayant été modifiée, il faut penser à mettre à jour le backup !

luksKillSlot  ??
luksRemoveKey ??

Montage automatique au boot

Pour monter automatiquement une partition chiffrée via LUKS au démarrage du système, il faut créer une entrée dans le fichier /etc/crypttab, de ce format :

mapper_name	UUID=01234567-89ab-cdef-0123-456789abcdef	none	luks

mapper_name correspond au nom du mapper qui sera présent dans le dossier /dev/mapper/, et on peut remplacer none par (par exemple) /root/keyfile si on souhaite utiliser un fichier de clé pour déverrouiller le conteneur. Il est bien sûr conseillé de laisser ce fichier clé à un endroit non accessible (par exemple sur une partition déverouillée manuellement par mot de passe).

Il me semble qu’il faut ensuite regénérer l’initramfs :

sudo update-initramfs -k all -u

Divers

Pour voir des infos sur le conteneur LUKS :

cryptsetup luksDump /dev/sdX

Pour voir des infos sur un conteneur LUKS une fois mappé (dans cet exemple sur /dev/mapper/c1) :

cryptsetup -v status c1

Voir la master key lorsque le périphérique est déverrouillé (attention aux yeux trop curieux)

sudo dmsetup table --target crypt --showkey /dev/mapper/c1

Selon plusieurs témoignages sur forum, il faut faire attention à certains installers d’OS qui proposent LUKS, et qui créent un nouveau container par-dessus l’ancien, avec un message trop peu explicite.