Můj malý svět

Obrať obličej k slunci
a stíny budou padat za tebe

Šifrování disku je základ

Už více než před rokem jsem začal disk ve svém počítači šifrovat a nemůžu si to vynachválit. Počítal jsem s problémy, ale kromě těch počátečních vlastně ani žádné nejsou. Dokonce ani výkonnostní, co by člověk mohl postřehnout.

Samotný postup je docela jednoduchý. Dopředu uvádím, že jsem šifrování dělal pro Gentoo Linux, a to na celém disku – někteří si nechávají nešifrovaný alespoň oddíl /boot, ale já nechtěl vystavovat MBR nebo tabulku oddílů, protože pak je zřejmé, že na tom disku něco je, jen se k tomu nikdo nemůže bez hesla dostat. Já zvolil cestu externího bootovacího média, bez kterého nikdo nepozná, že na disku vlastně něco je (byť podezření asi pojme).

Než se začne disk používat, obvykle se zaplní náhodnými daty. Jsou v zásadě dvě možnosti, kdy to lze provést: před šifrováním a po šifrování. Já šel první cestou, ale druhá se mi jeví jako výhodnější, protože není třeba náhodných dat – stačí nulová data –, takže je proces rychlejší (šifrování zajistí, že z vnějšku se tato data budou jako náhodná jevit).

První možnost – před šifrováním:

# dd if=/dev/urandom of=/dev/sda

U mě byla průměrná rychlost 2,3 MB/s, takže celý disk trvalo zaplnit hodně dlouho (řádově desítky hodin). I proto bych podruhé zvolil raději následující zaplnění až po zašifrování disku:

# dd if=/dev/zero of=/dev/sda

Tady rychlost bude záležet na dvou faktorech (resp. na tom slabším z nich) – na rychlosti šifrování procesorem a na rychlosti zapisování zašifrovaných nul na disk.

Pro samotné zašifrování je potřeba si zvolit šifru a její parametry, nicméně to tu rozebírat nebudu, spíše odkáži na další užitečné zdroje, vypsané na konci článku.

Já zvolil méně běžný Twofish. Hardwarovou akceleraci AES stejně nemám, tak proč volit pro útočníka pohodlnější cestu. Řekl jsem si, že mi to za potenciální snížení výkonu stojí. V praxi ale žádné nepociťuji, takže jsem se svou volbou spokojený.

Zaprvé se musí zavést potřebné moduly (místo twofish_i586 bude na amd64 zřejmě twofish_x86_64), pokud nejsou přímo v jádru:

# modprobe dm-mod
# modprobe twofish_i586
# modprobe xts
# modprobe sha512

A zadruhé provést samotné zašifrování:

# cryptsetup -c twofish-xts-plain -s 512 -y -h sha512 luksFormat /dev/sda

Pak již stačí jen nový disk otevřít, rozdělit (není od věci sáhnout po LVM), vytvořit souborové systémy a nainstalovat systém:

# cryptsetup luksOpen /dev/sda encdisk
...
# mount /dev/lvm0/root /mnt/gentoo

Co je potřeba, je vytvoření bootovatelného externího média. Kromě toho, že je na něj potřeba nahrát bootloader (třeba GRUB či něco odlehčenějšího, například extlinux) a jádro, klíčový je initramdisk, který zajistí odemčení disku při bootu. Osobně jsem s ním docela zápasil, takže se podělím i o /init skript (dopředu říkám, že jsem se nesnažil o žádné mistrovské dílo, jen o co nejmenší skript, který by dělal, co jsem potřeboval, což se mi, myslím, i podařilo):

#!/bin/busybox sh

# Mount the /proc and /sys filesystems
mount -t proc none /proc
mount -t sysfs none /sys

# Create /dev nodes
echo /sbin/mdev > /proc/sys/kernel/hotplug
mdev -s

# dm-crypt
cryptsetup luksOpen /dev/sda encdisk

# Create LVM root node
lvm vgscan --mknodes
lvm lvchange -aly lvm0/root

# Mount the root filesystem
mount -t ext4 -o ro /dev/lvm0/root /mnt/root

# Clean up
umount /proc
umount /sys

# Boot the real thing
exec switch_root /mnt/root /sbin/init

Do adresářové struktury pak nakopírovat všechny potřebné binárky, případně i knihovny, na kterých závisí. V /dev stačí mít zařízení console, null a tty. Výsledek se jednoduše zabalí:

# find . -print0 | cpio -ov -0 --format=newc | gzip -9 > initramfs

A zbytek už jistě zvládne každý. :-)

Na konec uvádím užitečné zdroje:

Seriál Diskové šifrování pomocí dm-crypt/LUKS:

  1. https://www.root.cz/clanky/proc-a-jak-na-sifrovani-disku-v-linuxu/
  2. https://www.root.cz/clanky/jak-vytvorit-sifrovany-oddil-v-linuxu/
  3. https://www.root.cz/clanky/sprava-sifrovanych-oddilu-v-linuxu/

https://blog.root.cz/jenda/sifrovani-v-archu/
https://www.abclinuxu.cz/blog/m4r3k/2007/8/zadelavame-si-na-problemy-aneb-sifrujeme-root-oddil

https://wiki.archlinux.org/index.php/LUKS_Encrypted_Root
https://wiki.archlinux.org/index.php/LVM

https://en.wikipedia.org/wiki/Comparison_of_disk_encryption_software

A neodpustím si ještě poznámku, že poškození disku se v podstatě rovná ztrátě dat s mnohem nižší šancí na záchranu (pokud vůbec nějakou), takže zálohování je nutnost (podotýkám, že také šifrované, jinak byla celá snaha zbytečná ;-)). Od věci pak nemusí být zálohování LUKS hlavičky (pozor na to, že při změně hesla je nutné zničit staré zálohy):

# cryptsetup luksHeaderBackup /dev/sda --header-backup-file luksheader.backup

Zaškatulkováno v kategorii: GNU/Linux | 21. dubna 2012

Komentáře

Jak přidat komentář? E-mailem! :c) Na komentare -zavináč- mujmalysvet -tečka- cz – do předmětu „Komentář:“ + název zápisku (tj. „Komentář: Šifrování disku je základ“), případně připojte i svou přezdívku a domovskou stránku.