Czym zastąpić OpenSSH na urządzeniach o niskim poborze energii i routerach
Tworząc minimalistyczny obraz dla mikrokontrolera, routera lub kontenera Docker, każdy megabajt pamięci staje się luksusem. Pełnofunkcyjny OpenSSH świetnie sprawdza się na serwerach, ale w przypadku systemów wbudowanych wygląda jak ciężarówka podjeżdżająca pod osiedlowy sklep. Ciągnie za sobą mnóstwo zależności, a RAM po prostu znika na waszych oczach.
W takich sytuacjach ludzie sięgają po Dropbear. To kompaktowy serwer i klient SSH napisany przez Matta Johnstona. Projekt pojawił się ponad dwadzieścia lat temu, ale nadal jest aktywnie rozwijany i stanowi domyślny standard w OpenWrt oraz firmware urządzeń sieciowych.
Co jest w środku i jak osiągana jest oszczędność
Dropbear rozwiązuje jeden konkretny problem: oszczędza miejsce na dysku i RAM, zachowując podstawowe bezpieczeństwo protokołu SSH-2. Jeśli skompilujesz projekt z odpowiednimi flagami, wynikowy binarny plik zajmie zaledwie kilkaset kilobajtów.
Twórca zastosował koncepcję jednego wielofunkcyjnego pliku binarnego, podobnie jak w przypadku narzędzia BusyBox. W tym trybie jeden plik obsługuje funkcje serwera, klienta dbclient, generatora kluczy dropbearkey i konwertera dropbearconvert. Tworzysz dowiązania symboliczne z wymaganymi nazwami wskazujące na jeden plik binarny, a program określa tryb działania na podstawie nazwy wywoływanego pliku.
Oto jeszcze kilka sztuczek pozwalających zmniejszyć rozmiar:
- Wbudowany klient
scpjest kompilowany bez paska postępu transferu plików domyślnie. Jeśli potrzebujesz wskaźnika, musisz jawnie przekazać parametrSCPPROGRESS=1podczas kompilacji. - W pliku
options.hmożesz ręcznie wyłączyć nieużywane algorytmy szyfrowania, przekierowanie portów lub obsługę uwierzytelniania hasłem, co dodatkowo zmniejsza końcowy rozmiar pliku.
Niuanse pracy z kluczami
Jeśli jesteś przyzwyczajony do standardowych narzędzi OpenSSH, projekt zaskoczy Cię kilkoma rzeczami. Po stronie serwera wszystko jest znajome: plik ~/.ssh/authorized_keys działa w standardowy sposób. Dodajesz tam klucze publiczne w formacie ssh-rsa lub ssh-ed25519. Najważniejsze to upewnić się, że Twój edytor nie dzieli ciągu klucza na wiele linii oraz że uprawnienia do katalogu .ssh pozwalają na zapis tylko właścicielowi.
Po stronie klienta i podczas generowania kluczy hosta pojawiają się osobliwości. Narzędzie używa własnego formatu kluczy prywatnych. Aby użyć znanego Ci klucza ~/.ssh/id_rsa w kliencie dbclient, musisz najpierw go przekonwertować:
dropbearconvert openssh dropbear ~/.ssh/id_rsa ~/.ssh/id_rsa.db
dbclient -i ~/.ssh/id_rsa.db user@remotehost
Jeśli tworzysz nowy klucz za pomocą natywnego narzędzia dropbearkey, prywatna i publiczna część są wyprowadzane bezpośrednio na konsolę. Możesz wyodrębnić klucz publiczny do dodania na innym serwerze za pomocą prostego filtrowania:
./dropbearkey -y -f ~/.ssh/id_ed25519 | grep "^ssh-" > ~/.ssh/id_ed25519.pub
Uruchamianie serwera i pułapki
Zazwyczaj przed uruchomieniem serwera SSH musisz ręcznie wygenerować klucze hosta:
./dropbearkey -t rsa -f dropbear_rsa_host_key
./dropbearkey -t ed25519 -f dropbear_ed25519_host_key
Dropbear ma wygodną sztuczkę przyspieszającą rozruch systemu. Zamiast generować klucze przy starcie (co spowalnia rozruch na słabych procesorach), przekazujesz do serwera flagę -R. W tym przypadku klucze zostaną automatycznie utworzone w katalogu /etc/dropbear/ dopiero przy pierwszym przychodzącym połączeniu.
Podczas pracy pamiętaj o osobliwościach projektu:
- Uruchomienie serwera jako zwykłego użytkownika jest mocno ograniczone. Nie będziesz w stanie alokować pseudo-terminala (pty), przełączyć się na inne konto ani używać shadow passwords.
- Bezpośrednio nie są obsługiwane klucze hosta zaszyfrowane hasłem, chociaż klient może połączyć się z działającym
ssh-agent. - Projekt nie ma szczegółowej dokumentacji. Główne instrukcje są rozrzucone w plikach tekstowych
INSTALL.md,MULTI.mdiSMALL.mdw katalogu głównym repozytorium.
Kto znajdzie to narzędzie przydatne
Dropbear przyda się, jeśli tworzysz niestandardowy firmware routera, rozwijasz urządzenie z systemem Linux z ograniczoną pamięcią flash lub budujesz kompaktowy obraz initramfs. Na pełnym serwerze z dziesiątkami gigabajtów pamięci prawie nie odczujesz różnicy w porównaniu z OpenSSH. Ale tam, gdzie liczy się każdy kilobajt, to narzędzie oszczędza zasoby lepiej niż większość alternatyw.
Powiązane projekty