Titkosított root fájlrendszer HOGYAN Christophe Devine Ez a dokumentum leírja, hogyan helyezzük biztonságba adatainkat a Linux root fájlrendszer erős titkosítási algoritmust használó titkosításával. Ez a HOGYAN a GNU Free Documentation License 1.2. alatt lett kiadva. v1.1 2003.12.01 cd GRUB támogatás hozzáadva. v1.0 2003.09.24 cd Első kiadás, az LDP által ellenőrizve. v0.9 2003.09.11 cd Frissítve, DocBook XML formátumba konvertálva. A rendszer előkészítése A partíciók kialakítása A lemezünk (hda) legalább három partíciót tartalmazzon: hda1: ez a kicsi (~4 Mb), nem titkosított partíció fogja kérni a jelszavunkat a titkosított root fájlrendszer felcsatolásához. hda2: ez a partíció tartalmazza a titkosított root fájlrendszert; legyen megfelelően nagy. hda3: ez a partíció tartalmazza az aktuális GNU/Linux rendszert. Ekkor még a hda1 és a hda2 partíciók nincsenek használatban. A hda3 partíció tartalmazza az aktuálisan telepített Linux terjesztést; az /usr és a /boot nem lehet ettől a partíciótól elkülönítve. A Linux-2.4.23 rendszermag telepítése Két nagyobb projekt létezik, ami erős titkosítási támogatást ad a rendszermaghoz: a CryptoAPI és a loop-AES. Ez a HOGYAN a loop-AES projekten alapul, mivel ez egy assembly nyelven írt, nagyon gyors és optimalizált implementáció, így maximális teljesítményt nyújt az IA-32 (x86) alapú processzorok számára. Készítője Rijndael. Mindenek előtt töltsük le, majd csomagoljuk ki a loop-AES csomagot: wget http://loop-aes.sourceforge.net/loop-AES/loop-AES-v2.0b.tar.bz2 tar -xvjf loop-AES-v2.0b.tar.bz2 Ezután töltsük le a rendszermag forrását, majd alkalmazzuk a foltot: wget http://ftp.kernel.org/pub/linux/kernel/v2.4/linux-2.4.23.tar.bz2 tar -xvjf linux-2.4.23.tar.bz2 cd linux-2.4.23 patch -Np1 -i ../loop-AES-v2.0b/kernel-2.4.23.diff Állítsuk be a billentyűzet kiosztását: dumpkeys | loadkeys -m - > drivers/char/defkeymap.c A következő lépésben beállítjuk a rendszermagot; a következő lehetőségek mindenképp legyenek beállítva: make menuconfig Block devices ---> <*> Loopback device support [*] AES encrypted loop device support (NEW) <*> RAM disk support (4096) Default RAM disk size (NEW) [*] Initial RAM disk (initrd) support File systems ---> <*> Ext3 journalling file system support <*> Second extended fs support (fontos: ne legyen beállítva a /dev file system support lehetőség) Fordítsuk le és telepítsük a rendszermagot: make dep bzImage make modules modules_install cp arch/i386/boot/bzImage /boot/vmlinuz-2.4.23 Ha a grub rendszerbetöltőt használjuk, szerkesszük a /boot/grub/menu.lst illetve /boot/grub/grub.conf fájlt: cat > /boot/grub/menu.lst << EOF default 0 timeout 10 color green/black light-green/black title Linux root (hd0,2) kernel /boot/vmlinuz-2.4.23 ro root=/dev/hda3 vga=4 EOF Ha viszont lilo-t használunk, akkor szerkesszük az /etc/lilo.conf fájlt, és futtassuk a lilo-t: cat > /etc/lilo.conf << EOF lba32 boot=/dev/hda prompt timeout=100 image=/boot/vmlinuz-2.4.23 label=Linux read-only root=/dev/hda3 vga=4 EOF lilo Indítsuk újra a rendszert. Az util-linux-2.12 telepítése A losetup programon - amely az util-linux csomag része - alkalmaznunk kell a foltot, és újra kell fordítanunk az erős titkosítás támogatásához. Töltsük le és csomagoljuk ki az util-linux csomagot, majd alkalmazzuk a foltot: wget http://ftp.cwi.nl/aeb/util-linux/util-linux-2.12.tar.gz tar -xvzf util-linux-2.12.tar.gz cd util-linux-2.12 patch -Np1 -i ../loop-AES-v2.0b/util-linux-2.12.diff 20 karakternél rövidebb jelszó használata esetén írjuk be: CFLAGS="-O2 -DLOOP_PASSWORD_MIN_LENGTH=8"; export CFLAGS Ha fontos kérdés a biztonság, ne használjuk ezt a lehetőséget. A biztonságnak megvan az ára, jelen esetben ez a hosszú jelszó használata. Fordítsuk le a losetup-ot, majd root felhasználóként telepítsük azt: ./configure && make lib mount cp -f mount/losetup /sbin rm -f /usr/share/man/man8/losetup.8.gz cp -f mount/losetup.8 /usr/share/man/man8 A titkosított root fájlrendszer létrehozása A célpartíció feltöltése véletlenszerű adattal: shred -n 1 -v /dev/hda2 A titkosított loopback eszköz beállítása: losetup -e aes256 -S xxxxxxxxxx /dev/loop0 /dev/hda2 Password: A szótárral optimalizált támadások kivédése érdekében ajánlott a -S xxxxxxxxxx opció használata, ahol "xxxxxxxxxx" a véletlenszerűen kiválasztott álvéletlen sorozat kiindulóérték (random seed). Ezen kívül a rendszerindításkor esetleg fellépő billentyűzetkiosztási hibák megelőzése érdekében ne használjunk nem-ASCII karaktereket (ékezeteket stb.) a jelszóban. Hozzuk létre az ext3 fájlrendszert: mke2fs -j /dev/loop0 Ellenőrizzük, hogy helyesen írtuk be a jelszót: losetup -d /dev/loop0 losetup -e aes256 -S xxxxxxxxxx /dev/loop0 /dev/hda2 Password: mkdir /mnt/efs mount /dev/loop0 /mnt/efs Összehasonlíthatjuk a titkosított és az eredeti adatokat: xxd /dev/hda2 | less xxd /dev/loop0 | less Itt az ideje, hogy telepítsük a titkosított Linux fájlrendszert. Ha egy GNU/Linux terjesztést használunk (például Debian-t, Slackware-t, Gentoo-t, Mandrake-et, RedHat/Fedora-t, SuSE-t stb.), futtassuk a következő parancsot: cp -avx / /mnt/efs Ha a Linux From Scratch könyvet használjuk, az alábbi eltéréseket kivéve a dokumentum szerint folytathatjuk a munkát: 6. fejezet - Az util-linux telepítése: Alkalmazzuk a loop-AES foltot a forrás kicsomagolása után. 8. fejezet - Az LFS rendszer indíthatóvá tétele: Szorítkozzunk a következő fejezetre. A boot eszköz beállítása A virtuális fájlrendszer (ramdisk) létrehozása Első lépésként chroot-oljunk a titkosított partícióra, és hozzuk létre a boot eszközhöz a felcsatolási pontot: chroot /mnt/efs mkdir /loader Ezután hozzuk létre a virtuális rendszerindító fájlrendszert (initial ramdisk, initrd), amelyre később szükségünk lesz: cd dd if=/dev/zero of=initrd bs=1k count=4096 mke2fs -F initrd mkdir ramdisk mount -o loop initrd ramdisk Hozzuk létre a fájlrendszer könyvtárszerkezetét, és másoljuk be a szükséges fájlokat: mkdir ramdisk/{bin,dev,lib,mnt,sbin} cp /bin/{bash,mount,umount} ramdisk/bin/ ln -s bash ramdisk/bin/sh mknod -m 600 ramdisk/dev/console c 5 1 mknod -m 600 ramdisk/dev/hda2 b 3 2 mknod -m 600 ramdisk/dev/loop0 b 7 0 cp /lib/{ld-linux.so.2,libc.so.6,libdl.so.2} ramdisk/lib/ cp /lib/{libncurses.so.5,libtermcap.so.2} ramdisk/lib/ cp /sbin/{losetup,pivot_root} ramdisk/sbin/ Ha a következő vagy hasonló hibaüzenetet kapjuk, az nem jelent problémát: "/lib/libncurses.so.5: No such file or directory", vagy "/lib/libtermcap.so.2: No such file or directory"; a bash-nek csak ezen programkönyvtárak egyike szükséges. Megtudhatjuk azt, hogy esetünkben melyik szükséges: ldd /bin/bash Hozzuk létre a rendszerindító (init) szkriptet (ne felejtsük a "xxxxxxxxxx" helyére beírni a kiválasztott álvéletlen sorozat kiindulóértéket (random seed)): cat > ramdisk/sbin/init << "EOF" #!/bin/sh /sbin/losetup -e aes256 -S xxxxxxxxxx /dev/loop0 /dev/hda2 /bin/mount -r -n -t ext2 /dev/loop0 /mnt while [ $? -ne 0 ] do /sbin/losetup -d /dev/loop0 /sbin/losetup -e aes256 -S xxxxxxxxxx /dev/loop0 /dev/hda2 /bin/mount -r -n -t ext2 /dev/loop0 /mnt done cd /mnt /sbin/pivot_root . loader exec /usr/sbin/chroot . /sbin/init EOF chmod 755 ramdisk/sbin/init Csatoljuk le a loopback eszközt, és tömörítsük be a virtuális rendszerindító fájlrendszert: umount -d ramdisk rmdir ramdisk gzip initrd mv initrd.gz /boot/ Rendszerindítás CD-ROM-ról Erősen ajánlott a rendszert egy írásvédett eszközről indítani, például egy indítható CD-ROM-ról. Töltsük le, majd csomagoljuk ki a syslinux csomagot: wget ftp://ftp.kernel.org/pub/linux/utils/boot/syslinux/syslinux-2.07.tar.gz tar -xvzf syslinux-2.07.tar.gz Állítsuk be az isolinux-ot: mkdir bootcd cp /boot/vmlinuz-2.4.23 bootcd/vmlinuz cp /boot/initrd.gz syslinux-2.07/isolinux.bin bootcd/ echo "DEFAULT vmlinuz initrd=initrd.gz ro root=/dev/ram0 vga=4" \ > bootcd/isolinux.cfg Hozzuk létre az indítható cd-képet (cd image), és írjuk ki egy írható cd-re: mkisofs -o bootcd.iso -b isolinux.bin -c boot.cat \ -no-emul-boot -boot-load-size 4 -boot-info-table \ -J -hide-rr-moved -R bootcd/ cdrecord -dev 0,0,0 -speed 4 -v bootcd.iso rm -rf bootcd{,.iso} Rendszerindítás fizikai partícióról A boot partíció egy alternatív rendszerindító eszköz: szükség lehet rá, ha az indítható CD elvész. Vegyük figyelembe, hogy a hda1 egy írható eszköz, ezért nem biztonságos; csak szükség esetén használjuk! Hozzuk létre és csatoljuk fel az ext2 fájlrendszert: dd if=/dev/zero of=/dev/hda1 bs=8192 mke2fs /dev/hda1 mount /dev/hda1 /loader Másoljuk át a rendszermagot és a virtuális rendszerindító fájlrendszert: cp /boot/vmlinuz-2.4.23 /loader/vmlinuz cp /boot/initrd.gz /loader/ Ha grub-ot használunk: mkdir /loader/boot cp -av /boot/grub /loader/boot/ cat > /loader/boot/grub/menu.lst << EOF default 0 timeout 10 color green/black light-green/black title Linux root (hd0,0) kernel /vmlinuz ro root=/dev/ram0 vga=4 initrd /initrd.gz EOF grub-install --root-directory=/loader /dev/hda umount /loader Ha lilo-t használunk: mkdir /loader/{boot,dev,etc} cp /boot/boot.b /loader/boot/ mknod -m 600 /loader/dev/hda b 3 0 mknod -m 600 /loader/dev/hda1 b 3 1 mknod -m 600 /loader/dev/ram0 b 1 0 cat > /loader/etc/lilo.conf << EOF lba32 boot=/dev/hda prompt timeout=100 image=/vmlinuz label=Linux initrd=/initrd.gz read-only root=/dev/ram0 vga=4 EOF lilo -r /loader umount /loader Utolsó lépések Módosítsuk az /etc/fstab fájlt úgy, hogy tartalmazza a következő sort: /dev/loop0 / ext3 defaults 0 1 Töröljük az /etc/mtab fájlt, és lépjünk ki a chroot-ból. Legvégül futtassuk a "umount -d /mnt/efs" parancsot, majd indítsuk újra a rendszert. A hda3-ra már nincs szükség, létrehozhatunk egy titkosított fájlrendszert ezen a partíción, és használhatjuk biztonsági mentésként. Ha kevés a fizikai memóriánk, szükség lesz swap területre. Tételezzük fel, hogy a hda4 fogja tartalmazni a titkosított swap partíciót; először létre kell hozni a swap eszközt: shred -n 1 -v /dev/hda4 losetup -e aes256 /dev/loop1 /dev/hda4 mkswap /dev/loop1 Majd hozzunk létre egy indítószkriptet (S00swap) a rendszer indítókönyvtárában (/etc/rcS.d/ Debian esetén): #!/bin/sh echo "az előzőleg kiválasztott jelszó" | \ losetup -p 0 -e aes256 /dev/loop1 /dev/hda4 swapon /dev/loop1 A HOGYANról A Titkosított root fájlrendszer HOGYAN 2002 novemberében készült el a Linux From Scratch projekt részére. Köszönet mindazoknak, akik azóta segítettek a HOGYAN tökéletesítésében (fordított időrendben): Julien Perrot, Grant Stephenson, Cary W. Gilmer, James Howells, Pedro Baez, Josh Purinton, Jari Ruusu és Zibeli Aton. A hozzászólásokat Christophe Devine várja. Magyar fordítás A magyar fordítást Vadon Péter készítette (2004.06.15). A lektorálást Daczi László végezte el (2004.06.24). A dokumentum legfrissebb változata megtalálható a Magyar Linux Dokumentációs Projekt honlapján.