Aug 21

Written by m4r3k and tagged by , , .

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

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.

Související stránky

Leave a Comment


Please note: Comment moderation is enabled and may delay your comment. There is no need to resubmit your comment.