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

17. 8. 2004
Doba čtení: 5 minut

Sdílet

V tomto dílu nás čeká vytvoření potřebného GPG klíče, kterým budeme oddíl šifrovat. Dále dokončíme realizaci celého initrd - především vytvoření initrd. Nakonec také vytvoříme šifrovaný swap.

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) EXTERNALGPGTY­PE=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.

bitcoin_skoleni

Linky:

loop-aes.sourcefor­ge.net/loop-AES.README
linuxfromscrat­ch.org/~devine/er­fs-howto.html
www.breakt.co­.il/main/Disk-Encryption-HOWTO
www.frech.ch/how­to/HOWTO/html_sin­gle/Cryptoloop-HOWTO">
forums.gentoo­.org/viewtopic­.php?t=31363
www.joe.cz/cms/Pa­pers/Cryptoro­ot%20HOWTO.html

Autor článku