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