_____ _   _ _    _    ___      _
 / ____| \ | | |  | |  / / |    (_)
| |  __|  \| | |  | | / /| |     _ _ __  _   ___  __
| | |_ | . ` | |  | |/ / | |    | | '_ \| | | \ \/ /
| |__| | |\  | |__| / /  | |____| | | | | |_| |>  <
 \_____|_| \_|\____/_/   |______|_|_| |_|\__,_/_/\_\

Szyfrowany rootfs na greenOS

Jeśli naszym głównym komputerem, z którego korzystamy na codzień jest laptop, to zapewne dla własnej wygody mamy na nim wiele cennych danych, których być może zniszczenie niebyło by aż tak bolesne jak dostanie się tych informacji w niepowłone ręce. Temu właśnie ma służyć szyfrowanie dysków. W tym przypadku będziemy szyfrować partycję zawierającą główny system plików z wyłączeniem katalogu /boot. Z racji tego iż greenOS nie korzysta z klasycznego debianowskiego programu debian-installer i instaluje się go ręcznie tak samo jak Arch Linux. To instalacje z szyfrowaniem partycji z głównego katalogu również musimy wykonać z ręki. Instalacje rozpoczynamy od uruchomienia komputera z LiveCD. Możebyć to dowolny Debian lub greenOS.

  1. Aktualizacja list pakietów dystrybucji.
    # apt update
    
  2. Instalacja pakietu cryptsetup w środowisku LiveCD
    # apt install cryptsetup
    
  3. Partycjonowanie dysku. Tutaj jest to raczej sprawa indywidualna, ale najbardziej klasyczny schemat partycjonowania została przestawiowy w tabelce poniżej. Do partycjonowania dysku może służyć wbudowane polecenie fdisk:

    # fdisk /dev/sda
    
    Urządzenie Rozmiar Punkt montowania
    /dev/sda1 300M /boot
    /dev/sda2 -1G /
    /dev/sda5 1G swap
  4. Tworzymy system plików dla partycji przeznaczonej na katalog /boot.

    # mkfs.ext4 /dev/sda1
    
  5. Tworzymy szyfrowany wolumin na partycji przeznaczonej na główny system plików. Program poprosi o potwierdzenie działania poprzez wpisane DUŻYMI literami słowa: YES. Następnie poprosi o podanie klucza (hasła) do odszyfrowania woluminu.

    # cryptsetup -y -v luksFormat /dev/sda2
    
  6. Otwieramy szyfrowany wolumin. Program zapyta o klucz.

    # cryptsetup open /dev/sda2 cryptroot
    

    Ostatni argument jest nazwą, pod którą będzie odwoływać się do odszyfrowanego woluminu. Mapowanie (nazwa) znajduje się w katalogu /dev/mapper.

  7. Tworzymy system plików na odszyfrowanym woluminie.

    # mkfs.ext4 /dev/mapper/cryptroot
    
  8. Montujemy system plików woluminu w katalogu /mnt.

    # mount /dev/mapper/cryptroot /mnt
    
  9. Tworzymy katalog /mnt/boot, dla oddzielnej partycji /boot.

    # mkdir /mnt/boot
    
  10. Montujemy partycje przeznaczoną na katalog /boot we wcześniej utworzonym katalogu.

    # mount /dev/sda1 /mnt/boot
    
  11. Przechodzimy do katalogu /mnt i pobieramy paczkę z plikami bazowymi dystrybucji.

    # cd /mnt
    # wget http://ftp.morketsmerke.net/greenOS/rootfs.tgz
    
  12. Rozpakowujemy pliki bazowe.

    # tar -xzvf rootfs.tgz 
    
  13. Tworzymy system plików dla partycji ze swap-em.

    # cd
    # mkswap /dev/sda5
    
  14. Przekierowujemy wyjście polecenia blkid do pliku /mnt/etc/fstab. Musimy wyedytować zawartość tego pliku, aby wyglądał mniej więcej tak:

    # blkid > /mnt/etc/fstab
    # vim /mnt/etc/fstab
    
    UUID="..."  /boot ext4  defaults  0 2
    UUID="..."  none  swap  sw  0 0
    /dev/mapper/cryptroot / ext4  defaults  0 1
    
  15. Montujemy katalogi systemowe do podkatalogów w /mnt aby widoczne były urządzenia komputera w środowisku chroot.

    for i in /dev /dev/pts /proc /run /sys; do mount -B $i /mnt$i; done
    
  16. Zmieniamy katalog główny na /mnt.

    # chroot /mnt
    
  17. Wykonujemy kilka czynności instalacyjnych, takich jak ustawienie hasła dla użytkownika root, utworzenie nowego użytkownika oraz nadanie mu uprawnień administratora.

    # passwd
    # adduser user
    # vim /etc/sudoers
    
    user  ALL=(ALL) NOPASSWD:ALL
    
  18. W środowisku zmienionego katalogu podstawowego, odświerzamy listy pakietów dystrybucji oraz instalujemy pakiet cryptsetup. Podczas instalacji pakietu możemy zignorować błędy związane z mkinitramfs oraz cryptroot. Polecenie oświerzenia list może się zawieść, w tym przypadku należy przerwać to polecenie i pobrać konfigurację sieci z serwera dhcp.

    # dhclient
    # apt update
    # apt install cryptsetup
    
  19. Utworzenie wpisu w pliku /etc/crypttab. Plik zawiera wystąpienia szyfrowanych woluminów w systemie. Definiuje odzorowania nazw w katalogu /dev/mapper, plik klucza oraz opcje cryptsetup. Wpis użyty tym przykładzie będzie opierać, się na totalnym minimum konfiguracji. Jest on niezbędny do wygenerowania odpowiednich procedur w initramfs. W skrócie jest potrzebny aby w ogóle dało się odszyfrować wolumin. Pierwsze polecenie służy zapisaniu UUID urządzania blokowego z szyfrowanym woluminem w pliku (oczywiście w tylko i wyłacznie w tym przykładzie).

    # blkid | grep "LUKS" | awk '{printf $2}' >> /etc/crypttab
    # vim /etc/crypttab
    
    cryptroot UUID="..."  none  luks
    

    Gdzie: cryptroot jest to nazwa odwzrowania, UUID wskazuje na urządzenie blokowe przechowywujące zaszyfrowany wolumin, none jest to wskazanie pliku klucz w przypadku tej opcji, zostaniemy poproszeni o wprowadzenie klucza podczas uruchamiania systemu, ostatnia opcja luks spowoduje wymuszenie użycia trybu LUKS, który jest standardem wśród szyfrowanych woluminów na dystrybucjach Linux-a. Ten standard został użyty także przez nas.

  20. Wygenerowanie nowego dysku początkowego. Zwróćmy uwagę na to, iż po zapisaniu wpisu w pliku /etc/crypttab nie pojawiają pojawiają się żadne błędy podczas jego generowania. Tak jak miało to miejsce podczas instalacji cryptsetup przy zmienionym katalogu głównym.

    # mkinitramfs -o /boot/initrd.img-4.19.0-18-amd64
    
  21. Instalacja rekordu rozruchowego na dysku

    # grub-install /dev/sda
    
  22. Wygenerowanie pliku konfiguracyjnego dla programu rozruchowego.

    # update-grub
    
  23. Opuszczenie środowiska zmienionego katalogu głównego.

    # exit
    
  24. Odmontowanie wszystkich wcześniej montowanych systemów plików.

    # umount -R /mnt
    
  25. Zamknięcie szyfrowanego woluminu.

    # cryptsetup close cryptroot
    
  26. Zakończenie instalacji, restart systemu.

    # reboot
    

~xf0r3m