Hlavní navigace

Cryptoroot pro nejvyšší bezpečnost (1)

10. 8. 2004
Doba čtení: 8 minut

Sdílet

V tomto HOW-TO si popíšeme krok za krokem vytvoření šifrovaného kořenového svazku pod systémem GNU/Linux - tzv. cryptoroot. V prvním dílu si povíme něco teoretického a připravíme si potřebný software. V druhém pak dokončíme samotné zprovoznění cryptorootu.

Čísla hovoří jasně. V roce 2001 bylo v USA odcizeno asi 591 000 notebooků (což je nějakých 1600 každý den) – zdroj. Kolik procent jich bylo zcizeno pro zisk informací, se můžeme jen domnívat, ale tento údaj z roku 2001 nám naznačuje, jak alarmující číslo to může být v současné době, když bereme v úvahu, že prodej notebooků se stále zvyšuje. Protože se stěhuji do Prahy, což může být prostředí potenciálně nebezpečné, řešil jsem, jak efektivně chránit data ve svém notebooku a zabránit tak jejich úniku v případě krádeže. Chránit jsem chtěl najednou prakticky celý disk včetně systémových souborů, logy, domácí adresáře včetně toho rootovského atd. Budeme šifrovat také swap oddíl. Možná někdo namítne, že by stačilo šifrovat určitý oddíl, kde by se nacházela data, která chceme ochránit. Ale to už záleží na každém jednotlivci a jeho situaci, co mu vyhovuje. Já osobně nechci, aby kdokoliv získal přehled o aktivitách, které byly na notebooku provozovány. A nebo aby si někdo nepovolaný (což jsou všichni kromě mě) pročítal v historii ICQ či logu IRC;-) Samozřejmě mám na mysli i jiné logy a záznamy. Zatím tu celou dobu mluvím pouze o noteboocích, ale tyto techniky lze samozřejmě využít i v případě ostatních počítačů, kdy chceme ochránit data před fyzickou kompromitací. Pro vyšší bezpečnost jsem dále chtěl, aby byl klíč, kterým budou data zašifrována, umístěn na externím zařízení (USB flash disk, CD, disketa apod.).

Když toto zrealizujeme a někdo nám zcizí notebook (popř. disk počítače) a bude si ho chtít připojit ke svému systému, bude potřebovat šifrovací klíč a heslo (pokud nepoužijeme šifrovací klíč, tak pouze heslo), aby zašifrovaná data z našeho disku rozšifroval. Pokud máte šifrovací klíč na externím zařízení (a útočník jej nezískal společně s notebookem, což by se stát nemělo, pokud ho nenosíte v brašně společně s notebookem;-)), nemá útočník prakticky šanci na úspěch. Pokud používáte klíč, který je umístěn na disku společně s šifrovanými daty, nebo pokud nepoužíváte šifrovací klíč vůbec (tedy pouze heslo), je tu samozřejmě šance, že se útočníkovi podaří „hrubou silou“ tato data rozšifrovat. Nicméně při výběru správné šifry a její dostatečné síly lze toto riziko prakticky eliminovat – k dispozici jsou i některé další mechanismy ochrany samotné šifry, o kterých se zmíním v průběhu.

A teď již, jak na to. Aby byl systém použitelný, musí být zvolené šifrování velmi rychlé. K takovému účelu se tedy používají tzv. šifrované filesystémy a šifrování přes loop zařízení – tedy cryptoloop. Prakticky známe dvě implementace cryptoloop, a to CryptoAPI a loop-AES. Já jsem si vybral loop-AES, protože obsahuje implementaci šifry AES a hašovací funkce MD5 pro procesory x86 a AMD64 v assembleru, čímž je zajištěna větší optimalizace, a tím tedy i vyšší rychlost samotného šifrování. Samozřejmě pokud jste nuceni, můžete použít i implementaci v jazyce C. CryptoAPI na rozdíl od loop-AES obsahuje další šifrovací funkce, ale pouze v jazyce C. Dále např. implementaci IPSec. Nám tedy bude plně vyhovovat loop-AES. Šifra AES (Rijndael) byla schválena National Institute of Standards and Technology v USA a je také uznávána odborníky na šifrování. Takže loop-AES je přesně to, co potřebujeme – nic více, nic méně.

