Przejście z Truecrypt na LUKS

Spis treści

Jakiś czas temu, można było usłyszeć, że TrueCrypt nie dba wcale o bezpieczeństwo danych zaszyfrowanych za jego pomocą. Audyt bezpieczeństwa jednak nie wykazał większych podatności w tym oprogramowaniu. Analiza binarek dostępnych na stronie TrueCrypt'a pod kątem Reproducible Builds również nie wykazała większych odchyłów w stosunku do binarek generowanych prosto z kodu źródłowego. Problematyczne może być jednak to, że tak naprawdę nie wiadomo kto stoi za tym całym projektem, przynajmniej gdy był jeszcze rozwijany. Cała sytuacja zamknięcia TrueCrypt'a z sieci była też co najmniej dziwna. W obliczu takich niewiadomych, powinniśmy rozważyć przejście na natywne rozwiązania linux'owe, które są jawnie rozwijane, wiadomo kto za nimi stoi i, co najważniejsze, mają wsparcie w samym kernelu.

Problemy wynikające ze stosowania TrueCrypt

TrueCrypt standardowo w obsłudze jest niezbyt wygodny. Co prawda można go dostosować do swoich potrzeb, tak by montować wszystko za pomocą jednego klika ale tracimy w ten sposób kontrolę nad tym co i jak montujemy. Przykładowo, nie można sprecyzować opcji montowania systemu plików zawartego w otwieranych kontenerach.

W przypadku LUKS'a zaś, wszelkie dane potrzebne do poprawnej obsługi systemu plików voluminu są definiowane w /etc/fstab , czyli tam gdzie opcje pozostałych partycji. Mamy także zapewniony support przy sprawdzaniu systemu plików w poszukiwaniu błędów co określoną liczbę montowań i to zaraz na starcie systemu, tuż po otworzeniu kontenerów. Nie trzeba tego robić ręcznie. Dodatkowo, przy korzystaniu z TrueCrypt'a pod linux'em, zakładając, że mamy zaszyfrowany system, trzeba wpisywać minimum dwa hasła, nawet w przypadku gdy są one takie same. Po przejściu z TrueCrypt'a na LUKS, będziemy mogli odszyfrować system przy pomocy tylko jednego hasła. Poza tym, pozbywamy się także zbędnego pakietu, którego zresztą i tak nie ma w repozytoriach debiana.

Użytkownicy windowsa do odczytu kontenerów LUKS mogą użyć FreeOTFE. Niemniej jednak, mając system plików ext4 w kontenerach TrueCrypt'a, nigdy nie udało mi się zmusić windowsa do pracy na tych voluminach. Pomijam już zapis ext4 pod win ale nigdy nie udało mi się odczytać danych z systemu plików ext4 zawartych w takim kontenerze. Oczywiście, zaszyfrowany kontener mający systemem plików ntfs można montować zarówno pod windowsem jak i linux'em.

Kontener LUKS

Wbrew pozorom samo przejście z TrueCrypt na LUKS nie jest znowu takie trudne jak mogłoby się początkowo wydawać. Jeśli jednak zdecydujemy się pozbyć TrueCrypt'a, dane z jego kontenera trzeba uprzednio gdzieś zgrać. A to z tego względu, że trzeba będzie utworzyć na nowo system plików. Gdy już zgramy wszystkie pliki, możemy przystąpić do tworzenia kontenera LUKS:

# cryptsetup --cipher aes-xts-plain64 --key-size 512 --hash sha512 --iter-time 5000 --use-random --verify-passphrase luksFormat /dev/sda8
# cryptsetup luksOpen /dev/sda8 crypt_leon
# mkfs.ext4 -m 0 -L Leon /dev/mapper/crypt_leon
# mount /dev/mapper/crypt_leon /media/Leon/

Po powyższej operacji jesteśmy w stanie wrzucać już pliki do zaszyfrowanej przestrzeni dysku ale to nie jest koniec naszej pracy. Musimy jeszcze nauczyć system jak otwierać i montować taki kontener. W zależności od tego co chcemy osiągnąć, mamy z grubsza dwie opcje do wyboru.

