Asus RT‑N18U — „dodajemy SSH" — instalacja dodatkowych pakietów
28.04.2017 00:01
Jak wspominałem w poprzednim wpisie - Asus RT‑N18U ma możliwość zalogowania się do konsoli urządzenia z wykorzystaniem telnetu. Producent w tym przypadku zdecydował się na wykorzystanie mniej bezpiecznego połączenia, a SSH zarezerwował dla droższych rozwiązań. Postanowiłem jednak sprawdzić czy uda mi się je włączyć.
Podłączamy dysk zewnętrzny
Pierwsze co potrzebujemy to dysk zewnętrzny. Będziemy na nim instalować dodatkowe pakiety. Dysk USB zostanie automatycznie zamontowany w ścieżce /tmp/mnt/sda1. Następnie należy zainstalować DownloadMaster (jest to jedna z "Aplikacji USB", dostępna w webowym interfejsie użytkownika). Dzięki temu, na naszym urządzeniu zainstalowane zostaną niezbędne biblioteki i aplikacje, a na dysku USB pojawi się nowy katalog "asusware.arm". Katalog ten jest podlinkowany z /opt i znajdują się tam katalogi i pliki systemowe (dla dodatkowych aplikacji). Po instalacji DownloadMaster w systemie pojawia się także możliwość instalacji dodatkowych paczek z użyciem managera ipkg
# ipkg install ssh Nothing to be done An error ocurred, return value: 4. Collected errors: Cannot find package ssh. Check the spelling or perhaps run 'ipkg update'
Niestety na liście paczek nie ma ssh.
Kolejnym krokiem jest instalacja opkg. A właściwie podmiana ipkg na opkg, gdyż nie możemy korzystać z obu managerów pakietów jednocześnie. Pierwsze co musimy zrobić to dowiedzieć się jaka jest architektura procesora, który pracuje w urządzeniu
#cat /proc/cpuinfo Processor : ARMv7 Processor rev 0 (v7l) BogoMIPS : 1599.07 Features : swp half thumb fastmult edsp CPU implementer : 0x41 CPU architecture: 7 CPU variant : 0x3 CPU part : 0xc09 CPU revision : 0 Hardware : Northstar Prototype Revision : 0000 Serial : 0000000000000000
cpuinfo mówi, że to armv7, spróbujmy więc pobrać instalator i zainstalować managera entware:
wget http://pkg.entware.net/binaries/armv7/installer/entware_install.sh | sh
Jesli wszystko zakończy się poprawnie, to na naszej konsoli powinniśmy zobaczyć:
Configuring opkg. Configuring libstdcpp. Configuring findutils. Configuring entware-opt. Updating /opt/etc/ld.so.cache... done. Info: Congratulations! Info: If there are no errors above then Entware-ng was successfully initialized. Info: Add /opt/bin & /opt/sbin to your PATH variable Info: Add '/opt/etc/init.d/rc.unslung start' to startup script for Entware-ng services to start Info: Found a Bug? Please report at https://github.com/Entware-ng/Entware-ng/issues
Teraz logując się przez telnet do urządzenia możemy korzystać z managera pakietów opkg z dużo większą ilością pakietów.
#opkg update #opkg install nazwa_paczki
Instalujemy serwer SSH
Sama instalacja jest prosta i sprowadza się do wywołania komendy
#opkg install openssh-server
Po instalacji uruchamiamy serwer i otrzymujemy komunikat o niepowodzeniu:
# /opt/etc/init.d/S40sshd start starting sshd... Privilege separation user sshd does not exist
Komunikat ten wyskakuje ponieważ po instalacji musimy: - skonfigurować serwer - dodać nowego użytkownika (niestety użytkownicy dodani przez interfejs webowy nie mogą zalogować się po ssh) Konfiguracja polega na edycji pliku opt/etc/ssh/sshd_config (możemy wykorzystać vi, który jest domyślnym edytorem w systemie). Jeśli chodzi o konfiguracje serwera to najlepiej wykorzystać jeden z poradników dostępnych w sieci, gdyż nie ma jednego uniwersalnego i najlepszego ustawienia.
Dodanie nowego użytkownika polega z kolei na dodaniu nowego użytkownika w pliku /etc/passwd. Następnie należy ustanowić hasło dla nowego użytkownika. Hasła zapisywane są w tym samym pliku, na drugiej pozycji po nazwie użytkownika jako hashe. Aby je wygenerować możemy użyć skryptu chpasswd.sh:
# chpasswd.sh nazwa_usera haslo
Po restarcie okaże się jednak, że naszego "nowego" użytkownika nie ma - plik /etc/passwd został wygenerowany raz jeszcze (przywrócony z pamięci flash) i nie możemy połączyć się z routerem. Dość długo analizowałem ten problem, jak obejść ten problem i niestety jedyne co przyszło mi do głowy to stworzenie skryptu, który za każdym razem doda użytkownika do pliku /etc/passwd
#!/bin/sh echo "McD:hash_hasla:500:500::/:/bin/sh" >> /etc/passwd
Ostatnia linijka to oczywiście linijka skopiowana z pliku /etc/passwd, po wykonaniu skryptu chpasswd.sh. Tak przygotowany skrypt należy zapisać (w /jffs) i wykonywać przy starcie systemu, przed uruchomieniem demona ssh, dlatego niezbędne jest dodanie nowego pliku w /opt/etc/init.d. Plik ten musi mieć nazwę niższą niż S40sshd ponieważ musi być wykonany przed inicjalizacją demona ssh, a skrypt który uruchamia usługi sortuje je właśnie po nazwie.
#!/bin/sh sleep 5s /jffs/add_user.sh
Mój plik nazwałem S30init. Trzecia linia skryptu jest niezbędna ze względu na czas startu systemu - plik /etc/passwd nie jest odtwarzany jako pierwszy i bez opóźnienia zdarzało się, że skrypt wykonywał się dodając nowego użytkownika, jednak po chwili plik został zastępowanym "oryginalnym". Aby mieć pewność, że nowy użytkownik zostanie dodany na końcu pliku po jego odtworzeniu opóźniamy wykonanie skryptu dodającego użytkownika.
Po skonfigurowaniu i dodaniu użytkownika próbujemy i okazuje się, że musimy stworzyć jeszcze klucze
# ./S40sshd start starting sshd... Could not load host key: /opt/etc/ssh/ssh_host_rsa_key Could not load host key: /opt/etc/ssh/ssh_host_dsa_key Could not load host key: /opt/etc/ssh/ssh_host_ecdsa_key Could not load host key: /opt/etc/ssh/ssh_host_ed25519_key sshd: no hostkeys available -- exiting.
Wygenerować je należy kolejno poleceniami, za każdym razem wskazując gdzie powinny zostać zapisane. W tym miejscu pojawia się kolejny problem. Kluczy nie powinniśmy zapisać na dysku USB - pomijając względy bezpieczeństwa musimy pamiętać, że przy każdym bootowaniu urządzenia wszystkie pliki zawarte na dysku dostają poziom bezpieczeństwa 0777. Kluczy o takim poziomie ("publicznym") OpenSSH po prostu nie przyjmie zasypując nas komunikatami ("Permissions 0777 for 'id_rsa.pub' are too open."). Jeśli bardzo chcemy oczywiście możemy trzymać tam klucze, ale niezbędny jest skrypt, który przed uruchomienie sshd zmieni poziom zabezpieczeń na niższy. Niestety zapisanie kluczy w katalogu /home lub /etc również odpada - każdy nowy plik, który się tam pojawi po restarcie znika. Na szczęście w systemie mamy również partycję jffs - oprócz logów idealnie nadaje się na skrypty oraz klucze, to właśnie tam proponuję umieścić wszystkie klucze, które wygenerować możemy poleceniami.
ssh-keygen -t rsa ssh-keygen -t dsa ssh-keygen -t ecdsa ssh-keygen -t ed25519
Pamiętajmy, że w pliku sshd_config muszą być podane odpowiednie ścieżki do kluczy
HostKey /jffs/.ssh/id_rsa_key HostKey /jffs/.ssh/id_key HostKey /jffs/.ssh/id_ecdsa_key HostKey /jffs/.ssh/id_key
Następnie uruchamiamy usługę SSHD poleceniem
/opt/etc/init.d/S40sshd start
i cieszymy się możliwością połączenia za pomocą protkołu SSH do naszego routera, który domyślnie jest dostępny tylko w droższych urządzenia Asusa.