_____ _   _ _    _    ___      _
 / ____| \ | | |  | |  / / |    (_)
| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
 \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\

Wykorzystanie modułu TPM do odblokowania cryptroot

Myślałem, że na zdalnym odblokowywaniu cryptroot seria się skończy, ale rodziła się potrzeba stworzenia laptopa do zdalnej pomocy, przy czym system na tym laptopie miał być jak najbardziej bezobsługowy. To jest użytkownik końcowy ma go tylko włączyć i już jak system się załaduje to załóżmy konsultant działu IT, powinien już się z nim połączyć. Kiedy rozwiązano wszystkie inne problemy - takie jak wybór sposóbu udostępnienia zdalnego pulpitu. Pozostał problem ochrony klucza prywatnego VPN, ze zdjętym hasłem. Dla nas sprawa wydaje się oczywista. Szyfrujemy dysk. A co z wymogiem bezobsługowości? No i tutaj pojawiły się dwa wyjścia, albo wykorzystujemy moduł TPM. Wówczas szyfrowanie dysków na dystrybucjach Linuksa wygląda podobnie do BitLockera na MS Windows. Nie musimy wpisywać żadnych haseł, a dysk odblokowuje się podczas uruchamiania systemu. W takim systemie, dane chronione są przez hasło użytkownika. Drugim wyjściem, było nie szyfrowanie dysku, ale zablokowanie na serwerze proxy sieci VPN możliwości inicjowania połączeniem z innymi hostami sieci prywatnej. Stwierdziłem, że jeżeli pierwszy plan nie wypali, to ostatecznie użyjemy drugiej metody.

Aby rozpocząć konfigurowanie LUKS (dodanie klucza) w użyciem TPM, należy na początku upewnić się że sam TPM jest obecny i funkcjonalny. Tak wygląda włączony i poprawnie działający moduł TPM na Debianie:

xf0r3m@romek:~$ sudo dmesg | grep "TPM"                                                                                                                                                                                                     
[    1.078372] tpm_tis 00:05: 1.2 TPM (device-id 0xB, rev-id 16)
[   32.365170] systemd[1]: systemd 252.26-1~deb12u2 running in system mode 
(+PAM +AUDIT +SELINUX +APPARMOR +IMA +SMACK +SECCOMP +GCRYPT -GNUTLS +OPENSSL
+ACL +BLKID +CURL +ELFUTILS +FIDO2 +IDN2 -IDN +IPTC +KMOD +LIBCRYPTSETUP
+LIBFDISK)

Jeśli pojawi się informacja o tym, że moduł ten jest wyłączony lub zdezaktywowany i/lub pojawiają się komunikaty o błędach w komunikacji z nim, to wówczas należy sprawdzić w BIOS-ie komputera czy jest on włączony. Jeśli nie jesteśmy w stanie odnaleźć takich ustawień, to być może nasza platforma nie posiada modułu TPM (większość, komputerów profesjonalnych takich jak Lenovo TP, Dell Latitude czy komputerów stacjonarnych takich jak HP Z Workstations posiada moduł TPM w wersji zależnej od wieku sprzętu). W BIOS-ach mogą one nazywać się przeróżnie od Security Chip po Embedded Security Device Support.

W przypadku modułów TPM w wersji niższej niż 2.0, może być problem z oprogramowaniem pozwalającym obsługiwać moduł TPM w dzisiejszych wersjach dystrybucji. Jednym z takich programów jest clevis - modularny framework do automatyzacji szyfrowania. Oficjalna wersja nie wspiera modułów TPM poniżej 2.0, więc jeden z hakerów, wykonał fork (własną wersję, czyjegoś projektu) clevisa dodając do niego obsługę modułów TPM <2.0. Jego projekt jest możliwy do instalacji za pomocą paczek .deb. Pakiety mają również zdefiniowane zależności więc po za pobraniem i wydaniem odpowiedniego polecenia nie trzeba nic robić.

