Sommaire
Une installation standard de Debian permet de déchiffrer son disque /
au démarrage à l'aide d'une carte à puce GPG (type yubikey, nitrokey, librem key ou autre). Ce journal vise à mettre en avant cette option méconnue.
Configuration
En partant d'une installation Debian standard avec chiffrement (le disque /
est alors placé sous /dev/sda5
, le déverrouillage se fait initialement par mot de passe), il faut modifier le fichier /etc/crypttab
:
sda5_crypt UUID=... /etc/cryptsetup-initramfs/root_key.asc luks,discard,keyscript=/lib/cryptsetup/scripts/decrypt_gnupg-sc
Il faut ensuite peupler les fichiers /etc/cryptsetup-initramfs/root_key.asc
contenant une clé valide chiffrée avec GPG et /etc/cryptsetup-initramfs/pubring.gpg
avec les clés publiques autorisées à déchiffrer cette clé :
openssl rand -base64 30 | tr -d '\n' > root_key
sudo cryptsetup luksAddKey /dev/sda5 root_key
gpg --armor --encrypt -r me@example.com -r trusted_friend@example.com --output - root_key | sudo tee /etc/cryptsetup-initramfs/root_key.asc
gpg --armor --export me@example.com trusted_friend@example.com | sudo tee /etc/cryptsetup-initramfs/pubring.gpg
shred --remove root_key
sudo update-initramfs -u
sudo cryptsetup luksRemoveKey /dev/sda5 # si vous voulez supprimer le mot de passe initial de chiffrement. À ne faire qu'après des tests fructueux !
Dans cette installation, les détenteurs des clés privées "me@example.com" et "trusted_friend@example.com" pourront démarrer la machine, à l'aide de leur carte à puce GPG.
Prérequis
-
cryptsetup-initramfs (installé par défaut si on sélectionne le chiffrement du disque
/
lors de l'installation) - gnupg
- scdaemon
Des clés qui déchiffrent des clés
LUKS
LUKS utilise une clé maître (symétrique) pour chiffrer les données. Cette clé clé est elle-même chiffrée par 1 à 8 clés différentes construites par la dérivation d'un mot de passe (un mot de passe par clé). Lorsqu'on définit un mot de passe ou une phrase de passe de chiffrement :
- LUKS produit une clé de façon déterministe et lente à partir de ce mot de passe
- Puis :
- s'il s'agit d'un nouveau disque chiffré, LUKS choisit aléatoirement une clé de chiffrement maître, chiffre cette clé avec la clé calculée en 1. et stocke le chiffré dans le premier emplacement (luks slot).
- s'il s'agit d'un disque chiffré déjà existant, LUKS demande un mot de passe de déchiffrement correspondant à un emplacement déjà occupé, déchiffre la clé maître avec la clé dérivée de ce mot de passe, puis re-chiffre la clé-maître avec la clé calculéa en 1. et stocke le chiffré dans un emplacement libre.
GPG
De la même façon, un chiffré GPG est composé d'une clé symétrique de chiffrement, elle-même chiffrée avec la clé publique de chacun des destinataires. Un même message peut être ainsi déchiffré par toutes les personnes autorisées.
Dans notre situation, nous utilisons donc :
- le PIN de la carte à puce pour nous authentifier auprès d'elle
- la carte à puce déverrouillée utilise sa clé privée GPG pour déchiffrer la clé symétrique de chiffrement par GPG
- cette clé de déchiffrement est utilisée pour déchiffrer le message, à savoir une phrase de passe pour LUKS (une phrase de 40 caractères base64 aléatoires dans l'exemple ci-dessus)
- cette clé est utilisée par LUKS pour dériver une clé de chiffrement
- cette clé de chiffrement est utilisée pour déchiffrer la clé maître qui contrôle l'accès aux données
Cela fait 6 clés dans le processus. C'est pour cette raison que je préfère que le mot de passe en question soit en caractères base64 : en cas de problème, on peut récupérer le fichier /etc/cryptsetup-initramfs/root_key.asc
(il est notamment présent dans l'initramfs), le déchiffrer dans un autre contexte, puis taper la phrase de passe manuellement.
Considérations de sécurité
Par rapport à un chiffrement par mot de passe simple, on gagne :
- le fait d'avoir un mot de passe de moins à retenir si on utilise déjà une carte à puce GPG
- la protection contre l'attaque par force brute si la carte à puce GPG se verrouille automatiquement après un certain nombre de tentatives. Si un voleur vous pique l'ordinateur ET la carte à puce GPG, il ne pourra pas accéder aux données.
En revanche, nous fragilisons l'ensemble car si tous les destinataires indiqués pour la clé de chiffrement (me@example.com et trusted_friend@example.com dans notre exemple) perdent leur clé GPG, les données sont inaccessibles (il est plus facile de perdre un petit objet que d'oublier un mot de passe qu'on utilise tous les jours).
Un attaquant motivé qui a accès à la machine éteinte pourra toujours modifier l'initramfs de façon à récupérer la clé de chiffrement ou à compromettre le système qui est ensuite démarrer. Pour se prémunir de ce risque, il faudrait vérifier l'intégrité du disque /boot
au moment du démarrage, ce que met en place Purism avec heads par exemple.
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.