Ve dvoudílném článku Cryptoroot pro nejvyšší bezpečnost jsem popsal, jak vytvořit šifrovaný kořenový svazek. K jeho realizaci na té nejnižší vrstvě jsem využíval tzv. cryptoloop – samozřejmě ho lze využít i k šifrování jednotlivých diskových oddílů či adresářů. Cryptoloop je však v současné době nahrazován modernějším nástrojem, a tím je dm-crypt jakožto šifrovací vrstva pro device-mapper. I když se mnozí z různých důvodů vztekají a tuto změnu si nepřejí, je pravdou, že cryptoloop obsahuje řadu známých zranitelností (není odolný proti plaintext a watermark útokům), takže není pochyb o tom, že je výměna na místě – zvláště pokud se jedná o nástroj k ochraně dat, že. Další výhodou dm-cryptu je to, že na rozdíl od cryptoloop není závislý na util-linux ani na žádném jiném uživatelském nástroji. Kdo někdy patchoval util-linux, jistě mi dá za pravdu, že to občas může být docela nesnadné – např. vzhledem k existenci různých nekompatibilních patchů a jejich různých verzí. Cryptoloop také trpěl svou nestabilitou. To dm-crypt radikálně řeší použitím tzv. mempoolu, který ho tvoří velmi stabilním. O nedostatcích v cryptoloopu pojednává článek na lwn.net.
Problémem může být pouze samotná migrace, a proto je cryptoloop v jádrech řady 2.6 stále udržován, přičemž je již k dispozici dm-crypt (device-mapper). Přesněji řečeno byla podpora dm-cryptu zařazena do stabilního jádra verze 2.4. Doporučuje se však použít jádro 2.6.5 a novější z důvodu blíže neurčených problémů u jádra 2.6.4.
Co je zbrusu nového na dm-cryptu a dělá dm-crypt dm-cryptem, je právě device-mapper, který umožňuje nadefinovat nový oddíl nebo logickou jednotku. K tomu potřebuje znát rozsah sektorů nebo existující bloková zařízení, která jsou mapována tzv. mapovací tabulkou (mapping table), a dm-crypt pak tyto cíle určuje pro šifrování přes standardní cryptoAPI.
Nyní si stručně popíšeme, jak to celé nainstalovat a jaké další nástroje budeme potřebovat. Prvně potřebujeme jádro – nejlépe vanilla 2.6.5 a novější. Jádro musí mít zakompilovanou podporu („natvrdo“ nebo jako modul) pro Device Mapper Support
( CONFIG_BLK_DEV_DM
) a Crypt Target Support
( CONFIG_DM_CRYPT
). Obojí najdete v sekci Multi-device support (RAID and LVM)
. Pokud je podpora dm-cryptu zavedena jako modul, je potřeba modul zavést ( modprobe dm-mod
) a zajistit, aby se zaváděl automaticky po startu systému (v mé distribuci Slackware Linux 10 je to soubor /etc/rc.d/rc.modules
). K šifrování také budeme potřebovat šifrovací funkce (či funkci) z jádra, které najdeme v sekci Cryptographic Options
. Doporučuji prověřenou šifru AES (Rijndael) – CONFIG_CRYPTO_AES
.
Ještě než nainstalujeme samotný device-mapper, spustíme skript devmap_mknod.sh
, který najdeme v archivu s device-mapperem v adresáři scripts
. Tento skript vytvoří zařízení /dev/mapper/control device
, které je využíváno device-mapperem. Pak již můžeme zkompilovat a nainstalovat samotný device-mapper klasickou cestou ./configure; make; make install
(Slackwaristi jistě zase využijí ./configure; make; checkinstall
).
Pro snazší práci s dm-cryptem si ještě nainstalujeme (zkopírujeme do $PATH
nebo nastavíme $PATH
adresář s tímto skriptem a nasadíme mu x bit) skript cryptsetup.sh, jenž nám ulehčí práci s utilitou dmsetup
, kterou nainstaloval device-mapper. Místo cryptsetup.sh lze použít i implementaci v C cryptsetup, která vyžaduje ještě nainstalovat libgcrypt a libdevmapper. Obě verze, jak verze interpretovaná, tak kompilovaná, mají stejnou syntax, takže přechod je bezbolestný.
Pokud budeme chtít vytvářet klíče pomocí nástroje hashalot, tak ho také nainstalujeme ( ./configure, make, make install
).
A teď již k samotnému použití. Ty, kteří budou chtít vytvářet šifrovací oddíl pomocí utility dmsetup
, odkáži na domovské stránky, kde se hned na titulní straně nachází dokumentace. Pokud po tom opravdu netoužíte nebo to nepotřebujete, doporučuji používat skript cryptsetup.sh, který utilitu dmsetup
volá, a tvoří jí tedy jakýsi front-end.
Dejme tomu, že tajná data, která chceme šifrovat, máme na diskovém oddílu /dev/hda2
. Oddíl odpojíme (odmountujeme) a pro jistotu použijeme příkaz sync. Také ho můžeme zkontrolovat příkazem fsck. A teď přijde ten důležitý příkaz:
cryptsetup.sh -c aes -h ripemd160 -y -b `blockdev --getsize /dev/hda2` create cryptodev1 /dev/hda2
Vidíme, že používáme šifru AES. Dále si všimněme, že používáme hashovací funkci ripemd160 – je obsažena v hashalot. Pokud nemáte hashalot nainstalován, použijte -h plain
. Příznak -y
znamená, že budete na heslo dotázáni dvakrát. Za příznakem -b
následuje velikost šifrovaného oddílu v sektorech. Tu lze zjistit příkazem blockdev
. Následuje akce create
, kterou se vytvářejí zařízení v adresáři /dev/mapper/
. Akce má dva parametry – jméno zařízení a diskový oddíl, který se bude šifrovat. Takže naše zařízení se jmenuje cryptodev1
a jeho přesné umístění po spuštění příkazu bude /dev/mapper/cryptodev1
. Možná si můžeme toto zařízení představit jako loop zařízení u cryptoloopu. Šifrovaný oddíl již známe a je jím /dev/hda2
. Po zadání příkazu budete dotázáni na heslo. Příkaz je nutno volat při startu systému, takže je potřeba ho umístit někam do rc skriptů.
Dalším krokem je nakopírování dat z /dev/hda2
do /dev/mapper/cryptodev1
, a to provedeme takto:
dd if=/dev/hda2 of=/dev/mapper/cryptodev1 bs=4k
Pro jistotu můžeme zkontrolovat blokové zařízení /dev/mapper/cryptodev1
příkazem fsck
. Pak už můžete jednoduše připojovat /dev/mapper/cryptodev1
na nějaký adresář.
Vidíme, že práce je s ním možná o něco příjemnější než s cryptoloopem, nemluvě o jeho výhodách, o kterých sem již řekl dost na začátku. Možná vás někoho zajímá, jak pomocí dm-cryptu vytvořit cryptoroot. Metodika je stejná, ba dokonce ještě jednodušší. Se znalostmi nabytými z článku Cryptoroot pro nejvyšší bezpečnost a Jak funguje initramdisk byste to měli zvládnout. Problém nenastane ani, pokud budete k šifrování chtít použít GPG klíč. Lze to provést přes rouru např. takto:
gpg -q --cipher-algo AES256 --decrypt key.gpg | cryptsetup.sh create cryptodev1 /dev/hda2
GPG je jistě bezpečnější varianta než používat pouze heslo. A hodí se zvláště, pokud chcete vytvořit externí token (např. USB dongle), i když na takováto zařízení lze samozřejmě ukládat i hesla v plain textu.
Poslední věta před smrtí: „To že jsem paranoidní, neznamená, že po mně nejdou.“ :-)
Encrypting partitions using dm-crypt and the 2.6 series kernel