Ivor Kollar

Sifrovanie disku pod linuxom (s LoopAES)

1. Uvod
Ukazeme si ako v reale rozbehat loopAES na linuxe s 2.6 jadrom. Masinu budeme bootovat z USB-kluca, kde bude zaklad systemu a gpg kluc, ktorym mame nas disk zacryptovany. Sifrovat mozme bud cely disk, alebo iba vybrane particie. Okrem usb kluca by sa este dalo pouzit CD-cko, ktore vzhladom k svojej jednorazovosti moze byt lepsie( nehrozi riziko zmenenia obsahu), avsak je menej odolne voci fyzickemu poskodeniu.

2. Potahame si
LoopAes aj AESpipe z http://loop-aes.sourceforge.net/ ,
linux-utils z ftp://ftp.kernel.org/pub/linux/utils/util-linux/ ,
gpg z ftp://ftp.gnupg.org/gcrypt/gnupg/ ,
syslinux bootloader http://www.kernel.org/pub/linux/utils/boot/syslinux/ ,
dietlibc ftp://ftp.kernel.org/pub/linux/libs/dietlibc/

3. Spravime si loop.ko
Budeme si musiet prekompilovat kernel, potrebujeme nasledujuce (pripadne) zmeny v .config subore kernelu:
CONFIG_MODULES=y
CONFIG_BLK_DEV_LOOP=n  (nahradime ho vlastnym, s podporou sifrovania)
CONFIG_KMOD=y   (odporucane)

CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096
CONFIG_BLK_DEV_INITRD=y 
CONFIG_MINIX_FS=y
CONFIG_PROC_FS=y 
CONFIG_CRAMFS=n (alebo CONFIG_CRAMFS=m)

(a ak chceme bootovat z usb, tak aj nasledujuce:
CONFIG_BLK_DEV_RAM=y
CONFIG_BLK_DEV_RAM_SIZE=4096 
CONFIG_BLK_DEV_INITRD=y 
CONFIG_MINIX_FS=y
CONFIG_PROC_FS=y 
CONFIG_CRAMFS=n (alebo CONFIG_CRAMFS=m) 
CONFIG_SCSI=y
CONFIG_BLK_DEV_SD=y 
CONFIG_USB=y 
CONFIG_USB_STORAGE=y 
CONFIG_FAT_FS=y
CONFIG_MSDOS_FS=y 
CONFIG_VFAT_FS=y

Podla toho ake usb zariadenie mame, tak aj jednu z tychto (alebo viac, ale pozor, po uspesnom rozbehani som este nieco prerabal, a zapol vsetky z nich, vysledkom coho bolo, ze po natiahnuti ramdisku sa usb detekovalo najprv nespravnymi drivermi, dosledkom coho bolo niekolko(>10) sekudnove meskanie, a nasledne nenajdenie filesystemu a kernel panic;), takze menej je niekedy viac.

CONFIG_USB_UHCI=y (alebo CONFIG_USB_UHCI_HCD=y)
CONFIG_USB_OHCI=y (alebo CONFIG_USB_OHCI_HCD=y) 
CONFIG_USB_EHCI_HCD=y
)

A este pre fat fs:
CONFIG_NLS_CODEPAGE_437=y
CONFIG_NLS_CODEPAGE_850=y 
CONFIG_NLS_ISO8859_1=y 
CONFIG_NLS_ISO8859_15=y
CONFIG_FAT_DEFAULT_CODEPAGE=850
CONFIG_FAT_DEFAULT_IOCHARSET=iso8859-15

Vsetky ostatne casti kernelu by mali byt priamo v nom, nemali by to byt moduly. Ak to budu moduly, budete ich musiet rucne neskor pridavat na usb. Teraz prekompilujeme kernel, potom si spravime samotny loop.ko (z stiahnuteho loop-AES balicka)
    make clean 
    make LINUX_SOURCE=/usr/src/linux-naskernel
Makekefile skusi automaticky najst nase kernel zdrojaky, ale radsej mu cestu zadame priamo. Mali by sme ziskat loop.ko, ak sa vyskytnu akekolvek problemy, alebo potrebujete nastavit nieco specificke, loopAES je velmi dobre zdokumentovany, vratane prikladov.