Pierwsza z opcji zakłada, że wszystkie kontenery będą otwierane automatycznie na starcie systemu za pomocą tego samego hasła wpisanego tylko jeden raz. Bez znaczenia jest przy tym liczba zaszyfrowanych dysków. Zaś druga opcja zaś opiera się na rozdzieleniu systemowych voluminów od tych niesystemowych. Przy czym, w tym przypadku także będziemy mieli możliwość automatycznego montowania wszystkich partycji przy starcie systemu, z tą różnicą, że te dodatkowe voluminy będą posiadać inne hasło w stosunku do tych systemowych, czyli trzeba będzie wpisać dwa różne hasła. Naturalnie, będzie można zrezygnować z funkcji automatycznego montowania w każdej chwili przez dopisanie parametru noauto do pliku /etc/crypttab .

Pliki /etc/crypttab oraz /etc/fstab

By móc zamontować automatycznie zaszyfrowane voluminy, trzeba pierw je skonfigurować przez pliki /etc/crypttab oraz /etc/fstab . Nie będę tutaj rozdrabiał się nad opisywaniem zawartości drugiego z tych plików, bo powinniśmy umieć na nim operować w przypadku, gdy zabieramy się za szyfrowanie dysków. Jeśli jednak mamy problemy z ogarnięciem pliku /etc/fstab , to musimy zapoznać się z man fstab(5).

Po edycji pliku /etc/crypttab zawsze trzeba wygenerować nowy initramfs przy pomocy update-initramfs -u -k all . Jeśli tego nie zrobimy, system będzie próbował odszyfrować kontenery w oparciu o informacje, które były zawarte w tym pliku przed edycją.

Tutaj skupimy się głównie na pliku /etc/crypttab , który, w moim przypadku, wygląda mniej więcej tak:

# <target name>    <source device>         <key file>  <options>
sda2_crypt        UUID=727fa348-8804-4773-ae3d-f3e176d12dac   none      luks
crypt_leon        UUID=dc7f4586-a33d-4707-98e9-8b55c559b0d2 sda2_crypt  luks,keyscript=/lib/cryptsetup/scripts/decrypt_derived

Jak widać mamy w nim zdefiniowane dwa kontenery. Pierwszy z nich jest od partycji systemowych (LVM), drugi zaś od nowego voluminum. Składnia pliku /etc/crypttab jest prosta: najpierw podawana jest nazwa pod jaką zostanie otwarty kontener ( crypt_leon ), następnie jest definiowana partycja po UUID. Trzecie pole z kolei definiuje w jaki sposób kontener zostanie otwarty. Może to być hasło albo keyfile. Ostatnie pole to opcje.

W przypadku pierwszego kontenera, na trzeciej pozycji widzimy none . Oznacza to, że trzeba będzie podać hasło na starcie systemu przy jego otwieraniu. Natomiast w przypadku drugiego kontenera, sda2_crypt wskazuje volumin, którego hasło (choć to nie do końca jest to samo hasło) zostanie wykorzystane przy otwieraniu tego zasobu. Czyli, by otworzyć crypt_leon potrzebne jest wpisanie hasła do sda2_crypt. Po jego wpisaniu, crypt_leon zostanie automatycznie odblokowany. Nie jest o jednak takie proste, bo wymagany jest skrypt /lib/cryptsetup/scripts/decrypt_derived , który został dopisany w opcjach drugiego kontenera.

Parametr keyscript i skrypt decrypt_derived

By móc użyć skryptu /lib/cryptsetup/scripts/decrypt_derived do automatycznego montowania, trzeba pierw wygenerować keyfile, którego to zawartość zostanie na stałe dodana do nagłówka kontenera, który ma być otwierany na starcie systemu. Można to zrobić ręcznie albo też posłużyć się w tym celu powyższym skryptem:

# /lib/cryptsetup/scripts/decrypt_derived sda2_crypt > klucz

Plik będzie zawierał reprezentację hexadecymalną klucza binarnego użytego do szyfrowania/deszyfrowania danych na wskazanej partycji. Ten parametr, jak i szereg innych, można wyciągnąć z:

# dmsetup table --showkeys