Následující kroky doporučuji dělat na „čistý“ disk, protože chyba většinou znamená ztrátu dat – resp. data jsou např. několikrát přešifrována, bůh ví, jakým klíčem a těžko se to vrací zpět. Proto svá data zazálohujte. Nejdříve si připravíme potřebné diskové oddíly. První oddíl, který bude jediný nezašifrovaný, bude obsahovat samotné jádro (čili adresář /boot), zabalený initrd (initrd.gz) a další soubory (např. šifrovací klíč, pokud ho nechcete mít umístěn na externím zařízení). Tomuto oddílu bude opravdu bohatě stačit 32 MB. Na dalším oddílu bude samotný kořenový svazek – čili náš nainstalovaný systém GNU/Linux. Poslední oddíl bude sloužit jako swap. Pokud chcete oddělit např. adresář /home nebo jiný na zvláštní oddíl, je to možné a tyto oddíly budeme šifrovat zvlášť přes /etc/fstab a nebo příkazem spouštěným při startu – tzn. ne přes initrd. Výpis z fdisku by mohl vypadat nějak takto:

Disk /dev/hda: 40.0 GB, 40007761920 bytes
255 heads, 63 sectors/track, 4864 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Device Boot    Start    End    Blocks   Id  System
/dev/hda1   *      1      4     32098+  83  Linux
/dev/hda2          5   4864  39037950    5  Extended
/dev/hda5          5   4745  38082051   83  Linux
/dev/hda6       4746   4864    955836   82  Linux swap

/dev/hda1 jako nešifrovaný oddíl pro jádro apod. /dev/hda5 pro samotný systém a /dev/hda6 pro swap. Typy souborového systému nás zatím nemusejí zajímat, ale v následné instalaci systému budeme používat pro /dev/hda1 i /dev/hda5filesystém ext2. Použití žurnálovacích souborových systémů obecně není problém. Nedoporučuje se je však používat na samotné loop zařízení.

Pokud máme vhodně rozdělený disk, přikročíme k samotné instalaci systému. Nezapomeňte, že adresář /boot se má připojit na /dev/hda1. Kořenový adresář / pak na /dev/hda5. Swap zatím vůbec aktivovat nemusíte, protože ho budeme také šifrovat, takže ho po jistých změnách aktivujeme po instalaci celého cryptorootu.

V dalším kroku si připravíme linuxové jádro. Já jsem se rozhodl použít vanilla jádro 2.6.6. Pokud budete používat jiná jádra, zvláště pak ta řady 2.4, narazíte zde na jisté rozdíly, ať už v podobě použití jiných patchů, verzí util-linux, a nebo toho, že moduly v jádrech řady 2.6 mají koncovku .ko a ne .o, jako tomu bylo u jader 2.4. Příliš významné to není, ale řeknu, že jsem vše testoval na linuxové distribuci Slackware 10. Vypíši zde položky z .config (jakožto defaultního konfiguračního souboru jádra Linuxu), které jsou potřebné pro to, aby nám loop-AES chodilo správně. Určitě musíte nastavit:

CONFIG_MODULES=y
CONFIG_BLK_DEV_LOOP=n

(loop nesmí být zaveden ani jako modul!)

CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y
CONFIG_MINIX_FS=y

(filesystém minix budeme používat v initrd)

CONFIG_PROC_FS=y
CONFIG_CRAMFS=n (nebo CONFIG_CRAMFS=m)

Dále potřebné položky pro používaný filesystém – v mém případě tedy CONFIG_EXT2_FS=y pro ext2. Jako externí zařízení plánuji používat USB flash disk. Je to pohodlnější než používat CD a bezpečnější než např. disketu (navíc jaké notebooky mají v dnešní době interní floppy mechaniku, že). USB klíče se dají sehnat v různých diskrétních podobách – např. tento velmi malý a kovový USB flash disk. Nebo si můžete šifrovací klíč schovat do digitálního fotoaparátu s flash pamětí;-) A co třebas tyto geekovské hodinky? Dost, to stačí. USB flash disky prostě rulují;-) Ale abychom je mohli správně používat jako USB token (USB dongle), je potřeba nastavit některé další jaderné položky, a to:

CONFIG_USB=y
CONFIG_USB_DEVICEFS=y
CONFIG_USB_EHCI_HCD=y

