] > Kryptografia, Trusted Platform Module i Ubuntu - Karol „Zal” Zalewski - Blog

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

  1. Narzędzia -> Opcje -> Prywatność -> Zabezpieczenia -> Urządzenia,
  2. Klikamy Załaduj, pojawi się prompt do wybrania ścieżki nowego sterownika PKCS#11,
  3. 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.

Komentarze do wpisu Kryptografia, Trusted Platform Module i Ubuntu
  1. Grzegorz powiedział(a):

    Muszę się przelogować i sprawdzić, co z powyższego zadziała na moim IdeaPad Y530 z Ubuntu.

  2. dmichael powiedział(a):

    Jednak trzeba przyznać że JEST z tym trochę roboty, ale tekst fajny, aż zachęciłeś mnie do eksperymentów.

  3. Zal powiedział(a):

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

  4. Liorithiel powiedział(a):

    Gdzieś czytałem że te chipy TPM wcale najszybsze nie są. Działa to wystarczająco sprawnie?

  5. Zal powiedział(a):

    @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 :]

  6. Karol Stilger powiedział(a):

    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.

  7. Zal powiedział(a):

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

Dodaj komentarz:

Możesz wykorzystać Markdown. Znaczniki HTML nie działają!

Wysyłając komentarz wyrażasz zgodę na jego publikację na zasadach licencji CC BY-NC-SA 3.0. Jeżeli się na to nie zgadzasz - nie komentuj.

Uwaga! Niniejszy serwis przechowuje adres IP osoby pozostawiającej komentarz. Chcesz pozostać anonimowy? Skorzystaj z Tora, lub bezpiecznego proxy. Z mojej strony gorąco polecam Tora w połączeniu z systemem Debian GNU/Linux, przeglądarką Firefox oraz rozszerzeniem Torbutton.

Polecam: Tor Project

Powyższe logo jest zarejestrowanym znakiem handlowym The Tor Project, Inc.

Podgląd komentarza: