Správa šifrovaných oddílů v Linuxu

2. 6. 2008
Doba čtení: 5 minut

Sdílet

V závěrečném dílu seriálu o šifrování disků si probereme správu šifrovaných oddílů, správu klíčů, vytváření šifrovaných kontejnerů a možnosti přístupu k LUKS kontejnerům z MS Windows. Ukážeme si, jak zazálohovat LUKS hlavičku, jak šifrované oddíly zprovoznit při bootu a jak zašifrovat celý systém.

Správa klíčů

Jak už jsem naznačil, je možné použít až osm klíčů, přičemž každý je schopen dešifrovat oddíl. Pokud znáte kterýkoliv klíč, jste schopni jak oddíl dešifrovat, tak přidávat (a mazat) další klíče.

Jak se klíče přidávají a mažou? To si ukážeme. Nejprve přidáme nový klíč:

$ cryptsetup luksAddKey /dev/sdq5

Pokud zpozorníte u výpisů cryptsetupu, všimnete si zprávy „ key slot 0 unlocked.“. Tato zpráva vám říká, kterým klíčem jste si odemkli. V tomto případě prvním (resp. nultým) klíčem. Pokud jste přidali druhý klíč, následujícím příkazem ho odstraníte (čísluje se od 0):

$ cryptsetup luksDelKey /dev/sdq5 1