(nebo CONFIG_USB_OH­CI_HCD=y nebo CONFIG_USB_UH­CI_HCD=ynebo všechny)

CONFIG_USB_STORAGE=y

a dále některé položky pro SCSI:

CONFIG_SCSI=y

Pokud zde nevíte, k čemu daná položka přesně je, zaškrtněte ji. Není to tedy zcela „košér“, ale nic tím nezkazíte. Zde si můžete stáhnout můj .config, který jsem použil s jádrem 2.6.6, a inspirovat se jedním z možných nastavení. Jádro zkompilujeme, nainstalujeme (tzn. zkopírujeme bzImage a System.map do /boot), přepíšeme zavaděč systému (v mém případe LILO) a vyzkoušíme, zdali je naše jádro funkční.

Nyní je potřeba nainstalovat a upgradnout některé aplikace, které budeme potřebovat. Za prvé musíme nainstalovat diet libc. K samotnému zašifrování kořenového oddílu pomocí šifrovacího klíče budeme potřebovat nainstalovat aespipe, který nainstalujeme tak­to:

export CFLAGS="-02"
export LDFLAGS="-static -s"
./configure
make
make tests

Pokud test dopadne v pořádku, zkopírujeme binárku aespipe do /boot:

cp -p aespipe /boot

Protože šifrovací klíč bude v podobě GPG klíče, je potřeba nainstalovat nové GnuPG patchlé patchem z loop-AES. Archiv s GnuPG 1.2.5 rozbalíme např. do adresáře s rozbaleným archivem s loop-AES, skočíme do adresáře se zdrojáky GnuPG a patchujeme příkazem:

patch -p1 < ../gnupg-1.2.5.diff

A instalujeme:

export CFLAGS="-O2"
export LDFLAGS="-static -s"
./configure --prefix=/usr --enable-static-rnd=linux
make
rm -f /usr/share/man/man1/{gpg,gpgv}.1.gz
make install
chown root.root /usr/bin/gpg
chmod 4755 /usr/bin/gpg

Slackwaristi místo příkazu make install jistě použijí checkinstall.

Nyní zkompiluje samotné loop-AES. Skočíme do adresáře s rozbaleným loop-AES archivem a zadáme:

make

Pokud make nenalezne zdrojové kódy linuxového kernelu, zadejte cestu ručně. Pak by příkaz pro kompilaci vypadal např. takto:

make LINUX_SOURCE=/usr/src/linux-2.6.6

Po úspěšné kompilaci zkopírujeme modul /lib/modules/2­.6.6/block/lo­op.ko (v mém případě) do adresáře /boot/modules-2.6.6, který musíme nejprve vytvořit.

Ještě potřebujeme nainstalovat nové patchlé util-linux. Stáhneme příslušnou verzi util-linux, na kterou máme v adresáři s loop-AES správný patch – v mém případě je to verze 2.12a. Archiv rozbalíme do adresáře s loop-AES, stejně jako v případě GnuPG, a patchujeme:

patch -p1 <../util-linux-2.12a.diff

A instalujeme:

export CFLAGS="-O2"
export LDFLAGS="-static -s"
./configure
make SUBDIRS="lib mount"
cd mount
install -m 4755 -o root mount umount /bin
install -m 755 losetup swapon /sbin
rm -f /sbin/swapoff && ( cd /sbin && ln -s swapon swapoff )
rm -f /usr/share/man/man8/{mount,umount,losetup, swapon, swapoff}.8.gz
install -m 644 mount.8 umount.8 losetup.8 /usr/share/man/man8
install -m 644 swapon.8 swapoff.8 /usr/share/man/man8
rm -f /usr/share/man/man5/fstab.5.gz
install -m 644 fstab.5 /usr/share/man/man5 

(Pozn. red.: v 9. řádku mezery za čárkami nemají být, byly přidány kvůli zlomu –Johanka)

UX DAy - tip 2

Vidíme, že upgradujeme i příslušné manuálové stránky.

Softwarové vybavení máme připraveno. V přístím dílu si vytvoříme potřebný GPG klíč, vytvoříme initrd a projdeme některými dalšími kroky k realizaci celého cryptorootu.

Byl pro vás článek přínosný?

Autor článku

  • Cryptoroot pro nejvyšší bezpečnost (1)