--- /dev/null
+<!DOCTYPE html>
+<html>
+ <head>
+ <meta charset="utf-8" />
+ <link rel="icon" type="image/png" href="https://i.ibb.co/khy45hh/mm.png">
+ <link rel="stylesheet" type="text/css" href="/style.css">
+ </head>
+ <body>
+<pre>
+ _____ _ _ _ _ ___ _
+ / ____| \ | | | | | / / | (_)
+| | __| \| | | | | / /| | _ _ __ _ ___ __
+| | |_ | . ` | | | |/ / | | | | '_ \| | | \ \/ /
+| |__| | |\ | |__| / / | |____| | | | | |_| |> <
+ \_____|_| \_|\____/_/ |______|_|_| |_|\__,_/_/\_\
+</pre>
+ <p class="header_link">
+ ☠ <a href="https://morketsmerke.github.io">morketsmerke</a> ☠
+ </p>
+ <div class="main">
+ <h1 class="title">Zdalne odblokowanie cryptroot przez SSH</h1>
+ <p>
+ 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
+ <em>tty0</em> 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.
+ </p>
+ <p>
+ Rozwiązanie tego problemu istnieje i polega ono na uruchomieniu
+ serwera SSH na etapie wykonywania czynności przez system w
+ <em>initramfs</em>. 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 <em>dropbear-initramfs</em>, więc niezbędne oprogramowanie
+ mamy podane jak na tacy. Pozostaje je tylko skonfigurować.
+ </p>
+<pre class="code-block">
+$ sudo apt install -y dropbear-initramfs
+</pre>
+ <p>
+ Podczas instalacji zostanie nam wyświetlony taki o to komunikat:
+ </p>
+<pre class="code-block">
+dropbear: WARNING: Invalid authorized_keys file, SSH login to initramfs won't work!
+</pre>
+ <p>
+ 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
+ <strong>/etc/dropbear/initramfs/authorized_keys</strong> - oznaczyłem
+ te ścieżkę nie bez powodu. Otóż różne wersje <em>dropbear</em>,
+ korzystają z różnych ścieżek, na szczęście jest tylko jedna
+ alternatywa (<em>/etc/dropbear-initramfs/authorized_keys</em>).
+ Wersje do Debiana 11 oraz Ubuntu 20.04 LTS, korzystają ze starszej
+ wersji (<em>dropbear-initramfs/</em>). Tutaj opiszę wersję nowszą,
+ starsza znajduje się w źródłach (drugi odnośnik).
+ </p>
+ <p>
+ Po zapisaniu klucza możemy przejść do konfiguracji
+ <em>Dropbear</em>-a.
+ W pliku <em>/etc/dropbear/initramfs/dropbear.conf</em> i odnajdujemy
+ w nim ujętą w komentarz opcję <em>DROPBEAR_OPTIONS</em> usuwamy
+ symbol komentarza i zapisujemy w nim poniższe opcje:
+ </p>
+<pre class="code-block">
+DROPBEAR_OPTIONS="-p 2222 -s"
+</pre>
+ <p>
+ Za pomocą opcji <code class="code-inline">-p</code> wskazujemy port,
+ a za pomocą <code class="code-inline">-s</code> wyłączamy możliwość
+ zalogowania się hasłem. Można różnież dodać opcje <em>-I</em>, która
+ powoduje rozłączenie sesji po podanym czasie nieaktywności. W ten
+ sposób <em>dropbear</em> został skonfigurowany.
+ </p>
+ <p>
+ Teraz musimy uruchomić jeszcze sieć w trybie <em>initramfs</em>,
+ dokonujemy tego wpisując poniższą konfigurację do pliku
+ <em>/etc/initramfs-tools/initramfs.conf</em>.
+ </p>
+<pre class="code-block">
+# IP_ADDRESS::GATEWAY:NETMASK:HOSTNAME
+IP=172.29.141.62::172.29.128.1:255.255.240.0:debian
+</pre>
+ <p>
+ Komentarz w przykładzie pokazuje, jakie pole odpowiada za co. Po
+ zapisaniu zmian w plikach, możemy przejść do wygenerowania nowego
+ obrazu <em>initramfs</em> oraz aktualizacji plików konfiguracyjnych
+ GRUB-a.
+ </p>
+<pre class="code-block">
+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
+</pre>
+ <p>
+ 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 <em>initramfs.conf</em>. Na serwerze
+ może to wyglądać to mniej więcej tak:
+ </p>
+<pre class="code-block">
+ 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 :
+</pre>
+ <p>
+ 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.
+ </p>
+<pre class="code-block">
+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.
+</pre>
+ <p>
+ Po zalogowaniu się zostanie zestawiona sesja powłoki BusyBox. Od
+ samego systemu dostajemy podpowiedź:
+ <code class="code-inline">To unlock root partition, and maybe others
+ like swap, run `cryptroot-unlock`.</code>, 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.
+ </p>
+ <p>
+ Ta metoda jest uniwersalna i może być stosowana nie zależnie od tego
+ czy mamy port COM czy też nie.
+ </p>
+ <p>
+ Źródła:<br />
+ <ul>
+ <li><a href="https://en.wikipedia.org/wiki/Dropbear_(software)">Strona na Wikipedii o Dropbear (implementacji SSH)</a></li>
+ <li><a href="https://www.privex.io/articles/unlock-luks-remotely-ssh-dropbear/">Zdalne odblokowanie LUKS z rootfs podczas rozruchu przez SSH</a></li>
+ <li><a href="https://www.cyberciti.biz/security/how-to-unlock-luks-using-dropbear-ssh-keys-remotely-in-linux/">Zdalne odblokowanie LUKS z rootfs podczas rozruchu przez SSH - nowsza wersja</a></li>
+ </ul>
+ </p>
+ <p>
+ ~xf0r3m
+ </p>
+ </div>
+ <p class="footer">
+ 2024; COPYLEFT; ALL RIGHTS REVERSED;
+ </p>
+</body>
+</html>