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

26. 5. 2008
Doba čtení: 4 minuty

Sdílet

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:

bitcoin_skoleni

# 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

Autor článku