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:
- Strona na Wikipedii o Dropbear (implementacji SSH)
- Zdalne odblokowanie LUKS z rootfs podczas rozruchu przez SSH
- Zdalne odblokowanie LUKS z rootfs podczas rozruchu przez SSH - nowsza wersja
~xf0r3m