Hlavní navigace

Zaostřeno na dm-crypt

Josef Kadlec

Protože se v cryptoloopu objevilo dost nejen bezpečnostních nedostatků, bude se od jeho podpory v nových linuxových kernelech pomalu upouštět. Jeho úlohu nahrazuje dm-crypt a my si ho dnes představíme.

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/cryp­todev1. 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/cryp­todev1, a to provedeme takto:

dd if=/dev/hda2 of=/dev/mapper/cryptodev1 bs=4k

Pro jistotu můžeme zkontrolovat blokové zařízení /dev/mapper/cryp­todev1 příkazem fsck. Pak už můžete jednoduše připojovat /dev/mapper/cryp­todev1 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

Našli jste v článku chybu?