Jak vytvořit šifrovaný oddíl v Linuxu

Michal Dočekal 26. 5. 2008

V tomto díle našeho seriálu o šifrování disků si ukážeme, jak připravit disk či oddíl k zašifrování zaplněním náhodnými daty a jak jej následně zašifrovat pomocí dm-crypt/LUKS. Probereme si, jaká nastavení šifry a šifrovacího módu jsou na daných jádrech nejvhodnější k zajištění maximální bezpečnosti.

Můžeme šifrovat diskový oddíl nebo celý pevný disk, můžeme šifrování postavit i na RAID poli (v tom případě zvolíme jako zařízení /dev/md*). Stejně tak můžeme nad šifrovanými oddíly vytvářet logické oddíly pomocí LVM. Pro příklady budu používat oddíl  /dev/sdq5.

Jak šifrování pomocí dm-crypt/LUKS funguje? Jednoduše řečeno, vezmeme nějaké blokové zařízení (třeba /dev/sdq5), pomocí utility cryptsetup nastavíme jeho mapování a v adresáři /dev/mapper nám pak vznikne zařízení, se kterým můžeme pracovat jako s nešifrovaným blokovým zařízením, tj. můžeme na něm vytvořit souborový systém, ukládat na něj a číst z něj data. Všechny operace pak zpracuje několik subsystémů jádra (device mapper, dm-crypt, CryptoAPI, atd.) a na původním zařízení se uloží všechna data zašifrovaná.

Příprava na šifrování

Ještě před vlastním vytvořením šifrovaného disku/oddílu je vhodné provést kontrolu špatných sektorů a přepsat celý disk/oddíl náhodnými daty. Obojího můžeme docílit následujícím příkazem:

# badblocks -c 10240 -s -w -t random -v /dev/sdq5

Naneštěstí generátor (pseudo)náhodných čísel programu badblocks není příliš kvalitní. Nejlepším generátorem náhodných čísel je zařízení /dev/random, avšak pro diskové šifrování v řádu GB (či TB) dat se nehodí – vygenerování byť jen 1GB náhodných bytů pomocí tohoto generátoru by bylo otázkou let.

Pro tyto účely je tedy vhodnější /dev/urandom. To je pravděpodobně jeden z nejlepších generátorů (pseudo)náhodných čísel, který můžeme pro tuto operaci použít. Stále tu však zůstává nevýhoda v podobě relativně vyšší časové náročnosti. Na svém jednojádrovém Athlonu 3200+ taktovaném na 2,0GHz jsem schopen vygenerovat přibližně 4,3MB náhodných dat za vteřinu. Zaplnění disku/oddílu i velikosti 100GB pak v ideálních podmínkách potrvá skoro 7 hodin (s plně vytíženým procesorem). Pro zaplnění disku/oddílu náhodnými daty tímto způsobem můžeme použít následující příkaz:

# dd if=/dev/urandom of=/dev/sdq5

Podstatně rychlejší alternativu k tomuto postupu může představovat vytvoření zašifrovaného oddílu pomocí dm-crypt/LUKS a jeho přepis zařízením /dev/zero (popřípadě užitím badblocks – viz výše). Nejsem kryptolog, abych byl schopen říci, nakolik je tato metoda horší než použití /dev/urandom, ale dle mého názoru by neměla být horší o moc. Zejména, pokud na příslušném zařízení po provedení této operace provedeme opět luksFormat, čímž pro vlastní šifrovaná data budeme používat úplně jiný hlavní klíč. Zaplnění oddílu náhodnými daty tímto způsobem by pak vypadalo takto (jednotlivé kroky si vysvětlíme dále):

# modprobe dm-crypt aes-i586 sha256 lrw xts
# cryptsetup -c aes-xts-plain -s 512 -y luksFormat /dev/sdq5
# cryptsetup luksOpen /dev/sdq5 eraseme
# badblocks -c 10240 -s -w -t random -v /dev/mapper/eraseme
# cryptsetup luksClose /dev/sdq5

Vytvoření šifrovaného oddílu

Po této operaci nám zbývá to nejdůležitější – vytvoření vlastního šifrovaného oddílu. Před tím je vhodné se ujistit, že jsou všechny potřebné moduly zavedeny:

modprobe dm-crypt aes-i586 sha256 lrw xts

Optimální parametry pro šifrovaný oddíl (šifrovací mód xts) představuje následující příkaz:

# cryptsetup -c aes-xts-plain -s 512 -y luksFormat /dev/sdq5

Pokud ve své distribuci nemáte jádro 2.6.24 nebo vyšší, nezbývá než použít šifrovací mód LRW:

# cryptsetup -c aes-lrw-benbi -s 384 -y luksFormat /dev/sdq5

Na jádrech starších než 2.6.20 nám nezbyde než použít mód CBC. V tom případě raději použijeme CBC-ESSIV, který je o něco bezpečnější a není tak zranitelný jako cbc-plain:

# cryptsetup -c aes-cbc-essiv:sha256 -s 256 -y luksFormat /dev/sdq5

