]> gitweb.morketsmerke.org Git - mmdev.git/commitdiff
Napisano artykuł o odblokowaniu cryptroot przez TPM. Do przeredagowania i sprawdzenia...
authorxf0r3m <jakubstasinski@protonmail.com>
Sat, 24 Aug 2024 18:15:30 +0000 (20:15 +0200)
committerxf0r3m <jakubstasinski@protonmail.com>
Sat, 24 Aug 2024 18:15:30 +0000 (20:15 +0200)
articles/linux/index.html
articles/linux/wykorzystanie_modulu_TPM_do_odblokowania_cryptroot.html [new file with mode: 0644]

index f40beb3aa3f21c801b36384d61e929de71c222b5..2883d97b4148d1aea8dc4556e2c2c156f2e76b0d 100755 (executable)
@@ -49,6 +49,7 @@
       <li><a href="automatyczne_odblokownie_istniejacych_partycji_LUKS.html">Automatyczne odblokowanie istniejących partycji LUKS</a></li>
       <li><a href="przekierowanie_konsoli_tty0_na_rs-232_port_COM.html">Przekierowanie konsoli tty0 na RS-232 (port COM)</a></li>
       <li><a href="zdalne_odblokowanie_cryptroot_przez_SSH.html">Zdalne odblokowanie cryptroot przez SSH</a></li>
+      <li><a href="wykorzystanie_modulu_TPM_do_odblokowania_cryptroot.html">Wykorzystanie modułu TPM do odblokowania cryptroot</a></li>
                </ul>
        </div>
 
diff --git a/articles/linux/wykorzystanie_modulu_TPM_do_odblokowania_cryptroot.html b/articles/linux/wykorzystanie_modulu_TPM_do_odblokowania_cryptroot.html
new file mode 100644 (file)
index 0000000..18db81a
--- /dev/null
@@ -0,0 +1,183 @@
+<!DOCTYPE html>
+<html>
+       <head>
+               <meta charset="utf-8" />
+               <link rel="icon" type="image/png" href="https://i.ibb.co/khy45hh/mm.png">
+               <link rel="stylesheet" type="text/css" href="/style.css">
+       </head>
+       <body>
+<pre>
+  _____ _   _ _    _    ___      _
+ / ____| \ | | |  | |  / / |    (_)
+| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
+| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
+| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
+ \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\
+</pre>
+       <p class="header_link">
+               &#9760;&nbsp;<a href="https://morketsmerke.github.io">morketsmerke</a>&nbsp;&#9760;
+       </p>
+       <div class="main">
+               <h1 class="title">Wykorzystanie modułu TPM 1.2 do odblokowania cryptroot</h1>
+    <p>
+      Myślałem, że na zdalnym odblokowywaniu cryptroot seria się skończy, ale
+      rodziła się potrzeba stworzenia laptopa do zdalnej pomocy, przyczym
+      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 pomocnik 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.
+    </p>
+    <p>
+      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:
+    </p>
+<pre class="code-block">
+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)
+</pre>
+    <p>
+      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).
+    </p>
+    <p>
+      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 
+      <strong>clevis</strong> - modularny <em>framework</em> do automatyzacji
+      szyfrowania. Oficjalna wersja nie wspiera modułów TPM poniżej 2.0, więc
+      jeden z hakerów, wykonał <em>fork</em> (własną wersję, czyjegoś
+      projektu) <em>clevisa</em> dodając do niego obsługę modułów TPM &lt;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ć.
+    </p>
+<pre class="code-block">
+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
+</pre>
+    <p>
+      Po zainstalowaniu oprogramowania, może zainicjować moduł TPM. Za pomocą
+      odpowiedniego polecenia. Polecenie zarząda od nas ustawienia sobie
+      hasła właściciela:
+    </p>
+<pre class="code-block">
+xf0r3m@romek:~$ sudo tpm_takeownership -z
+Enter owner password: 
+Confirm password: 
+</pre>
+    <p>
+      Polecenie po ustawieniu hasła nie powinno zwrócić żadnych dodatkowych
+      komunikatów. Opcja <code class="code-inline">-z</code> ustawi hasło
+      SRK (<em>Secret Root Key</em>) na 20B samych zer (0). Dzięki czemu
+      będziemy w stanie automatycznie odblokować zaszyfrowany główny system
+      plików. 
+    </p>
+    <p>
+      Po przejęciu kontroli na modułem TPM, możemy dodać klucz zapisany w TPM
+      do naszej zaszyfrowanej partycji.
+    </p>
+<pre class="code-block">
+xf0r3m@romek:~$ sudo clevis luks bind -d /dev/sdb5 tpm1 '{"pcr_ids":"0,4,7"}'                                                                                                                                                           
+Enter existing LUKS password: 
+</pre>
+    <p>
+      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.
+    </p>
+    <p>
+      Po dodaniu klucz do partycji, należy zaktualizować <em>initrd</em>.
+    </p>
+<pre class="code-block">
+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
+</pre>
+    <p>
+      Aktualizację nalepiej wykonać, dla wszystkich wersji. Stąd opcja
+      <code class="code-inline">-k 'all'</code>.
+    </p>
+    <p>
+      Dla pewności, aby został uruchomiony odpowiedni plik. Aktualizujemy
+      również konfigurację GRUB-a.
+    </p>
+<pre class="code-block">
+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
+</pre>
+    <p>
+      Teraz możemy uruchomić ponownie komputer. Kiedy przyjdzie do odblokowania
+      dysku. Program poprosi nas o hasło, ale po chwili powinien pojawić się
+      komunikat, że dysk został odblokowany przez <em>clevis</em>.
+    </p>
+<pre class="code-block">
+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:
+</pre>
+    <p>
+      Jeśli przed dodaniem klucza do partycji, chcemy sprawdzić czy nasz TPM
+      działa poprawnie. Możemy wykonać prosty test.
+    </p>
+<pre class="code-block">
+xf0r3m@romek:~$ echo test | clevis encrypt tpm1 '{"pcr_ids":"0,4,7"}' | clevis decrypt
+test
+</pre>
+    <p>
+      Ten test powinien zwrócić na wyjściu to samo co dostał na wejściu.
+    </p>
+    <p>
+      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.
+    </p>
+  </div>
+  <p class="footer">
+         2024; COPYLEFT; ALL RIGHTS REVERSED;
+  </p>
+</body>
+</html>