Funkce luksDelKey je v novějších implementacích cryptsetup-luks považována za zastaralou a je nahrazena funkcí luksKillSlot. V novějších verzích také přibyla funkce luksRemoveKey, s pomocí které můžete odebrat konkrétní klíč (aniž byste museli vědět, ve kterém „slotu“ se nachází:

$ cryptsetup luksRemoveKey /dev/sdq5

Záloha hlavičky

Jelikož jsou LUKS disky/oddíly šifrovány náhodným heslem, které je pak zašifrováno uživatelskými klíči, je jasné, že pokud dojde k přepisu LUKS hlavičky, kde jsou příslušné klíče uloženy, dojde ke ztrátě všech dat na šifrovaném disku/oddílu, neboť již nebudeme schopni disk/oddíl dešifrovat. Pokud se vám toto stalo, není již žádná možnost, jak data získat zpět. Naštěstí tomu lze zabránit, pokud hlavičku zálohujeme (jiná možnost je HW/SW řešení v podobě RAIDu 1).

Nejprve si necháme vypsat informace z LUKS hlavičky oddílu:

$ cryptsetup luksDump /dev/sdq5

Ve výpisu si všimněte čísla označeného jako „Payload offset:“. Toto číslo pak zadejte jako parametr count= pro dd:

$ dd if=/dev/sdq5 of=luks_header.sdq5 count=cislo

Pokud se vám něco nezdá (chybí parametr bs), tak to je v pořádku, velikost bloku je shodná s výchozí hodnotou pro dd. LUKS hlavička má skutečně velikost kolem 1 - 2 MB.

Příslušné zálohy bývá vhodné skladovat na bezpečném místě, nejlépe šifrované. Pokud totiž časem zjistíte, že některý z klíčů byl zkompromitován, zůstane jím v zálohované hlavičce zašifrovaný hlavní klíč.

Vytváření šifrovaných kontejnerů

Mít zašifrované souborové systémy v kontejnerech není pro Linux, LUKS a modul loop problém. Nejprve vytvoříme kontejner, např. takto (příkaz vytvoří soubor s náhodnými daty o velikosti 1 GB):

$ dd if=/dev/urandom of=kontejner bs=1M count=1024

Následně se ujistíme, že je zaveden modul loop:

$ modprobe loop

Nyní přiřadíme kontejner k blokovému zařízení loop0:

$ losetup /dev/loop0 kontejner

Pak už pokračujeme úplně stejně jako při vytváření šifrovaného disku/oddílu, jen se zařízením  /dev/loop0.

Přístup k šifrovaným kontejnerům z Windows

Pro ty z nás, kteří potřebují přenášet data z Linuxu na Windows ze šifrovaných LUKS kontejnerů (či jiných zařízení), mám dobrou a špatnou zprávu. Dobrá je, že to není úplně nemožné. Existuje program FreeOTFE, který umožňuje ve Windows otevřít LUKS kontejner. Špatná zpráva je, že ač sám v nové verzi podporuje LRW a XTS, nezvládne přečíst LUKS kontejnery šifrované pomocí těchto šifrovacích módů. FreeOTFE zvládá nanejvýš LUKS kontejnery šifrované módem CBC-ESSIV.

Použití klíčových souborů (keyfiles)

LUKS zvládá nejenom klíče zadávané interaktivně, ale také klíčové soubory (keyfiles). K vygenerování náhodného keyfile o velikosti 2048 bitů nám poslouží příkaz:

$ dd if=/dev/random of=mykey bs=1 count=256

Tímto příkazem získáme nejkvalitnější náhodná data, ovšem na jejich vygenerování si můžeme chvíli počkat. Keyfile lze přidat do „klíčenky“ LUKS zařízení takto:

$ cryptsetup luksAddKey /dev/sdq5 mykey

LUKS zařízení odemkneme pomocí klíčového souboru následovně:

$ cryptsetup -d mykey luksOpen /dev/sdq5 encrypted

Keyfile můžeme umístit na flashdisk a používat jej jako token. Máme-li více šifrovaných oddílů, můžeme tímto způsobem odemknout všechny naráz, tak, že na první z nich (třeba kořenový oddíl) umístíme klíče pro odemknutí ostatních oddílů.

Klíčové soubory je možné použít u všech operací s LUKS zařízeními. Je možné vytvořit šifrovaný oddíl pomocí keyfile:

$ cryptsetup luksFormat /dev/sdq5 mykey

Stejně tak je možné přidat další klíč pomocí keyfile:

$ cryptsetup -d mykey luksAddKey /dev/sdq5

A je možné přidat další keyfile pomocí keyfile:

$ cryptsetup -d oldkey luksAddKey /dev/sdq5 newkey

Začlenění šifrovaných oddílů do systému

Abychom zajistili, že se šifrované oddíly připojí po spuštění systému (s příslušným dotázáním na heslo), musíme využít příslušné distribuční mechanismy. Pokud neexistují, zbývá už jen úprava startovacích skriptů.

Ve většině distribucí bude možné použít konfigurační soubory /etc/crypttab a /etc/fstab. Syntax souboru crypttab je vhodné zjistit z distribuční dokumentace (různé distribuce mají různou syntax crypttab u. V případě mnou používaného Arch Linuxu by mohl crypttab vypadat třeba takto:

cswap   /dev/sdq5   /dev/urandom          -c aes-xts-plain -s 512
chome   /dev/md10       /etc/keys/home.key    -c aes-cbc-essiv:sha256 -s 256
cdata   /dev/md11       ASK                   -c serpent-xts-benbi -s 512

Jak vidíme, můžeme specifikovat klíčové soubory (keyfiles) nebo nechat systém zeptat se na heslo interaktivně. U swapu necháme klíč vygenerovat náhodně (ze zařízení /dev/urandom). V případě LUKS oddílů by měly postačit pouze první tři sloupce (šifru, šifrovací mód i ostatní údaje si cryptsetup zjistí z LUKS hlavičky).

Konfigurační soubor cryptsetup nám pomůže pouze s vytvořením „mapování“ šifrovaných oddílů na jejich dešifrované ekvivalenty v /dev/mapper. Abychom tedy připojili i souborové systémy na těchto oddílech, musíme upravit ještě /etc/fstab:

/dev/mapper/swap   swap   swap defaults 0 0
/dev/md10          /home  ext3 defaults 0 2
/dev/md11          /home  ext3 defaults 0 2

Tím bychom měli zajistit, že se všechny šifrované oddíly namapují a připojí během startu systému.

Jak na šifrovaný kořenový oddíl

Jak už bylo uvedeno, šifrovat kořenový oddíl lze, s výjimkou zavaděče, obrazu jádra a iniciálního ramdisku. Tyto komponenty je třeba umístit na nešifrovaný izolovaný oddíl ( /boot).

K tomu, abychom mohli zavést systém z šifrovaného kořenového oddílu, potřebujeme iniciální ramdisk s příslušnými moduly (jsou-li třeba) a skriptem, který se nás dotáže na heslo nebo bude schopen najít klíčový soubor (keyfile), hodláme-li použít ten.

bitcoin_skoleni

Mnoho distribucí by dnes nemělo mít s tímto řešením problém, mnou používaný Arch Linux lze snadno nakonfigurovat tak, aby zavedl systém ze šifrovaného kořenového oddílu. Ovšem ani tady neexistuje nějaký standardizovaný způsob konfigurace tohoto řešení, a proto vás musím opět odkázat na distribuční dokumentaci.

Pokud vaše distribuce podporu pro zavádění systému ze šifrovaného oddílu nemá, nezbyde než adekvátně upravit použité moduly a skripty v iniciálním ramdisku.

Zdroje a odkazy

Autor článku