4. Spravime si nove mount,umount,losetup utility
(pripadne aj swapon a swapoff, kedze vsak swap nepouzivam, nerobil som ich) Pouzijeme na to stiahnute linux-utils, rozhodne ich NEINSTALUJEME cele, mohli (a pravdepodobne by sme aj) si znicit cely system. Stacia nam tieto:
    CFLAGS=-O2 ./configure
    make SUBDIRS="lib mount"
    cd mount
    install -m 4755 -o root mount umount /bin
 
    rm -f /usr/share/man/man8/{mount,umount,losetup}.8.gz
    install -m 644 mount.8 umount.8 losetup.8 /usr/share/man/man8
    rm -f /usr/share/man/man5/fstab.5.gz
    install -m 644 fstab.5 /usr/share/man/man5
    mandb

5. Spravime si (nove) gpg
Nase gpg bude 128-krat pomalsie, cim sa pokusime zvysit odolnost voci slovnikovym utokom, nas to pri bootovani kde su omnoho va:csie zdrzania takmer vobec neovplyvni. Kedze si ideme zasifrovat root particiu, gpg zlinkujeme staticky, aby sme ho mohli dat na usb kluc.
    cd gnupg-1.4.1
    patch -p1 <../gnupg-1.4.1.diff
    CFLAGS="-O2" 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/gp

6. Prvy test
Vlezieme do loopaes adresara, a skusime make tests. Ak vsetko prebehlo v poriadku, ficime dalej. Ak nie, tak pekne spa:t, a hladat chybu;)

7. Usb
Najprv si zistime ako sa da na nasej doske bootovat z usb-device, ono su asi 3 navzajom nekompatibilne standardy, ale s casom sa situacia zlepsuje. Napr. na mojej doske sa moznost bootovat z usb objavila v biose iba vtedy, ak v momente stratu pocitaca bol usb kluc zasunuty v slote. Co viedlo autorov mojej dosky k tomuto pocinu si nedovolim odhadnut, ale mna to par hodinami hladania a skusania obdarilo. Usb kluc si budeme musiet naformatovat fat16 filesystemom, pouzivat potom mozme iba kratke MSDOS mena, co je pomerne nestastne obmedzenie syslinuxu.

8. dietlibc
Dietlibc potrebujeme pre build-initrd.sh skript. Standarne na x86 bude instalacia vyzerat takto:
	make
        install bin-i386/diet /usr/local/bin

9. Aespipe (2.3a alebo novsi)
Skompilujeme ho staticky: (warningy o getpwuid mozme s prehladom ignorovat)
    CFLAGS="-O2" LDFLAGS="-static -s" ./configure
    make
    make tests
Potom skopirujeme nas vzniknuty aespipe do boot particie (z ktorej neskor urobime usb-kluc bootovatelny)

10. Vsetko (dolezite) si ZAZALOHUJEME!
Samotny proces sifrovania bude prebiehat na disku postupne cez pipe, a ak nam to spadne(chyba, elektrina ,hocico) v strede, ostane nam cast dat zasifrovana, a cast nezasifrovana, a davat to do kopy potom by som naozaj nechcel.

11. Skopirujeme si nas loop.ko
(ktory sme si uz vytvorili) do /2boot/modules-KERNELRELEASE/
	mkdir /2boot/modules-2.6 nieco
                            ^^^^^^^^^
	cp -p /lib/modules/2.6.nieco/block/loop.ko /2boot/modules-2.6.nieco/
Tento krok budeme musiet opakovat pri kazdej zmene kernelu.

12. Niektore distribucie zvyknu
robit pri starte veci ako "umount /initrd" a "blockdev --flushbufs /dev/ram0", co sa nam kedze loop root particie je v initrd, nepaci, a teda ich zrusime.

13. Nahodne kluce
Vytvorime 65 nahodnych sifrovacich klucov, a zasifrujeme ich pomocou gpg. Generovanie z /dev/random moze trvat nekonecne dlho, ak nema kernel dost "nahodnych" podnetov, a preto ak nebude chciet skoncit, pomaha nahodne hybanie mysou, a pisanie na klavesnici (prip. nahodne citanie suborov na disku).
    umask 077
    head -c 2925 /dev/random | uuencode -m - | head -n 66 | tail -n 65 \
	  | gpg --symmetric -a >/2boot/rootkey.gpg

