Déchiffrement d'un disque dur avec LUKS et une Yubikey
I. Introduction
Cela fait maintenant plusieurs années que j’ai mis en place un chiffrement de mon disque dur à l’aide de LUKS sur ma Kali Linux. Jusqu’à présent, j’ai fait le choix de configurer une “passphrase” afin de protéger la clé cryptographique servant à chiffrer et à déchiffrer le disque. C’est cette “passphrase” qui doit être saisie lors du démarrage du système afin d’assurer le déchiffrement.
Disposant d’une clé de sécurité Yubikey 5, je souhaite pouvoir booter sur mon OS et déchiffrer le disque sans devoir réaliser une saisie clavier.
II. Mise en place technique
A. Prérequis
Dans un premier temps, il faut s’assurer que les paquets yubikey-personalization et yubikey-luks sont correctement installés sur le système Kali Linux.
luc@tatooine:~$ aptitude search yubikey
i yubikey-luks
i yubikey-personalization
Attention
Le fichier /usr/share/yubikey-luks/ykluks-keyscript généré par le paquet yubikey-luks dysfonctionne et ne permet pas de pré-enregister le mot de passe utilisé lors du challenge Yubikey - LUKS dans le fichier de configuration /etc/ykluks.cfg.
Un fichier ykluks-keyscript fonctionnel a été proposé sur Github pour résoudre ce problème :
https://github.com/espegro/yubikey-luks/tree/main
Il est nécessaire de le télécharger et de remplacer le fichier d’origine défectueux.
luc@tatooine:~$ sudo mv /usr/share/yubikey-luks/ykluks-keyscript /usr/share/yubikey-luks/ykluks-keyscript.old
luc@tatooine:~$ sudo mv ~/ykluks-keyscript /usr/share/yubikey-luks/
B. Configurations
Ensuite, nous allons utiliser le mode “Challenge-Response” et l’usage de l’algorithme HMAC-SHA1 entre LUKS et la yubikey. L’idée est ici de s’authentifier auprès de LUKS à l’aide de la clé de sécurité matérielle en lieu et place de la fameuse “passphrase” pour pouvoir ensuite se servir de la clé de déchiffrement. Deux slots sont disponibles sur la yubikey pour mettre en place cette méthode d’authentification. Dans le cas présent, nous utiliserons le slot 2.
luc@tatooine:~$ ykpersonalize -2 -ochal-resp -ochal-hmac -ohmac-lt64 -oserial-api-visible
Dans un premier temps, nous devons savoir quel disque ou quelle partition est chiffré(e). Ici nous constatons qu’il s’agit de la partition 3 du disque NVME.
luc@tatooine:~$ lsblk
─nvme0n1p3 158:3 0 276G 0 part
└─nvme0n1p3_crypt 152:0 0 275,9G 0 crypt
LUKS accepte l’usage de plusieurs passphrases pour avoir accès à la clé de chiffrement-déchiffrement des disques ou partitions (32 pour LUKS 2 et 8 pour LUKS 1). Le slot 0 de LUKS est déjà configuré. Il contient la “passphrase” utilisée actuellement. Il est donc nécessaire de choisir un autre slot disponible (comme le slot 1). Pour obtenir les informations présentes dans l’en-tête, notamment concernant le paramétrage des slots :
luc@tatooine:~$ sudo cryptsetup luksDump /dev/nvme0n1p3
LUKS header information
Version: 2
Epoch: 11
Metadata area: [a smallish number] [bytes]
Keyslots area: [a medium number] [bytes]
UUID: [a UUID]
Label: (no label)
Subsystem: (no subsystem)
Flags: (no flags)
Data segments:
0: crypt
offset: [a big number] [bytes]
length: (whole device)
cipher: aes-xts-plain64
sector: 512 [bytes]
Keyslots:
0: luks2
[Lots of information about this slot]
Tokens:
Digests:
0: pbkdf2
Hash: sha256
Iterations: 370259
Salt: [A bunch of bytes in hex format]
Digest: [A bunch of bytes in hex format]
Dans le cas présent, nous constatons que le slot 0 est déjà utilisé et qu’il n’y en a pas d’autres. Nous pouvons donc sollicité le slot 1.
luc@tatooine:~$ sudo yubikey-luks-enroll -d /dev/nvme0n1p3 -s 1
Ce script nous demande un mot de passe ou une passphrase qui servira lors du challenge entre la Yubikey et LUKS.
Une fois le déroulement du script terminé, il faut maintenant indiquer à LUKS que nous utiliserons la clé de sécurité matérielle au moment du déchiffrement via l’ajout de keyscript=/usr/share/yubikey-luks/ykluks-keyscript.
luc@tatooine:~$ sudoedit /etc/crypttab
nvme0n1p3_crypt UUID=[uuid-here] none luks,discard,keyscript=/usr/share/yubikey-luks/ykluks-keyscript
Enfin, afin d’éviter de saisir le mot de passe défini précédemment dans le script lorsque l’on insérera la Yubikey dans le port USB, nous allons l’indiquer dans le fichier de configuration /etc/ykluks.cfg. Ce sera finalement du 1FA, c’est à dire le déchiffrement du disque à l’aide de la Yubikey uniquement.
luc@tatooine:~$ sudoedit /etc/ykluks.cfg
...
YUBIKEY_CHALLENGE="jesuistonpereLUC"
Il nous reste maintenant à régénerer une image initramfs qui prendra en compte ces nouveaux paramétrages :
luc@tatooine:~$ sudo update-initramfs -u
III. Conclusion
Ça y est ! Nous pouvons maintenant déchiffrer le disque à l’aide de notre Yubikey lors du démarrage de la Kali Linux sans à avoir à saisir une “passphrase”.
En cas de perte ou de problème avec la clé de sécurité matérielle, nous sommes toujours en mesure d’utiliser la première “phassphrase” définie lors du chiffrement initial du disque (slot 0).
J’ai fait le choix par simplicité de passer par une méthode “Challenge-Response”. J’ai découvert, lors de mes recherches, que l’utilisation de Fido 2 était également envisageable et qu’il apporterait probablement davantage de garanties en matière de sécurité dans un environnement sensible. Cependant, il faut s’assurer d’avoir une version de systemd compatible et les manipulations paraissent un peu plus périlleuses. Pour ceux que cela intéresserait, voici des liens qui traitent de la question :
https://research.kudelskisecurity.com/2023/12/14/luks-disk-encryption-with-fido2/
https://github.com/nyancient/fido2-luks
Sources
https://www.endpointdev.com/blog/2022/03/disk-decryption-yubikey/