Written by m4r3k and tagged by bezpečnost, linux, openSUSE.
Tlak organizací jako je RIAA stále sílí a i když v počítači žádný obsah pochybného původu nemáte to neznamená, že si pro váš počítač nemůžou z PČR přijít. Dále máte doma v poítači možná nějaké audiovizuální díla vlastní tvorby, které byste neradi svěřili do cizích rukou. Pokud tedy nechcete svá data jen tak ukazovat celému světu je čas, abyste se svěřili do rukou CryptoAPI.
Jak upozorňuje Michal Kubeček, v cryptoloopu je několik bezpečnostních problémů.
CryptoAPI
CryptoAPI je rozhraní jádra, které slouží k šifrování, dešifrování, komprimování a hashování dat, pokud to spojíte modulem loop a cryptoloop tak dostanete věcičku, která je schopná zašifrovat klíčem a a algoritmem A váš disk, poté dešifrovat klíčem b a algoritmem B a dále pak ještě zašifrovat klíčem c a algoritmem C (- toto je mnohem zajímavější pokud platí: a!=b!=c ^ A!=B!=C), zvládá provést vyjmenované operace i pozpátku, takže vám umožní se ke svým datům opět dostat.
Trocha historie
Již je to nějakou dobu, co máme ve vanilkovém jádře podporu pro rozličné šifrovací algoritmy s rozličnou délkou klíče, a hashovací algoritmy s rozličnou délkou výstupního hashe. Ale nebylo tomu tak vždy, kdysi za dávných dob kdy některé šifrovací algoritmy byly klasifikovány USA jako srovnatelné s jadernými zbraněmi se tyto algoritmy nemohli z USA vyvážet a tak vznikl projekt kerneli.org(kernel international), který poskytoval patche na jádra řady 2.4, nicméně od vydání jádra 2.6, které obsahuje tyto patche již v hlavním stromu projekt kerneli.org zanikl.
Dost už keců aneb něco teorie
Co je šifrování asi nemusím nikomu vysvětlovat, ale vy co to nevíte jedná se o činnost kterak učinit nějaké informace nečitelné pro ostatní, ale čitelné pro ty co znají správný dešifrovací klíč. Algoritmů je mnoho, spousta jich je už prolomena, ale zbývá i spousta dalších o jejichž prolomení my běžní smrtelníci nevíme, co se děje ve sklepech trojpísmenných agentur nikdo z nás neví.. :) Správný šifrovací algoritmus by měl být založený na tom, že útočník nezná použítý šifrovací klíč, nikoli na utajování algoritmu. Kam utajování algoritmů vede vidíme v situaci kolem šifrování DVD, TiVo, GSM,…
Schématko, aneb neumím kreslit :-)

