Use the tpm2 chip to decrypt your disk at startup without entering your passphrase.
When using full disk encryption, it’s always frustrating to have to type your password when you boot your computer. Especially when on Windows with bitlocker enabled, you can decrypt using the tpm2 chip.
Credits goes to https://run.tournament.org.il/ubuntu-20-04-and-tpm2-encrypted-system-disk/
Here you will find the procedure that worked at least for me.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
| linux# apt install tpm2-tools
Lecture des listes de paquets... Fait
Construction de l'arbre des dépendances... Fait
Lecture des informations d'Ă©tat... Fait
Les paquets supplémentaires suivants seront installés :
libtss2-fapi1
Les NOUVEAUX paquets suivants seront installés :
libtss2-fapi1 tpm2-tools
0 mis à jour, 2 nouvellement installés, 0 à enlever et 0 non mis à jour.
Il est nécessaire de prendre 1 051 ko dans les archives.
Après cette opération, 2 794 ko d'espace disque supplémentaires seront utilisés.
Souhaitez-vous continuer ? [O/n] o
RĂ©ception de :1 http://ftp.fr.debian.org/debian bookworm/main amd64 libtss2-fapi1 amd64 3.2.1-3 [311 kB]
RĂ©ception de :2 http://ftp.fr.debian.org/debian bookworm/main amd64 tpm2-tools amd64 5.4-1 [740 kB]
1 051 ko réceptionnés en 0s (7 536 ko/s)
Sélection du paquet libtss2-fapi1:amd64 précédemment désélectionné.
(Lecture de la base de données... 264954 fichiers et répertoires déjà installés.)
Préparation du dépaquetage de .../libtss2-fapi1_3.2.1-3_amd64.deb ...
DĂ©paquetage de libtss2-fapi1:amd64 (3.2.1-3) ...
Sélection du paquet tpm2-tools précédemment désélectionné.
Préparation du dépaquetage de .../tpm2-tools_5.4-1_amd64.deb ...
DĂ©paquetage de tpm2-tools (5.4-1) ...
Paramétrage de libtss2-fapi1:amd64 (3.2.1-3) ...
Paramétrage de tpm2-tools (5.4-1) ...
Traitement des actions différées (« triggers ») pour man-db (2.11.2-2) ...
Traitement des actions différées (« triggers ») pour libc-bin (2.36-9) ...
|
Define TPM2 memory space to hold the key
1
| tpm2_nvdefine -s 64 0x1500016
|
Generate a random 64 character key and write it on the tpm2 chip
1
2
| cat /dev/urandom | tr -dc 'a-zA-Z0-9' | head -c 64 > root.key
tpm2_nvwrite -i root.key 0x1500016
|
You can verify that the key in the tpm chip match your root.key
1
2
3
| echo root.key file contents: `cat root.key`
echo The value stored in TPM: `tpm2_nvread 0x1500016`
tpm2_nvread 0x1500016 2> /dev/null | diff root.key - && echo The root.key file matches what is stored in the TPM. It is ok to proceed! || echo The root.key file does not match what is stored in the TPM. Do NOT proceed until the two match!
|
Add the root.key as a valid decrypt key for your luks volume
1
| cryptsetup luksAddKey /dev/sda3 root.key
|
You can identify your encrypted partition using lsblk
Update initramfs in order to be kernel update resilient
- Create /usr/local/sbin/tpm2-getkey
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| cat << EOF > /usr/local/sbin/tpm2-getkey
#!/bin/sh
if [ -f ".tpm2-getkey.tmp" ]; then
# tmp file exists, meaning we tried the TPM this boot, but it didn’t work for the drive and this must be the second
# or later pass for the drive. Either the TPM is failed/missing, or has the wrong key stored in it.
/lib/cryptsetup/askpass "Automatic disk unlock via TPM failed for () Enter passphrase: "
exit
fi
# No tmp, so it is the first time trying the script. Create a tmp file and try the TPM
touch .tpm2-getkey.tmp
tpm2_nvread 0x1500016
EOF
chown root: /usr/local/sbin/tpm2-getkey
chmod 750 /usr/local/sbin/tpm2-getkey
|
- Create /etc/initramfs-tools/hooks/tpm2-decryptkey
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
| cat << EOF > /etc/initramfs-tools/hooks/tpm2-decryptkey
#!/bin/sh
PREREQ=""
prereqs()
{
echo ""
}
case \$1 in
prereqs)
prereqs
exit 0
;;
esac
. /usr/share/initramfs-tools/hook-functions
copy_exec `which tpm2_nvread`
copy_exec /usr/lib/x86_64-linux-gnu/libtss2-tcti-device.so.0.0.0
copy_exec /usr/lib/x86_64-linux-gnu/libtss2-tcti-device.so.0
copy_exec /lib/cryptsetup/askpass
exit 0
EOF
chown root: /etc/initramfs-tools/hooks/tpm2-decryptkey
chmod 755 /etc/initramfs-tools/hooks/tpm2-decryptkey
|
1
2
3
4
| cp /etc/crypttab /etc/crypttab.backup
sed -i 's%$%,keyscript=/usr/local/sbin/tpm2-getkey%' /etc/crypttab
cp /boot/initrd.img-$(uname -r) /boot/initrd.img-$(uname -r).orig
mkinitramfs -o /boot/initrd.img-$(uname -r) $(uname -r)
|
You are all done, you can reboot !