Utilser la puce TPM2 pour déchriffer les disques

securite poste-de-travail fedora luks tpm

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.

Implications de sécurité

É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.

Un peu de théorie

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).

PCR

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.

  • PCR 0: Infos du firmware EFI: version, etc...
  • PCR 1: Configuration et informations supplémentaires relatives au firmware EFI
  • PCR 2: Pilotes (drivers) EFI depuis les composants matériels (comme un contrôleur RAID)
  • PCR 3: Configuration et informations supplémentaires aux pilotes stockés dans PCR 2
  • PCR 4: Diagnostics pré OS et le chargeur de démarrage EFI de OS (bootloader)
  • PCR 5: Configuration EFI du chargeur de démarrage et de la table des partitions GPT
  • PCR 6: Est réservé aux variables du fabricant de la plate-forme hôte et n'est pas utilisé par EFI
  • PCR 7: Stocke la configuration de la stratégie de démarrage sécurisée

Voici quelques scénarii usuels de modification de PCR

  • Régénération des initramfs en utilisant 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.
  • Modifier la configuration Grub, comme l'ajout d'arguments du noyau, de noyaux, etc... => Modification des PCR 8, 9 et 10.
  • Ajout de dispositifs de stockage => Modification des PCR 8 et 10. Toutefois les clés Hubs et YubiKeys ne semblent pas modifier les PCR.
  • Fixation d'une clé USB bootableavant le démarrage => Modification des PCR 1.
  • Démarrage avec une clé bootable => Modification des PCR 1, 4, 5, 8, 9 et 10.

Clevis

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.

Vérifications des pré-requis

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).

Implémentation

  1. 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
  2. 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
                                                                            /
  3. 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: 
  4. 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"}'
  5. 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.

Tâches usuelles:

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.

  1. 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"}'
  2. 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 :
  3. 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
  4. 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

Article précédent