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/

https://github.com/cornelinux/yubikey-luks

https://github.com/espegro/yubikey-luks/tree/main