Ciąg składa się ze 128 znaków i można go ręcznie wpisać do drugiego slota w nagłówku zaszyfrowanej partycji albo też można w tym celu wskazać wygenerowany plik. W każdym razie oba rozwiązania mają dokładnie taki sam cel, czyli utworzenie nowego keyslota ze 128 znakowym hasłem. Dla każdej zaszyfrowanej partycji taki ciąg będzie inny, dlatego też nadaje się on na keyfile, do którego dostęp można uzyskać tylko po podaniu odpowiedniego hasła. Bez hasła, klucz nie zostanie odszyfrowany i nie będzie ciągu, który by można wydobyć z dmsetup. Keyfile do nagłówka drugiego kontenera dodajemy w poniższy sposób:

# cryptsetup luksAddKey /dev/sda8 klucz

Sprawdzamy czy mamy zajęte dwa sloty:

# cryptsetup luksDump /dev/sda8

Jeśli tak, znaczy, że wszystko jest w porządku. Taka mała uwaga jeszcze. Jako, że w nagłówku mamy zajęte dwa sloty, uniezależnia nas to od nagłówka partycji sda2, czyli możemy montować sobie dysk na innych maszynach bez większego problemu. Można oczywiście skasować pierwszy slot z rzeczywistym hasłem ale wtedy jeśli coś się stanie z nagłówkiem partycji systemowej, dane na sda8 zostaną bezpowrotnie utracone.

Cała ta zabawa z tym skryptem decrypt_derived przypomina mi trochę odszyfrowanie dysku przy pomocy binarnego keyfile, który jest fizycznie zlokalizowany na innym zaszyfrowanym dysku, np w katalogu /root/ . Wtedy po odszyfrowaniu systemu uzyskuje się dostęp do keyfile i można zamontować kontener przy jego pomocy. Można sprecyzować ścieżkę do binarnego keyfile w /etc/crypttab i na dobrą sprawę nie ma większej różnicy między jednym i drugim rozwiązaniem. No chyba, że się nada złe prawa do pliku, wtedy będzie można odczytać keyfile na działającej maszynie, zaś dostęp do tabeli z kluczami w dmsetup wymaga uprawnień administratora systemu.

Test kontenera LUKS

Nie musimy restartować maszyny by sprawdzić czy powyższe kroki zostały przeprowadzone prawidłowo. Możemy zwyczajnie wpisać w terminalu to poniższe polecenie:

# /lib/cryptsetup/scripts/decrypt_derived sda2_crypt | cryptsetup luksOpen /dev/sda8 crypt_leon

Zakładając, że pliki /etc/crypttab oraz /etc/fstab mają odpowiednie linijki oraz, że w wyniku powyższego polecania kontener został otworzony, można być pewnym, że zostanie on otworzony również przy starcie systemu.

Problematyczna identyfikacja kontenerów

Trzeba także odróżnić od siebie dwa numery UUID. Odszyfrowany kontener widoczny jest w systemie w poniższy sposób:

# lsblk -o name,size,type,mountpoint,uuid
NAME                             SIZE TYPE  MOUNTPOINT    UUID
...
└─sda8                         100.6G part                dc7f4586-a33d-4707-98e9-8b55c559b0d2
  └─crypt_leon (dm-5)          100.6G crypt /media/Leon   5e3242e1-ec7a-4806-92f7-88a126feea94

Jak można zauważyć sda8 oraz crypt_leon mają dwa różne UUID. Którego zatem mamy użyć w przypadku pisania regułek w plikach /etc/fstab oraz /etc/crypttab ? UUID od crypt_leon trzeba wpisać do /etc/fstab . Natomiast w /etc/crypttab trzeba podać UUID partycji sda8 . Jeśli te dwa numerki zamienimy w w/w plikach, system nie będzie w stanie odszyfrować kontenera i zamontować jego systemu plików.

Backup nagłów kontenera LUKS

Dobrze jest też zrobić sobie backup nagłówków zaszyfrowanych partycji i trzymać te pliki w bezpiecznym miejscu. Backup robimy w poniższy sposób:

# cryptsetup luksHeaderBackup /dev/sda8 --header-backup-file sda8_header_backup
Mikhail Morfikov avatar
Mikhail Morfikov
Po ponad 10 latach spędzonych z różnej maści linux'ami (Debian/Ubuntu, OpenWRT, Android) mogę śmiało powiedzieć, że nie ma rzeczy niemożliwych i problemów, których nie da się rozwiązać. Jedną umiejętność, którą ludzki umysł musi posiąść, by wybrnąć nawet z tej najbardziej nieprzyjemniej sytuacji, to zdolność logicznego rozumowania.