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?
Měšec.cz: Do ostravské MHD bez jízdenky. Stačí vaše karta

Do ostravské MHD bez jízdenky. Stačí vaše karta

Podnikatel.cz: Kanceláře jako kóje? Špatný vtip

Kanceláře jako kóje? Špatný vtip

Root.cz: Bitcoin začal vyplácet jen půlku odměn

Bitcoin začal vyplácet jen půlku odměn

120na80.cz: Jaké plavecké pomůcky vaše dítě ochrání?

Jaké plavecké pomůcky vaše dítě ochrání?

DigiZone.cz: Jsou obchody připraveny na DVB-T2/HEVC?

Jsou obchody připraveny na DVB-T2/HEVC?

120na80.cz: I tuto vodu můžete pít

I tuto vodu můžete pít

Vitalia.cz: 10 potravin, po kterých budete mít ještě větší hlad

10 potravin, po kterých budete mít ještě větší hlad

DigiZone.cz: Nestihli jste Bonda na ČT2? Zkuste RTVS

Nestihli jste Bonda na ČT2? Zkuste RTVS

Lupa.cz: Seznam.cz sleduje stisky kláves, aby odhalil roboty

Seznam.cz sleduje stisky kláves, aby odhalil roboty

DigiZone.cz: Skylink: do pátku může docházet k výpadkům

Skylink: do pátku může docházet k výpadkům

Podnikatel.cz: Akční plán podpoří byznys padesátníků

Akční plán podpoří byznys padesátníků

Měšec.cz: Kurzy platebních karet: vyplatí se platit? (TEST)

Kurzy platebních karet: vyplatí se platit? (TEST)

Vitalia.cz: Paní výčepní: Holka, co mluví chlapům do piva

Paní výčepní: Holka, co mluví chlapům do piva

Vitalia.cz: Mateřská - nejlepší období v životě ženy? Hahahaha

Mateřská - nejlepší období v životě ženy? Hahahaha

Podnikatel.cz: Polská vejce na českém pultu Albertu

Polská vejce na českém pultu Albertu

120na80.cz: SOS aneb spálená pokožka

SOS aneb spálená pokožka

DigiZone.cz: Sat novinky: Skylink skončil s kanály ČT

Sat novinky: Skylink skončil s kanály ČT

Podnikatel.cz: Profese budoucnosti? Úředník nepřežije

Profese budoucnosti? Úředník nepřežije

Podnikatel.cz: Italské těstoviny nebyly k mání, tak je začal vyrábět

Italské těstoviny nebyly k mání, tak je začal vyrábět

Vitalia.cz: Klíšťata letos řádí, skvrna se udělá jen někomu

Klíšťata letos řádí, skvrna se udělá jen někomu