Parametr -c nám umožňuje specifikovat šifru (aes, serpent, twofish, cast6, apod.), šifrovací mód (cbc, lrw, xts) a způsob generování inicializačního vektoru (plain, essiv:hash, benbi). Parametr -s ovlivňuje velikost klíče. V případě LRW je třeba k velikosti klíče pro šifru připočítat 128, v případě XTS je třeba připočítat 256. Je to proto, že tyto šifrovací módy využívají dva klíče, jeden pro šifru, druhý je pak svázán s pozicí bloku na zařízení.

Pokud jste si přečetli manuálovou stránku programu cryptsetup, narazili jste na parametr -h, který umožňuje specifikovat hash pro klíč. Tato volba ovšem není dostupná pro LUKS (a jeho luksFormat), pouze pro dm-crypt (a jeho create). Jak už jsem naznačil dříve, v rámci LUKS se používá pro odvození klíče metoda PBKDF2, která je v současné implementaci LUKS svázána s hashovací funkcí SHA1. Jinou hashovací funkci pro odvození LUKS klíče zvolit momentálně nejde.

Po provedení této operace šifrovaný oddíl zprovozníme pomocí následujícího příkazu:

# cryptsetup luksOpen /dev/sdq5 encrypted

Pokud zadáme správně heslo, měli bychom nyní být schopni přistupovat k nově vytvořenému zařízení /dev/mapper/encrypted. Jak vidíme, druhý parametr pro luksOpen tvoří jméno zařízení, které se nám vytvoří v /dev/mapper. Na nově vytvořeném zařízení vytvoříme souborový systém:

# mkfs.ext3 /dev/mapper/encrypted

Poté jej připojíme:

# mount /dev/mapper/encrypted /mnt/encrypted

A vše je hotovo. Po ukončení práce se zařízením jej odmountujeme:

# umount /dev/mapper/encrypted

Poté můžeme mapování zrušit příkazem:

# cryptsetup luksClose encrypted

Zajištění swapu pro vyšší bezpečnost

Používat LUKS na systému, kde je swap nešifrovaný, důrazně nedoporučuji. Swap je vhodné šifrovat, a to nejlépe náhodným heslem při každém startu systému. Následující příkazy zajistí vytvoření šifrovaného swapu na zařízení  /dev/sdq5:

# cryptsetup -d /dev/urandom create cswap /dev/sdq5
# mkswap /dev/mapper/cswap
# swapon /dev/mapper/cswap
Našli jste v článku chybu?
DigiZone.cz: Deklarace kompatibility? Jen LG...

Deklarace kompatibility? Jen LG...

Měšec.cz: Udali ho na nelegální software a přišla Policie

Udali ho na nelegální software a přišla Policie

Podnikatel.cz: Zůstat na Heurece je čiré bláznovství

Zůstat na Heurece je čiré bláznovství

Podnikatel.cz: Babiš představil daňovou revoluci Moje daně

Babiš představil daňovou revoluci Moje daně

Měšec.cz: Cestujte bez starostí, získejte výhodné pojištění

Cestujte bez starostí, získejte výhodné pojištění

120na80.cz: Krémy, nebo spreje na opalování?

Krémy, nebo spreje na opalování?

Podnikatel.cz: Výpadek internetu a #EET. Co s tím?

Výpadek internetu a #EET. Co s tím?

Lupa.cz: Zaměstnanec T-Mobilu ukradl data o zákaznících

Zaměstnanec T-Mobilu ukradl data o zákaznících

DigiZone.cz: HbbTV KinoSvět: už jede na dalších TV

HbbTV KinoSvět: už jede na dalších TV

DigiZone.cz: Slováci první, Češi třetí. Krásný...

Slováci první, Češi třetí. Krásný...

Vitalia.cz: 7 receptur z pohanky. Svědčí zdraví

7 receptur z pohanky. Svědčí zdraví

Měšec.cz: Ceny PHM v Evropě. Finty na úspory

Ceny PHM v Evropě. Finty na úspory

DigiZone.cz: ČTÚ květen: rušení TV vysílání narůstá

ČTÚ květen: rušení TV vysílání narůstá

Vitalia.cz: 5 porcí ovoce a zeleniny: no ale jak na to?

5 porcí ovoce a zeleniny: no ale jak na to?

Vitalia.cz: Máte chutě? Nejezděte do světa, ale do Dobřichovic

Máte chutě? Nejezděte do světa, ale do Dobřichovic

Lupa.cz: Text umírá, na webu zbude jen video

Text umírá, na webu zbude jen video

DigiZone.cz: Dabingové ceny znají letošní nominace

Dabingové ceny znají letošní nominace

Lupa.cz: Nej aplikace? Vodafone, Mozkovna, Záchranka

Nej aplikace? Vodafone, Mozkovna, Záchranka

Měšec.cz: TEST: Vyzkoušeli jsme pražské taxikáře

TEST: Vyzkoušeli jsme pražské taxikáře

Vitalia.cz: Margit Slimáková nesnáší rajskou, Petr Fořt pizzu

Margit Slimáková nesnáší rajskou, Petr Fořt pizzu