Kryptografia, Trusted Platform Module i Ubuntu
2009-06-12, Piątek 18:50:39 +0200, autor Karol „Zal” Zalewski, licencja LPRCTKC
Wstęp
Wszyscy już chyba słyszeli o cyfrowym podpisie, inteligentnych kartach do jego przechowywania i tym, jak duże korzyści niesie ze sobą wykorzystanie tego rozwiązania. Ja sam jestem zwolennikiem kryptografii, korzystam z możliwości OpenPGP, czy też LUKS/TrueCrypt i nie wyobrażam sobie pracy na komputerze osobistym, na którym dane nie są zaszyfrowane przynajmniej przy pomocy algorytmu AES. Zatem nic dziwnego, iż zainteresowałem się technologią o nazwie Trusted Computing. Co się na nią składa? 5 elementów:
- unikatowy klucz RSA - klucz, którego część prywatna tworzona jest np. podczas produkcji chipa w którym ma się znajdować, służy do szyfrowania szczególnie ważnych danych, a jego bezpośredni odczyt z nośnika fizycznego ma być w teorii niemożliwy,
- zaufana ścieżka - rozwiązanie polegające na zabezpieczeniu wejścia/wyjścia tak, aby niemożliwym było podsłuchanie, czy też niezauważalna modyfikacja danych płynących między zaufanymi systemami,
- silna ochrona pamięci - szczególnie ważne rejony pamięci (np. zawierające klucz prywatny) są oddzielone od reszty systemu i można na nich wykonywać jedynie ograniczony rodzaj operacji,
- zapieczętowany magazyn - część przeznaczona dla DRM, którego nie lubię, a umożliwiająca odczyt danych tylko na danym komputerze oraz przy użyciu wybranego oprogramowania,
- zdalne poświadczenie - część również stworzona z myślą o DRM, a umożliwiająca sprawdzenie, czy dana aplikacja nie została zmodyfikowana przez użytkownika.
Kontrowersyjne rozwiązanie, prawda? Cenzura, kontrola, DRM itp. Jednak samo w sobie nie jest złe. Dopiero nieprawidłowe jego użycie może zagrozić szeroko pojętej wolności. TC obecnie nie jest wykorzystywane zbyt często, dlatego postaram się o to, aby przedstawić Wam opis tego, jak można wykorzystać tę technologię, złożoną z oprogramowania i sprzętu, pod Linuksem.
Używany przeze mnie laptop Lenovo Thinkpad R61i (stary Thinkpad T40 również) posiada system o nazwie TPM w wersji 1.2 produkcji firmy Atmel. Do jego zadań należy m.in. generowanie liczb pseudolosowych, generowanie kluczy RSA, generowanie skrótów, czy też szyfrowanie danych. Podobne chipy są montowane obecnie w większości współczesnych notebooków. Poniżej znajduje się opis tego, jak zrobić z niego użytek korzystając z Ubuntu 9.04. Dla dociekliwych - poniżej znajduje się wynik działania polecenia uname -a wykonanego na moim systemie.
Linux karol 2.6.28-13-generic #44-Ubuntu SMP Tue Jun 2 07:57:31 UTC 2009 i686 GNU/Linux
Instalacja i uruchomienie narzędzi
Korzystając z Ubuntu, przed podjęciem jakichkolwiek działań, należy załadować odpowiednie moduły jądra korzystając z poniższych poleceń:
sudo modprobe tpm_bios sudo modprobe tpm sudo modprobe tpm_tis
Wybór ostatniego z trzech modułów zależy od tego, jaki chip TPM posiadamy. W przypadku modułów zgodnych z najnowszą wersją standardu TPM, czyli 1.2, należy wykorzystać tpm_tis. Inne moduły to tpm_atmel oraz tpm_infineon. Przed przejściem do kolejnego kroku należy sprawdzić, czy nasze działania zakończyły się sukcesem. Wystarczy wykonać poniższe polecenie i określić, czy ostatnia linijka zawiera informacje podobne do poniższych.
zal@karol:~$ dmesg | tail -n 1 [ 1763.187398] tpm_tis 00:0a: 1.2 TPM (device-id 0x3203, rev-id 9)
Jeżeli wszystko się powiodło, możemy zlecić ładowanie modułów przy starcie systemu, a następnie przystąpić do instalacji narzędzi, które pozwolą nam na zarządzanie chipem TPM. Mowa o pakiecie tpm-tools oraz TrouSerS. Aby osiągnąć pierwszy cel należy dodać wspomniane nazwy pakietów, jako root (np. używając sudo emacs), do pliku /etc/modules. Następnie należy zainstalować wymagane pakiety korzystając z poniższego polecenia.
sudo aptitude install tpm-tools trousers
Przy okazji zostaną zainstalowane pakiety związane z openCryptoki. Kolejnym krokiem jest sprawdzenie, czy uda się nam uruchomić demona tcsd odpowiedzialnego za komunikację z chipem TPM. Najłatwiej jest to uczynić korzystając z poniższego polecenia.
sudo tcsd -f
Po uruchomieniu demon powinien oczekiwać na nasze działania. W przypadku niepowodzenia warto ponownie uruchomić system operacyjny. Nie wiem, czym jest to spowodowane, ale w moim przypadku okazało się to być dobrym rozwiązaniem. Od tej chwili demon będzie uruchamiany wraz ze startem systemu operacyjnego - skrypt startowy znajduje się w lokalizacji /etc/init.d/trousers. Możemy teraz sprawdzić, czy narzędzia z pakietu tpm_tools poprawnie obsługują security chip. Poniżej znajduje się przykładowe polecenie oraz jego wyjście umożliwiające stwierdzenie, czy całość działa poprawnie.
zal@karol:~$ tpm_version TPM 1.2 Version Info: Chip Version: 1.2.13.9 Spec Level: 2 Errata Revision: 1 TPM Vendor ID: ATML TPM Version: 01010000 Manufacturer Info: 41544d4c
TPM i tpm_tools
Przed przystąpieniem do korzystania z czipa kryptograficznego, należy wcześniej określić dwa hasła, które będą niezbędne do zarządzania układem. Pierwsze z nich należy ustawić wedle uznania, zaś drugie z nich (SRK) powinno być puste (naciskamy ENTER). Szerszy opis m.in. EK i SRK można znaleźć w anglojęzycznym artykule na LinuxJournal.com.
zal@karol:~$ tpm_takeownership [sudo] password for zal: Enter owner password: Confirm password: Enter SRK password: Confirm password:
Powyższe polecenie można wykonać tylko jeden raz! Kolejna możliwość istnieje dopiero po usunięciu zawartości całego chipa (oprócz EK) z poziomu BIOS-u. Co ciekawe, opcja usunięcia zawartości TPM w BIOS-ie jest ukryta ze względów bezpieczeństwa. W przypadku Thinkpada R61i, aby dostać się do wspomnianej opcji należy wyłączyć laptopa. Po ponownym uruchomieniu komputera i wejściu do panelu konfiguracyjnego BIOS-u, w menu przeznaczonym do obsługi "Security chip" powinna pojawić się nowa opcja. Tylko takie działanie jest w stanie zapewnić wysokie prawdopodobieństwo tego, iż istnieje fizyczna obecność użytkownika przy komputerze i tylko ono umożliwi skorzystanie z ww. opcji. Należy pamiętać, iż nie jest ona dostępna w przypadku wykonania miękkiego restartu. Rozwiązanie to gwarantuje również to, iż znajdujący się w chipie klucz prywatny nie zostanie przypadkiem skasowany.
Poniżej natomiast przedstawione zostało polecenie umożliwiające wyciągnięcie z TPM publicznej części tzw. Endorsement Key. Jest to unikatowy klucz stworzony i zapisany w kryptochipie jeszcze w fazie produkcji, a jego część prywatna. Prywatna część znajduje się tylko w tym jednym scalaku i niemożliwe jest wyjęcie jej z niego. Przynajmniej w praktyce, ponieważ w teorii wydobycie zawartości TPM jest możliwe, ale niemożliwe bez wykorzystania wysokich nakładów finansowych.
zal@karol:~$ tpm_getpubek
[sudo] password for zal:
Tspi_TPM_GetPubEndorsementKey failed: 0x00000008 - layer=tpm, code=0008 (8),
The TPM target command has been disabled
Enter owner password:
Public Endorsement Key:
Version: 01010000
Usage: 0x0002 (Unknown)
Flags: 0x00000000 (!VOLATILE, !MIGRATABLE, !REDIRECTION)
AuthUsage: 0x00 (Never)
Algorithm: 0x00000020 (Unknown)
Encryption Scheme: 0x00000010 (Unknown)
Signature Scheme: 0x00000010 (Unknown)
Public Key:
d173d212 7a71c424 3af85403 55ca3291 c8bbd1e4 4075215d d4adec43 a53b389e
7e28529f 630f4a94 53385bae fbe469e2 7b398485 3798d08a 66e3c5d6 fe134326
2044e309 0c2ba06a 9a791fe3 de54e693 b4e96707 d4359aa1 b91789e5 a71a49f0
...
To właściwie jedyne aplikacje z zakresu tpm_*, które nam się obecnie przydadzą. Wszystkie z nich posiadają naprawdę niezłe manuale (np. man tpm_clear), dlatego też nie trzeba ich szerzej omawiać. Przejdźmy teraz do komend, z których będziemy korzystać na co dzień. Mowa o tpmtoken_*. Nim jednak z nich skorzystamy będziemy musieli wykonać jeszcze jedną operację. Obecnie próba wywołania np. tpmtoken_init zakończy się najprawdopodobniej poniższym komunikatem.
zal@karol:~$ tpmtoken_init --token "IBM PKCS#11 TPM Token" C_Initialize failed: 0x00000002 (2)
Aby sobie z tym poradzić należy dodać nas samych, w moim przypadku jest to użytkownik zal, do grupy pkcs11 stosując poniższą komendę.
sudo usermod -a -G pkcs11 zal
Po restarcie komputera, lub ponownym uruchomieniu usług /etc/init.d/trousers oraz /etc/init.d/opencryptoki, możemy skorzystać z polecenia tpmtoken_init --token "IBM PKCS#11 TPM Token" do stworzenia własnego pojemnika z kluczami. Przy pierwszym pytaniu o hasło należy podać standardowe osiem cyfr - 87654321 - tak, jak to widać poniżej.
zal@karol:~$ tpmtoken_init --token "IBM PKCS#11 TPM Token" Warning: The TPM token has already been initialized. Reinitializing the TPM token will cause all TPM token data to be lost. Clear the TPM token data? [y/N]: y Enter the TPM security officer password: 87654321 A new TPM security officer password is needed. The password must be between 6 and 127 characters in length. Enter new password: Confirm password: A new TPM user password is needed. The password must be between 6 and 127 characters in length. Enter new password: Confirm password:
Gotowe! Najtrudniejsza część jest już za nami. Teraz możemy wykorzystać TPM do zabezpieczenia posiadanych przez nas certyfikatów. Oto, jak wprowadzić do systemu certyfikaty X.509, wraz z kluczem prywatnym RSA, zapisane w popularnym formacie PKCS#12. Należy wcześniej dokonać konwersji do formatu PEM.
openssl pkcs12 -in cert.p12 -out cert.pem tpmtoken_import -k "IBM PKCS#11 TPM Token" -n "Nazwa certyfikatu" ./cert.pem
A teraz sprawdźmy, czy wszystko znajduje się tam, gdzie trzeba.
zal@karol:/var/lib/opencryptoki/tpm/zal$ tpmtoken_objects Enter your TPM user password: Secret Key: Type: 31, Label: 'User Data Protection Key' Private Key: Type: 0, Label: 'CAcert.org' Public Key: Type: 0, Label: 'CAcert.org' Certificate: Type: X509 Public Key, Label: 'CAcert.org'
Należy jednak uważać, gdyż wszystkie obiekty, które dodajemy przy pomocy polecenia tpmtoken_import zostają zapisane w postaci zaszyfrowanej na naszym dysku w folderze /var/lib/opencryptoki/tpm/ np.:
zal@karol:/var/lib/opencryptoki/tpm/zal$ ls MK_PRIVATE NVTOK.DAT PRIVATE_ROOT_KEY.pem PUBLIC_ROOT_KEY.pem TOK_OBJ
Dzieje się tak, ponieważ dane i tak zostały zaszyfrowane z wykorzystaniem kluczy znajdujących się w chipie TPM. Ich odszyfrowanie możliwe jest jedynie przy jego wykorzystaniu (chip nie pozwala na skopiowanie klucza prywatnego). Przechowywanie danych na dysku jest zatem stosunkowo bezpieczne.
TPM możemy również wykorzystać do szyfrowania i deszyfrowania danych. W tym celu należy skorzystać z poniższych komend.
tpmtoken_protect -e -i public -o encrypted -k "IBM PKCS#11 TPM Token" tpmtoken_protect -d -i encrypted -o public -k "IBM PKCS#11 TPM Token"
Przy pierwszym uruchomieniu komendy szyfrującej do naszego zbioru kluczy i certyfikatów zostanie dodany klucz służący właśnie do tej czynności.
TPM i Firefox/Thunderbird
Wykorzystanie TPM-a pod Windowsem w Firefoksie i Thunderbirdzie nie stanowi ponoć problemu. Wystarczy skorzystać z opisu znajdującego się w serwisie IPsec.pl (dla modułu Infineona):
- Narzędzia -> Opcje -> Prywatność -> Zabezpieczenia -> Urządzenia,
- Klikamy Załaduj, pojawi się prompt do wybrania ścieżki nowego sterownika PKCS#11,
- Wpisujemy w Nazwa pliku modułu "\WINDOWS\SYSTEM32\FXTPMCK.DLL", a w Nazwa modułu np. "Infineon TPM", wciskamy OK.
Pod Linuksem sytuacja wygląda nieco inaczej. Po zainstalowaniu aplikacji pokroju tpm_tools oraz skonfigurowaniu TPM należałoby postąpić według powyższej instrukcji stosując poniższą bibliotekę.
/usr/lib/pkcs11/PKCS11_API.so
Niestety, w moim przypadku wykorzystanie owej biblioteki kończyło się nagłym zakończeniem pracy zarówno Thunderbirda, jak i Firefoksa. W teorii powinno to działać z tego względu, iż wspominana biblioteka udostępnia API PKCS#11 wymagane przez ww. programy, a umożliwiające dostęp do chipu TPM. W praktyce nie wszystko działa tak, jakby się tego oczekiwało.
Na zakończenie
Mam nadzieję, iż powyższy wpis będzie stanowić dobry wstęp do rozpoczęcia zabawy z chipem TPM. Starałem się tutaj poruszyć jedynie podstawową tematykę umożliwiając w miarę bezbolesne zapoznanie się z narzędziami do jego obsługi.
Sam wpis został oparty m.in. o anglojęzyczny tekst znajdujący się w serwisie GrouNation. Proszę jednak zauważyć, iż wspomniany tekst pomija sporo szczegółów, których brak naraża użytkownika na stratę sporej ilości czasu.
Więcej informacji o samym TCPA można znaleźć na wspomnianej już wcześniej stronie LinuxJournal.com.
2009-06-12 o Piątek 20:16:29 +0200
Muszę się przelogować i sprawdzić, co z powyższego zadziała na moim IdeaPad Y530 z Ubuntu.
2009-06-12 o Piątek 20:21:19 +0200
Jednak trzeba przyznać że JEST z tym trochę roboty, ale tekst fajny, aż zachęciłeś mnie do eksperymentów.
2009-06-12 o Piątek 20:51:26 +0200
@Grzegorz: Koniecznie daj znać, czy cokolwiek z tego wyszło. Niestety, ale w obsłudze TPM-ów są duże rozbieżności i to już nawet nie kwestia samych modułów jądra jest. Bazowałem na kilku stronach internetowych, ale na każdej z nich opisywano inny sprzęt - różne Delle i Thinkpady. W końcu sam eksperymentowałem, czytałem dokumentację do tych projektów i po listach mailingowych buszowałem. Aż w końcu się udało :D
Z drugiej strony - mam wrażenie, że zbyt dużo roboty, jak na tak mizerny efekt. Gdyby tak jeszcze tę bibliotekę udostępniającą API PKCS#11 udało się podpiąć pod Thunderbirda/Firefoksa to może...
@dmichael: Dzięki! Jeżeli zabierzesz się za to - daj znać jakie będą tego rezultaty. Mam nadzieję, że się uda. A co do roboty - tak, jak napisałem wyżej, za dużo ;]
PS. Warto rozpocząć zapoznawanie z TPM-em od artykułu na LinuxJournal.com - sporo wyjaśnia w kwestii tego, co TPM może, czego nie może i do czego się przydaje. Od razu inaczej spogląda się na EK, czy też SRK i kwestię szyfrowania własnych certyfikatów.
2009-06-13 o Sobota 14:46:37 +0200
Gdzieś czytałem że te chipy TPM wcale najszybsze nie są. Działa to wystarczająco sprawnie?
2009-06-13 o Sobota 15:28:27 +0200
@Liorithiel: Działa sprawnie, ponieważ spełnia dwa zadania:
A] jest bezpieczny,
B] w przypadku szyfrowania danych służy jedynie do deszyfrowania klucza (coś ala klucz sesyjny) do danych - całą resztę (tj. deszyfrowanie/szyfrowanie danych) realizuje już CPU ze wsparciem od strony oprogramowania.
Chip sam w sobie nigdy nie zajmuje się szyfrowaniem większej ilości danych. Właściwie to same algorytmy kryptografii asymetrycznej nie zostały do tego stworzone :]
2009-06-14 o Niedziela 08:31:55 +0200
Ciekawy artykuł. Proponuję jednak dopisać do niego drugą część poświęconą exportowi kluczy, recovery i czynnościom niezbędnym do wyłaczenia funkcji. Może się przydać np. w przypadku upgrade biosu:)
Co do szyfrowania katalogów z pocztą (część ostatnia) to odchodzi się od metody którą przytoczyłeś na korzyść szyfrowania całej partycji: BitLocker/Truecrypt. Powdem jest to, że ludzie swoje prywatne/poufne dane mają nie tylko w poczcie:)
@Liorithiel: BitLocker (implementacja Microsoft) działa dość szybko. Spadek prędkości odczytu/zapisu zaszyfrowanej partycji to jakieś 5-7%. Tu należy się spodziewać tego samego.
2009-06-14 o Niedziela 09:19:24 +0200
@Karol: Dzięki! Przyznam szczerze, że nigdy jeszcze z BitLockera nie korzystałem - stosowałem natomiast TrueCrypt. Też bardzo przyjemne rozwiązanie i przy szybkim procesorze ma niewielki narzut na operacje I/O związane z dyskiem. Szczególnie przy AES-ie, który wręcz jest stworzony do tego, aby być wydajnym i stosunkowo prostym pod względem złożoności obliczeniowej.
Co do samej poczty to chodziło raczej nie o szyfrowanie poczty, a stworzenie szyfrowanego kontenera dla przechowywania w nim certyfikatów do podpisu/szyfrowania korespondencji. Przy czym taki kontener miałby tylko taką zaletę nad wygenerowanymi przez software, iż byłby zupełnie bezużyteczny na każdym innym komputerze. W teorii trudniejszy do złamania, a w praktyce również bardziej niebezpieczny (a niech się sprzęt popsuje) ;]
A nawiązując do exportu i odzyskiwania danych w ten sposób zaszyfrowanych - masz rację. To chyba równie ważna część. Postaram się coś na ten temat skrobnąć i dodać do niniejszego wpisu.