Renseigner la phrase de passe pour déchiffrer le disque au démarrage peut très rapidement devenir pénible. Sur les systèmes modernes, il y a une puce matérielle dédiée à la sécurité, appelée TPM, qui peut stocker un secret permettant de déchiffrer automatiquement votre disque.
On automatise le déchiffrement de notre partition LUKS par la puce TPM (Trusted Platform Module) grâce aux outils clevis
et systemd-cryptenroll
.
Clevis est un framework pour le déchiffrage automatisé et systemd-cryptenroll est un outil de gestion de jetons (ajout, modification, suppression) et de périphérique de sécurité matériel dans un volume chiffré LUKS2, qui peut ensuite être utilisé pour déverrouiller le volume pendant le démarrage.
Si l'installation est faite correctement, c'est une véritable alternative à une phrase de passe, avec un niveau de sécurité similaire.
Établir une méthode de déverrouillage alternative en utilisant uniquement le matériel embarqué de votre ordinateur, implique une confiance dans la conception sécurisée du matériel et de son firmware. Ensuite, il y a aussi la confiance dans le fait que l'UEFI, le bootloader, le noyau, les initramfs, etc... ne sont pas modifiés.
Si un seul maillon de cette liste est vulnérable, le secret peut être accessible et cette méthode alternative sera fatalement moins sécurisée qu'une phrase de passe uniquement présente dans votre mémoire (et/ou dans un endroit sûr comme un gestionnaire de mots de passe digne de ce nom).
Toutefois ne pas avoir à saisir une phrase de passe à chaque démarrage devrait aider à l'adoption de cette technologie car elle est transparente, tout en ajoutant des obstacles supplémentaires aux accès malveillants.
Une puce TPM2 est un petit module matériel qui fournit essentiellement des API pour les informations WRITE-only ou READ-only et met à disposition des registres appelé PCRs (Platform Configuration Registers). Ces registres contiennent des sommes de contrôle permettant de vérifier l'intégrité des systèmes (example la configuration UEFI).
La spécification UEFI Secure Boot définit les PCR 0 à 7. Tout ce qui se passe au-delà est libre d'utilisation pour le système d'exploitation et les applications.
Voici quelques scénarii usuels de modification de PCR
dracut -f
, vous devez re-associer le disque LUKS avec TPM2. Cela se produira à chaque mise à jour du noyau => Modification des PCR 9 et 10.Clevis génère un nouveau secret de déchiffrage pour le disque chiffré LUKS, le stocke dans la puce TPM2 et configure le TPM2 pour ne renvoyer le secret que si l'état PCR correspond à celui de configuration. Clevis tentera de récupérer le secret et de décrypter automatiquement le disque au moment du démarrage uniquement si l'état est comme attendu.
On vérifie que le secure boot est activé et entièrement déployé. Il ne doit pas être en mode audit.
❯ sudo dmesg | grep Secure
[ 0.000000] secureboot: Secure boot enabled
[ 0.000000] Kernel is locked down from EFI Secure Boot mode; see man kernel_lockdown.7
[ 0.012050] secureboot: Secure boot enabled
[ 15.726545] Bluetooth: hci0: Secure boot is enabled
On vérifie également la présence d'une puce TPM2
❯ sudo dmesg | grep TPM
[ 0.000000] efi: SMBIOS=0x5e7bf000 ACPI=0x5fffe000 ACPI 2.0=0x5fffe014 TPMFinalLog=0x5ff1b000 ESRT=0x5e6b6e18 MEMATTR=0x5b5b7018 MOKvar=0x5e6e5000 RNG=0x5ff96018 TPMEventLog=0x48310018
[ 0.012114] ACPI: TPM2 0x000000005FF9E000 000034 (v04 DELL Dell Inc 20170001 ??LL 20160422)
[ 0.012138] ACPI: Reserving TPM2 table memory at [mem 0x5ff9e000-0x5ff9e033]
[ 0.480216] tpm_tis NTC0702:00: 2.0 TPM (device-id 0xFC, rev-id 1)
[ 0.838783] systemd[1]: systemd 258-1.fc43 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +IPE +SMACK +SECCOMP -GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK +BTF +XKBCOMMON +UTMP +SYSVINIT +LIBARCHIVE)
[ 0.990918] systemd[1]: systemd-pcrphase-initrd.service - TPM PCR Barrier (initrd) was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[ 14.082361] systemd[1]: systemd 258-1.fc43 running in system mode (+PAM +AUDIT +SELINUX -APPARMOR +IMA +IPE +SMACK +SECCOMP -GCRYPT +GNUTLS +OPENSSL +ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN -IPTC +KMOD +LIBCRYPTSETUP +LIBCRYPTSETUP_PLUGINS +LIBFDISK +PCRE2 +PWQUALITY +P11KIT +QRENCODE +TPM2 +BZIP2 +LZ4 +XZ +ZLIB +ZSTD +BPF_FRAMEWORK +BTF +XKBCOMMON +UTMP +SYSVINIT +LIBARCHIVE)
[ 14.569792] systemd[1]: systemd-pcrextend.socket - TPM PCR Measurements was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[ 14.569808] systemd[1]: systemd-pcrlock.socket - Make TPM PCR Policy was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[ 14.593601] systemd[1]: systemd-pcrmachine.service - TPM PCR Machine ID Measurement was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[ 14.594568] systemd[1]: systemd-tpm2-setup-early.service - Early TPM SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
[ 14.609006] systemd[1]: systemd-tpm2-setup.service - TPM SRK Setup was skipped because of an unmet condition check (ConditionSecurity=measured-uki).
Installation de clevis et régénération de l'initramfs afin qu'il y soit inclus.
Le redémarrage est nécessaire afin que clevis puisse calculer la somme de contrôle du nouvel initramfs, au moemnt de sa configuration
sudo dnf install clevis clevis-luks clevis-dracut clevis-udisks2 clevis-systemd
sudo dracut -fv --regenerate-all
sudo systemctl reboot
Listage des disques afin d'obtenir le nom du disque chiffré avec LUKS, ici ce sera donc nvme0n1p3
❯ lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTS
zram0 251:0 0 8G 0 disk [SWAP]
nvme0n1 259:0 0 476,9G 0 disk
├─nvme0n1p1 259:1 0 600M 0 part /boot/efi
├─nvme0n1p2 259:2 0 1G 0 part /boot
└─nvme0n1p3 259:3 0 475,4G 0 part
└─luks-f9d04197-13c5-4ce1-9147-e01b16c13625 252:0 0 475,3G 0 crypt /home
/
Association de notre disque chiffré à la puce TPM2
❯ sudo clevis luks bind -d /dev/nvme0n1p3 tpm2 '{"pcr_ids":"1,4,5,7,9"}'
Enter existing LUKS password:
Vérification de la bonne prise en compte de notre configuration
❯ sudo clevis luks list -d /dev/nvme0n1p3 tpm2
1: tpm2 '{"hash":"sha256","key":"ecc","pcr_bank":"sha256","pcr_ids":"1,4,5,7,9"}'
Mise en place du déchifrement automatique par systemd-cryptenroll
❯ sudo systemd-cryptenroll /dev/nvme0n1p3 --tpm2-device=auto --tpm2-pcrs=1,4,5,7,9
🔐 Please enter current passphrase for disk /dev/nvme0n1p3: ••••••••••••••
New TPM2 token enrolled as key slot 2.
Le paramètre -s spécifie l'emplacement du secret alternatif pour le disque stocké dans le TPM. Il doit être égal à 1 si vous effectuez toujours une dissociation avant d'associer à nouveau.
Lister les PCR configurés
❯ sudo clevis luks list -d /dev/nvme0n1p3 tpm2
1: tpm2 '{"hash":"sha256","key":"ecc","pcr_bank":"sha256","pcr_ids":"1,4,5,7,9"}'
Dissociation
❯ sudo clevis luks unbind -d /dev/nvme0n1p3 -s 1 tpm2
The unbind operation will wipe a slot. This operation is unrecoverable.
Do you wish to erase LUKS slot 1 on /dev/nvme0n1p3? [ynYN] y
Entrez toute phrase secrète restante :
Régénération de l'association
❯ sudo clevis luks regen -d /dev/nvme0n1p3 -s 1 tpm2
Regenerating binding (device /dev/nvme0n1p3, slot 1):
Pin: tpm2, Config: '{"hash":"sha256","key":"ecc","pcr_bank":"sha256","pcr_ids":"1,4,5,7,9"}'
Do you want to proceed? [ynYN] y
Binding regenerated successfully
Modifier la configuration (PCR)
❯ sudo clevis luks edit -d /dev/nvme0n1p3 -s 1 -c '{"pcr_ids":"1,4,5,7,9"}'
Updating binding...
Binding edited successfully