14. initrd.conf
Obsah /2boot/initrd.conf :
    BOOTDEV=/dev/sda            # partitionless USB-stick device
    BOOTTYPE=vfat
    CRYPTROOT=/dev/hda2
    ROOTTYPE=ext2
    CIPHERTYPE=AES128
    LOADNATIONALKEYB=1
    INITIALDELAY=3
Ak mate zapnute v kerneli devfs, musite este odkomentovat nasledovne:
(v initrd.conf)
 USEDEVFS
 BOOTDEV
 CRYPTROOT 
 EXTERNALGPGDEV

15. Klavesnica
Ak pouzivat narodnu klavesnicu:
    dumpkeys >/2boot/default.kmap

16. syslinux.cfg
Obsah /2boot/syslinux.cfg :
    default linux
    timeout 100
    prompt 1
    label linux
    kernel vmlinuz
    append initrd=initrd.gz root=100 init=/linuxrc rootfstype=minix

17. Vytvorime novy initrd.gz
  ./build-initrd.sh /2boot/initrd.conf

18. Pripravime USB
Uistime sa ze nie je namontovany,
    umount /dev/sda1 (b)
    umount /dev/sda  (b) 
vymazeme prych 5 MB z USB-kluca (MBR, a partition table, a zaciatok systemu),
    dd if=/dev/zero of=/dev/sda bs=1024k count=5 conv=notrunc
spravime tam FAT16 filesystem (s FAT32 by nam syslinux nefical),
    mkfs -t vfat -I /dev/sda
skopirujeme vsetko z /2boot na nas USB kluc,
    mount -t vfat /dev/sda /mnt
    cp -pR /2boot/* /mnt
    umount /mnt
a nainstalovanim syslinuxu spravime kluc bootovatelny (starsie windowsy mozu mat problem s najdenim usb-kluc bez particii)
	syslinux /dev/sda
	sync
Tym mame USB kluc pripraveny.

19. Restartneme pocitac,
ale nabootojeme pocitac z instalacneho CD, zachrannej diskety, alebo niecoho podobneho, aby nebolo namontovana particia ktoru ideme sifrovat.

20. Posledne upravy
(pre dalsi postup nasa byvala root particia je /dev/hda2 (napriklad)) Teraz, ked sme v shelli nabootovanom z instal. CD/whatever, namontojeme particiou ktoru hceme sifrovat do docasneho adresara, tj. napriklad:
    mount -t ext2 /dev/hda2 /mnt 
Este zmenime /mnt/etc/fstab , a povodne /dev/hda2 nahradime
  Stary riadok z /etc/fstab:
      /dev/hda2    /       ext2   defaults   0   1
  Novy riadok z /etc/fstab:
      /dev/loop5   /       ext2   defaults   0   1
	(loop5 je default, ak ste ho v buil-initrd.sh zmenili,
	zmente ho aj tu. Ak pouzivate devfs, pisete /dev/loop/5 )
Odmontime, vyprazdnime cache (pre istotu):
    umount /mnt
    sync
21. Teraz namontujeme nas uz pripraveny usb kluc...
    mount -t fat16 /dev/sda (napriklad;) /mnt
22. Pomocou dd-cka budeme citat nase data,
prezenieme ich cez aespipe ktora ich zasifruje a budeme za sebou hned aj zapisovat. Kedze v pripade akehokolvek zlyhania budu nase data "zcasti" zasifrovane, a ani besna svina to uz neda tak lahko dokopy, je nevyhnutne (alebo to mozte ponat ako adrenalinovy sport;) data predtym zalohovat.
   dd if=/dev/hda2 bs=64k \
      | /mnt/aespipe -e AES128 -K /mnt/rootkey.gpg -G / \
      | dd of=/dev/hda2 bs=64k conv=notrunc
aespipe aj gpg su nase staticky nalinkovane verzie, ktore bezia z naseho usb klua. Chvilku to potrva.

23. Upraceme po sebe
    umount /mnt
    sync
    reboot
24. Okamih pravdy
Ak sa vsetko podarilo, mali by sme po nabootovani z usb kluca automaticky namontovaj aj zasifrovanu particiu, a navyse vsetko fungovat ako predtym. Ak nie...prinajhorsom mame zalohu, ze?;)

25. Zdroje
http://loop-aes.sourceforge.net/
http://www.google.com