Jak již bylo řečeno, jako šifrovací klíč bude sloužit GPG klíč. Vytvoříme si jej takto:
umask 077
head -c 2880 /dev/random | uuencode -m - | head -n 65 | tail -n 64 | gpg --symmetric -a > /key.gpg
Zadáte heslo a pak bude zřejmě potřeba nějaká činnost na počítači, aby se zajistila entropie při vytváření klíče – ideální je např. někam kopírovat zdrojáky linuxového kernelu. Klíč by pak měl být hotov během pár sekund. Klíč tedy umístíme na externí zařízení a kopii na nějaké bezpečné místo v případě, že by se nám externí zařízení třeba porouchalo. Dále je tu možnost vytvořit klíč z již existujícího GPG klíče. Co víc, lze vytvořit takový multi-key GPG klíč, což je klíč vytvořený z více GPG klíčů, čímž umožníte, aby data mohlo rozšifrovat více uživatelů. Poslední možnost je, že nepoužijeme GPG klíč, ale pouze heslo – to je ta nejméně bezpečná varianta. Takové heslo pak musí mít minimálně 20 znaků – toto lze potlačit, pokud před instalací util-linux zavedete globální proměnnou CFLAGS:
export CFLAGS="-O2 -DLOOP_PASSWORD_MIN_LENGTH=1"
Tato varianta nás momentálně stejně nezajímá. Zůstaneme proto u GPG klíčů.
Teď je potřeba upravit soubor /etc/lilo.conf (pokud používáte jiný zavaděč, tak to bude samozřejmě jiný konfigurační soubor). Hlavní část /etc/lilo.conf bude vypadat takto:
image = /boot/vmlinuz append = "init=/linuxrc rootfstype=minix" initrd = /boot/initrd.gz root = /dev/ram0 label = GNU/Linux read-only
Zatím zavaděč neinstalujeme (nezapisujeme). Teď nás čeká asi nejdůležitější část, a to je úprava skriptu build-initrd.sh, který nám vytvoří initrd. Tento skript naleznete v adresáři s rozbaleným archivem loop-AES. Nastavíme následující položky:
USEDEVFS=0 (devfs nepoužíváme, používáme klasická jména pro disky) USEPIVOT=1 (používáme pivot_root namísto zastaralého change_root) BOOTDEV=/dev/hda1 (nezašifrovaný oddíl s jádrem, initrd atd.) BOOTTYPE=ext2 (souborový systém na oddíle BOOTDEV) CRYPTROOT=/dev/hda5 (oddíl pro zašifrovaný kořenový svazek) ROOTTYPE=ext2 (souborový systém na oddíle CRYPTROOT) CIPHERTYPE=AES256 (použitá síla šifry AES – v tomto případě se bude heslo hašovat pomocí SHA-512) PSEED=„-S fifjdkrieo“ (semínko pro ztížení úspěšnosti slovníkových útoků) ITERCOUNTK=„-C 100“ (další mechanismus pro zpomalení neoprávněného lámání hesla) USEGPGKEY=1 (používáme GPG klíč) EXTERNALGPGFILES=1 (používáme externí zařízení) EXTERNALGPGDEV=/dev/sda1 (ext. zařízením bude blokové zařízení na USB portu /dev/sda1) EXTERNALGPGTYPE=ext2 (na tomto blokovém zařízení je vytvořen ext2 filesystem) INITIALDELAY=3 (některá USB zařízení jsou initrd-em nalezena až po pokusu o připojení, proto je potřeba dát prodlevu)
Samozřejmě si jednotlivé položky editujte podle vlastní situace. Ostatní položky je možno nechat, jak jsou.
Nyní zapište zavaděč – v případě LILA je to příkaz lilo. Zaveďte modul loop příkazem:
modprobe loop
A pak spusťte skript build-initrd.sh, který by měl úspěšně vytvořit initrd na oddílu /dev/hda1.
Restartuje počítač a nabootujte z nějaké live distribuce – Knoppix, SLAX,… a nebo záchrané CD Slackware (CD2). Pokud máte floppy mechaniku, můžete nabootovat i z diskety. Po úspěšném nabootování připojíme nejprve oddíl pro šifrovaný svazek
mount -t ext2 /dev/hda5 /mnt
a přepíšeme /mnt/etc/fstab tak, že místo řádku
/dev/hda5 / ext2 defaults 1 1
bude řádek
/dev/loop5 / ext2 defaults 1 1
Proč loop5? Protože ve skriptu build-initrd.sh je implicitně nastavena hodnota ROOTLOOPINDEX=5.
Oddíl můžeme odpojit
umount /mnt; sync
Nyní připojíme oddíl /dev/hda1
mount -t ext2 /dev/hda1 /mnt
a také USB klíč s GPG klíčem
mkdir /usb; mount -t ext2 /dev/sda1 /usb
A nyní zašifrujeme data v kořenovém svazku pomocí programu dd a aespipe takto:
dd if=/dev/hda5 bs=64k | /mnt/aespipe -e AES256 -K /usb/key.gpg -G / | dd of=/dev/hda5 bs=64k conv=notrunc
Poté zadáte správné heslo. Toto může trvat velmi dlouho. V případě mého skoro 40GB oddílu to trvalo dobré dvě hodiny. Až se nám vytvoří, odpojíme oddíl /dev/hda1 i /dev/sda1
umount /mnt; sync umount /usb; sync
A restartujeme počítač. Nyní je vše hotovo, a pokud se vše zdařilo, měli byste být po načtení initrd dotázáni na heslo ke klíčí GPG, který je na USB zařízení zasunutém v USB portu. Po zadání správného hesla se spustí samotný systém.
Pokud budeme chtít používat swap, budeme ho také šifrovat, protože se na něj odkládají i data přímo spojená se šifrováním – používá ho např. GPG. Pokud jsme aktivovali swap dříve (např. při instalaci), vypneme nejdříve všechna swap zařízení v /etc/fstab:
swapoff -a
Do souboru /etc/fstab doplníme (v případě, že tam již swap máte, tak editujeme) řádek se swap zařízením, aby vypadal nějak takto:
/dev/hda6 none swap sw, loop=/dev/loop6, encryption=AES256 0 0
Dále přepíšeme data, která mohla na oddíle zůstat nezašifrovaná, např. takto:
dd if=/dev/zero of=/dev/hda6 bs=64k conv=notrunc
Místo programu dd lze využít i např. programu shred. A vytvoříme samotný swap:
mkswap /dev/hda6
A swap aktivujeme:
swapon -a
A teď už nám snad nic nechybí.
Způsobů, jak vytvořit cryptoroot, je více, ale tento je podle mě nejsnazší. Je to hlavně dáno tím, že initrd vám vytváří automaticky hotový skript a nemusíte ho vytvářet ručně.
Pokud nyní budete chtít například rekompilovat jádro, tak obecně není problém. Je pravděpodobné, že budete muset upgradnout util-linux, pokud přecházíte z jádra 2.4 na jádro 2.6.
Nedělal jsem žádné testy výkonnosti (třebas mě někdo ukecá a v diskusi se to objeví), ale tyto informace si lze jistě pro různé procesory, síly šifer,… dohledat ve veřejných informačních zdrojích.
Policie klepe na dveře, vypínám notebook, polykám USB disk…
Thx to Jari Ruusu for help and for loop-AES.
TODO: vytvoření initrd s linuxrc skripty pro rozšifrování oddílu a nabootování systému s nezašifrovaným kořenovým svazkem a dalším linuxrc skriptem pro přešifrování oddílu jiným typem AES šifry a následným bootem systému s kořenovým svazkem zašifrovaným touto novou šifrou – např. pokud chceme zvýšit sílu šifry. Něco podobného jako v dokumentu Cryptoroot HOWTO Dominika „Joe“ Pantůčka.
Linky:
loop-aes.sourceforge.net/loop-AES.README
linuxfromscratch.org/~devine/erfs-howto.html
www.breakt.co.il/main/Disk-Encryption-HOWTO
www.frech.ch/howto/HOWTO/html_single/Cryptoloop-HOWTO">
forums.gentoo.org/viewtopic.php?t=31363
www.joe.cz/cms/Papers/Cryptoroot%20HOWTO.html