Szyfrowany Arch Linux z LVM na LUKS

03 wrzesień 2013

Przy okazji kupna laptopa przyjrzałem się tematowi szyfrowania partycji pod Linuksem. Jedynym sensownym rozwiązaniem jest użycie LUKS, chociażby dlatego, że wspierany jest przez zdecydowaną większość dystrybucji, nie wyłączając z tej listy Archa. Niestety wszystkie znalezione przeze mnie poradniki (dokumentacja? pff) nie były tak przejrzyste, żebym uznał szyfrowaną instalację za łatwy proces. W praktyce okazało się zupełnie odwrotnie.

Na dobry początek należy utworzyć nieszyfrowane /boot (w dalszej części oznaczone jako /dev/sda1), które nie powinno potrzebować więcej niż 64MB oraz drugą partycję zajmująca pozostałe miejsce, która zostanie zaszyfrowana (/dev/sda2).

Po utworzeniu partycji można zająć się zaszyfrowaniem /dev/sda2.

cryptsetup -c aes-xts-plain64 -s 512 -h sha512 -i 5000 -y luksFormat /dev/sda2
  • -c określa metodę szyfrowania. Poza większym stopniem złożoności w porównaniu do domyślnego aes-cbc-essiv:sha256, zaproponowana metoda może obsłużyć przestrzeń większą niż 2TB.
  • -s ustawia wielkość klucza. Domyślna wartość to 256, ale ze względu na wybraną metodę szyfrowania należy ją podwoić.
  • -h odpowiada za użytą funkcję hashującą. SHA512 jest zdecydowanie bezpieczniejsze od domyślnego SHA1…
  • -i określa czas (w milisekundach) poświęcony na przetworzenie hasła. Domyślne ustawienie to 1 sekunda – na pewno sensowne dla domyślnej funkcji hashującej.
  • dzięki -y cryptsetup dwukrotnie zapyta o hasło.
  • Natomiast polecenie cryptsetup luksOpen /dev/sda2 crypt sprawi, że zaszyfrowana partycja będzie dostępna jako /dev/mapper/crypt. Dzięki LVM możemy ją podzielić na partycję systemową i domową, a w razie potrzeby – swap.

    pvcreate /dev/mapper/crypt
    vgcreate hdd /dev/mapper/crypt
    lvcreate -L 10GB -n root hdd
    lvcreate -L 1GB -n swap hdd
    lvcreate -l 100%FREE -n home hdd
    

    Za pomocą lvs można upewnić się czy wszystkie ustawienia są poprawne. Jeżeli nie są, za pomocą lvremove można usunąć błędy wolumin. Po sformatowaniu i zamontowaniu partycji (/dev/sda1 i /dev/mapper/hdd-*) można przystąpić do instalacji systemu.

    Po użyciu arch-chroot należy dostosować konfigurację mkinitcpio.

    % grep ^HOOKS /etc/mkinitcpio.conf
    HOOKS="base udev autodetect modconf block keymap encrypt lvm2 filesystems keyboard"
    

    Względem domyślnych ustawień, dodane elementy to keymap (odpowiada za mapę klawiszy, font i kodowanie, pobrane z /etc/vconsole.conf), encrypt dzięki któremu initramfs zapyta o hasło do partycji systemowej oraz lvm2. Po zapisaniu zmian można wykonać mkinitcpio -p linux.

    Ostatnim zadaniem jest poprawienie konfiguracji bootloadera. Mój wpis w gummiboot wygląda następująco:

    title   Arch Linux
    linux   /vmlinuz-linux
    initrd  /initramfs-linux.img
    options cryptdevice=/dev/sda2:hdd root=/dev/mapper/hdd-root rw
    

    Kolejność przekazania parametrów do kernela nie ma najmniejszego znaczenia. cryptdevice=urządzenie:nazwa wskazuje systemowi zaszyfrowaną partycję – po podaniu hasła będzie dostępna jako /dev/mapper/nazwa. Oczywiście root wskazuje właściwą partycję z Archem.

    Po restarcie initramfs powinien spytać się o hasło do partycji systemowej.