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