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

Zdalne odblokowanie cryptroot przez SSH

Tworząc materiał o automatyczym odblokowaniu partycji LUKS podczas rozruchu systemu, na jego końcu postawiłem tezę, że rozwiązanie nie jest idealne, brakuje środka zapobiegającego wyciekowi klucza w momencie, gdy ktoś nie powołany uzyska fizyczny dostęp do maszyny. Po zapoznaniu się z materiałem opisującym przekierowanie konsoli tty0 na port COM, wiemy, że możemy zaszyfrować partycję z katalogiem głównym i użyć innego serwera do połaczenia szeregowego i odblokować go przez konsolę. Problem niestety z tym rozwiązaniem jest taki, że obecne komputery, mogą nie mieć w ogóle portów COM lub trzeba je wyprowadzić lub trzeba zakupić odpowiedni moduł, którego nie tyle cena co dostępność może być utrudniona. Tak też było w moim przypadku.

Rozwiązanie tego problemu istnieje i polega ono na uruchomieniu serwera SSH na etapie wykonywania czynności przez system w initramfs. Do tego celu użyjemy inne implementacji protokołu SSH niż OpenSSH, wykorzystamy oprogramowanie Dropbear - jest to implemetacja obsługi protokołu SSH przeznaczona dla systemów wbudowanych. Domyślnie wykorzystywana jest w dystrybucji OpenWRT. Dla systemów opartych na Debianie w repozytoriach dostępnych jest pakiet dropbear-initramfs, więc niezbędne oprogramowanie mamy podane jak na tacy. Pozostaje je tylko skonfigurować.

$ sudo apt install -y dropbear-initramfs

Podczas instalacji zostanie nam wyświetlony taki o to komunikat:

dropbear: WARNING: Invalid authorized_keys file, SSH login to initramfs won't work!

Ignorujemy go, a naszą konfigurację zaczniemy od właśnie dodania klucza. Możemy używać swojego dotychczasowego klucza lub wygenerować nowy klucz dla serwera. Klucz zapisujemy w pliku /etc/dropbear/initramfs/authorized_keys - oznaczyłem te ścieżkę nie bez powodu. Otóż różne wersje dropbear, korzystają z różnych ścieżek, na szczęście jest tylko jedna alternatywa (/etc/dropbear-initramfs/authorized_keys). Wersje do Debiana 11 oraz Ubuntu 20.04 LTS, korzystają ze starszej wersji (dropbear-initramfs/). Tutaj opiszę wersję nowszą, starsza znajduje się w źródłach (drugi odnośnik).

Po zapisaniu klucza możemy przejść do konfiguracji Dropbear-a. W pliku /etc/dropbear/initramfs/dropbear.conf i odnajdujemy w nim ujętą w komentarz opcję DROPBEAR_OPTIONS usuwamy symbol komentarza i zapisujemy w nim poniższe opcje:

DROPBEAR_OPTIONS="-p 2222 -s"

Za pomocą opcji -p wskazujemy port, a za pomocą -s wyłączamy możliwość zalogowania się hasłem. Można różnież dodać opcje -I, która powoduje rozłączenie sesji po podanym czasie nieaktywności. W ten sposób dropbear został skonfigurowany.

Teraz musimy uruchomić jeszcze sieć w trybie initramfs, dokonujemy tego wpisując poniższą konfigurację do pliku /etc/initramfs-tools/initramfs.conf.

# IP_ADDRESS::GATEWAY:NETMASK:HOSTNAME
IP=172.29.141.62::172.29.128.1:255.255.240.0:debian

Komentarz w przykładzie pokazuje, jakie pole odpowiada za co. Po zapisaniu zmian w plikach, możemy przejść do wygenerowania nowego obrazu initramfs oraz aktualizacji plików konfiguracyjnych GRUB-a.

xf0r3m@debian:~$ sudo update-initramfs -u
update-initramfs: Generating /boot/initrd.img-6.1.0-23-amd64
xf0r3m@debian:~$ sudo update-grub
Generating grub configuration file ...
Found linux image: /boot/vmlinuz-6.1.0-23-amd64
Found initrd image: /boot/initrd.img-6.1.0-23-amd64
Found linux image: /boot/vmlinuz-6.1.0-18-amd64
Found initrd image: /boot/initrd.img-6.1.0-18-amd64
Warning: os-prober will not be executed to detect other bootable partitions.
Systems on them will not be added to the GRUB boot configuration.
Check GRUB_DISABLE_OS_PROBER documentation entry.
done

Jeśli potrzebujemy konfiguracji sieciowej z IPv6, to informacja o tym jak to zrobić znajduje się w źródłach (drugi odnośnik). Teraz możemy restartować nasz serwer i próbować się logować. Serwer będzie gotowy, do połączenia, kiedy podczas rozruchu pokażą nam się informacje sieciowe wprowadzone w pliku initramfs.conf. Na serwerze może to wyglądać to mniej więcej tak:

  Booting `Debian GNU/Linux'

Loading Linux 6.1.0-23-amd64 ...
Loading initial ramdisk ...
[    1.071903] piix4_smbus 0000:00:07.3: SMBus base address uninitialized - upgrade BIOS or use force_addr=0xaddr
IP-Config: eth0 hardware address 00:15:5d:0a:11:67 mtu 1500 DHCP RARP
IP-Config: eth0 guessed broadcast address 172.29.143.255
IP-Config: eth0 complete:
 address: 172.29.141.62    broadcast: 172.29.143.255   netmask: 255.255.240.0
Please unlock disk sda5_crypt:  gateway: 172.29.128.1     dns0     : 0.0.0.0 
         dns1   : 0.0.0.0
 host   : debian
 rootserver: 0.0.0.0 rootpath:
 filename  :

Teraz serwer jest gotowy do połączenia, na moim komputerze wydaje poniższe polecenie i serwer powinien mi odpowiedzieć co jest pokazane na przykładzie.

xf0r3m@immudex:~$ ssh -p 2222 -i ~/.ssh/id_rsa root@172.29.141.62
The authenticity of host '[172.29.141.62]:2222 ([172.29.141.62]:2222)' can't be established.
ED25519 key fingerprint is SHA256:ZJUHcaM30fDyjshd7kkSOQLFtfFXCDlhpFGlid2g8MY.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Warning: Permanently added '[172.29.141.62]:2222' (ED25519) to the list of known hosts.
Enter passphrase for key '/home/xf0r3m/.ssh/id_rsa':
To unlock root partition, and maybe others like swap, run `cryptroot-unlock`.


BusyBox v1.35.0 (Debian 1:1.35.0-4+b3) built-in shell (ash)
Enter 'help' for a list of built-in commands.

~ # cryptroot-unlock
Please unlock disk sda5_crypt:
cryptsetup: sda5_crypt set up successfully
~ # Connection to 172.29.141.62 closed by remote host.
Connection to 172.29.141.62 closed.

Po zalogowaniu się zostanie zestawiona sesja powłoki BusyBox. Od samego systemu dostajemy podpowiedź: To unlock root partition, and maybe others like swap, run `cryptroot-unlock`., wpisujemy podane polecenie i wówczas zostaniemy zapytani o hasło do odblokowania partycji LUKS. Po prawidłowym podaniu hasło, połączenie zostanie zakończone a rozruch systemu serwera ruszy dalej.

Ta metoda jest uniwersalna i może być stosowana nie zależnie od tego czy mamy port COM czy też nie.

Źródła:

~xf0r3m