Schéma cryptoloopu (Poté co viděl mé otřesné schéma jardouš tak nakreslil nové :-) )
Jak je na schématu vidět tak do cryptoloopu vstupuje heslo přes hashovací funkci, důvod je jednoduchý, šifrovací klíč musí mít přesnou délku podle použitého algoritmu, je tedy jednodušší heslo, které zadá uživatel zhashovat a dostaneme tak řetězec o přesně dané délce, o takové kterou potřebujeme ať už má uživatel heslo dlouhé 8 znaků, nebo 100.
Požadavky
Co budete potřebovat?
- Takže bude potřeba mít nainstalované a již nějakou dobu běžící openSUSE, pokud se chystáte openSUSE teprve nainstalovat tak doporučuji postupovat podle návodu ve wiki.
- Dostatek odvahy a odhodlání
- Nějaké LiveCD s podporou cryptoloopu (třeba instalační DVD openSUSE)
- Mimo jiné i balíček mkinitrd a vim :-)
Konkrétní příklad
Nyní vám popíšu jak se při převodu svého systému postupoval já, ostatní si to jistě zvládnou jednoduše poupravit na svůj systém.
Notebook
Struktura disku
/dev/hda
/dev/hda1 — /boot
/dev/hda3 — swap
/dev/hda2 — /home/marek/multimedia
/dev/hda4 — /
Krok první - plánování je začátek
Jelikož mám 2 datové diskové oddíly tak potřebuji rozmyslet 2 hesla. Dále je také vhodné si v tomto kroku rozmyslet správný algoritmus.
Druhý krok - přešifrováváme první oddíl
Přešifrujeme si ten oddíl, který není /, ani /boot, ani swap. Všechny ostatní oddíly však zašifrujeme nejlépe právě na tomto místě.
mantisha:/home/marek # umount /dev/hda2 mantisha:/home/marek # losetup -e twofish256 /dev/loop1 /dev/hda2 Heslo: mantisha:/home/marek # dd if=/dev/hda2 of=/dev/loop1 bs=4096 # This take loooooong time. mantisha:/home/marek # losetup -d /dev/loop1
Třetí krok - upravujeme initrd
Otevřeme si soubor /etc/sysconfig/kernel a na řádek INITRD_MODULES přídáme moduly loop cryptoloop twofish twofish_common blkcipher cbc, spustíme příkaz mkinitrd.
Nyní si rozbalíme vytvořený ramdisk a provedeme pár úprav v souboru init
mantisha:/home/marek/Files/projekty/token/ramdisk # gzip -d /boot/initrd-2.6.22.1-10-default -c | cpio --extract 14538 blocks
Otevřeme si soubor init v adresáři, kam jsme rozbalili ramdisk. Přejdeme na řádky, kde končí načítání všech modlů a přidáme tam:
echo "Zadejte heslo pro oddil \"/\"!" losetup -e twofish256 /dev/loop1 /dev/hda4 echo "Zadejte heslo pro oddil \"/home/marek/multimedia\" !" losetup -e twofish256 /dev/loop2 /dev/hda2
Jistě jste si všimli, že disk /dev/hda4 ještě nebyl zašifrován, je to proto, protože jej můžeme zašifrovat až jakmile jej odpojíme a protože je to kořenový oddíl, tak jej můžeme zašifrovat jedině z jiného systému.
Nyní vytvoříme příkazem mknod potřebná zařízení. loop0 zařízení vytvoříme pomocí mknod -m 600 dev/loop0 b 7 0, pro ostatní postupujeme analogicky… tedy:
mknod -m 600 dev/loop0 b 7 0 mknod -m 600 dev/loop1 b 7 1 mknod -m 600 dev/loop2 b 7 2 mknod -m 600 dev/hda2 b 3 2 mknod -m 600 dev/hda4 b 3 4
Nakonec ještě přikopírujeme binárku losetupu. cp /sbin/losetup ./sbin/
Nyní můžeme initrd opět zabalit příkazem
find . ! -name "*~" | cpio -H newc --create | gzip -9 > /boot/initrd
Krok čtvrtý - upravujeme fstab a menu.lst
V souboru /etc/fstab nahradíme všechny výskyty /dev/hda2 za /dev/loop2 a v /dev/hda4 za /dev/loop1.
Dále pak v souboru /boot/grub/menu.lst změníme root na /dev/loop1. Nyní je čas rebootovat.
Krok pátý - bootujeme instalační DVD opensuse
Máte li k dispozici instalační DVD openSUSE tak máte vyhráno, nabootujte do Rescue režimu a přihlaste se jako root. Nyní nahrejte potřebné moduly: loop, cryptoloop, twofish. Zašifrujte /dev/hda4 následovně:
losetup -e twofish256 /dev/loop6 /dev/hda4 dd if=/dev/hda4 of=/dev/loop6 bs=4096
Pokud jsem na něco nezapoměl tak by nyní mělo býti dokonáno. :-)
Trocha benchmarků na konec!
Následující testy byly prováděny za provozu a mají tak jen a pouze informativní charakter.
Konfigurace:
CPU: Mobile AMD Sempron(tm) Processor 3400+
RAM: 439 MB
mantisha:/home/marek # hdparm -tT /dev/hda4 /dev/hda4: Timing cached reads: 1270 MB in 2.00 seconds = 635.00 MB/sec Timing buffered disk reads: 92 MB in 3.00 seconds = 30.66 MB/sec mantisha:/home/marek # hdparm -tT /dev/loop1 /dev/loop1: Timing cached reads: 1252 MB in 2.00 seconds = 625.85 MB/sec Timing buffered disk reads: 68 MB in 3.09 seconds = 22.02 MB/sec mantisha:/home/marek # hdparm -tT /dev/hda2 /dev/hda2: Timing cached reads: 1198 MB in 2.00 seconds = 598.66 MB/sec Timing buffered disk reads: 60 MB in 3.51 seconds = 17.08 MB/sec mantisha:/home/marek # hdparm -tT /dev/loop2 /dev/loop2: Timing cached reads: 1274 MB in 2.00 seconds = 637.45 MB/sec Timing buffered disk reads: 40 MB in 3.22 seconds = 12.42 MB/sec mantisha:/home/marek #
TODO:
Aneb co bych chtěl do budoucna vytvořit.
- Chtěl bych vytvořit USB token na němž by byl zašifrovaný šifrovací klíč pomocí XORu s délkou klíče stejnou, jaká je délka šifrované zprávy (Vernamova šifra, neprolomitelná), protože nemůžeme však po uživateli chtít, aby si tak dlouhý klíč pamatoval bude použita hashovací funkce, která bude mít potřebně dlouhý výstup.
- Hashování bude probíhat v samotném USB tokenu, stejně jako dešifrování šifrovacího klíče.
- Zkusit nějak pořešit swap aby bylo možno provádět Suspend na disk (zatím jsem tomu nevěnoval žádný čas)
- Napsat patch na mkinitrd, aby vše, nebo alespoň většinu práce udělal sám
Ještě bych si dovolil upozornit na trošku zaprášené video.