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.
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
- LUKS (projektové stránky)
- LUKS on-disk-format
- Arch Linux Wiki: System Encryption with LUKS for dm-crypt
- Clemens Fruhwirth, Linux hard disk encryption settings
- Wikipedia, Disk encryption
- Wikipedia, Comparison of disk encryption software
- Michal Dočekal, Diskové šifrování