xf0r3m@romek:~$ wget https://github.com/oldium/clevis/releases/download/v20_tpm1/clevis-initramfs_20-1+tpm1_amd64.deb
xf0r3m@romek:~$ wget https://github.com/oldium/clevis/releases/download/v20_tpm1/clevis-systemd_20-1+tpm1_amd64.deb
xf0r3m@romek:~$ wget https://github.com/oldium/clevis/releases/download/v20_tpm1/clevis-tpm1_20-1+tpm1_amd64.deb
xf0r3m@romek:~$ wget https://github.com/oldium/clevis/releases/download/v20_tpm1/clevis-luks_20-1+tpm1_amd64.deb
xf0r3m@romek:~$ wget https://github.com/oldium/clevis/releases/download/v20_tpm1/clevis_20-1+tpm1_amd64.deb
xf0r3m@romek:~$ ls
clevis_20-1+tpm1_amd64.deb            clevis-systemd_20-1+tpm1_amd64.deb
clevis-initramfs_20-1+tpm1_amd64.deb  clevis-tpm1_20-1+tpm1_amd64.deb
clevis-luks_20-1+tpm1_amd64.deb
xf0r3m@romek:~$ sudo apt install ./clevis-initramfs_20-1+tpm1_amd64.deb \
./clevis-systemd_20-1+tpm1_amd64.deb ./clevis-tpm1_20-1+tpm1_amd64.deb \
./clevis-luks_20-1+tpm1_amd64.deb ./clevis_20-1+tpm1_amd64.deb

Po zainstalowaniu oprogramowania, można zainicjować moduł TPM. Za pomocą odpowiedniego polecenia. Polecenie zarząda od nas ustawienia sobie hasła właściciela:

xf0r3m@romek:~$ sudo tpm_takeownership -z
Enter owner password: 
Confirm password: 

Polecenie po ustawieniu hasła nie powinno zwrócić żadnych dodatkowych komunikatów. Opcja -z ustawi hasło SRK (Secret Root Key) na 20B samych zer (0). Dzięki czemu będziemy w stanie automatycznie odblokować zaszyfrowany główny system plików.

Po przejęciu kontroli na modułem TPM, możemy dodać klucz zapisany w TPM do naszej zaszyfrowanej partycji.

xf0r3m@romek:~$ sudo clevis luks bind -d /dev/sdb5 tpm1 '{"pcr_ids":"0,4,7"}' 
Enter existing LUKS password: 

Polecenie powinno zakończyć się bez żadnych dodatkowych komunikatów. Wartości PCR_IDS są wskaźnikami status bezpieczeństwa. Ich wartości pozwalają ustalić czy TPM działa w zaufanym środowisku. Jeśli któraś z wartości nie jest zgodna z oczekiwaniami - moduł TPM, może odmówić wydania klucza kryptograficznego.

Po dodaniu klucz do partycji, należy zaktualizować initrd.

xf0r3m@romek:~$ sudo update-initramfs -u -k 'all'
update-initramfs: Generating /boot/initrd.img-6.1.0-23-amd64
update-initramfs: Generating /boot/initrd.img-6.1.0-18-amd64

Aktualizację nalepiej wykonać, dla wszystkich wersji. Stąd opcja -k 'all'.

Dla pewności, aby został uruchomiony odpowiedni plik. Aktualizujemy również konfigurację GRUB-a.

xf0r3m@romek:~$ sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.1.0-23-amd64
Found initrd image: /boot/initrd.img-6.1.0-23-amd64
Found linux image: /boot/vmlinuz-6.1.0-18-amd64
Found initrd image: /boot/initrd.img-6.1.0-18-amd64
Warning: os-prober will be executed to detect other bootable partitions.
Its output will be used to detect bootable binaries on them and create new boot entries.
done

Teraz możemy uruchomić ponownie komputer. Kiedy przyjdzie do odblokowania partycji. Program poprosi nas o hasło, ale po chwili powinien pojawić się komunikat, że partycja został odblokowana przez clevis.

Please unlock disk sda5_crypt:Unlocked /dev/sdb5 with clevis
/dev/mapper/romek--vg--root: clean, 133975/31883264 files, 3426415/127506432 blocks
...
Debian GNU/Linux 12 romek ttyS0

romek login:

Jeśli przed dodaniem klucza do partycji, chcemy sprawdzić czy nasz TPM działa poprawnie. Możemy wykonać prosty test.

xf0r3m@romek:~$ echo test | clevis encrypt tpm1 '{"pcr_ids":"0,4,7"}' | clevis decrypt
test

Ten test powinien zwrócić na wyjściu to samo co dostał na wejściu.

Tak skonfigurowany system będzie bezpieczny, nawet z bootowanie z pendrive-a nic nie da. TPM sprawdzi wartość rejestru nr. 4 i jeśli nie uruchomiliśmy komputera z prawidłowego dysku to nie wyda klucza.

Źródła:

~ xf0r3m