Strona używa cookies (ciasteczek). Dowiedz się więcej o celu ich używania i zmianach ustawień. Korzystając ze strony wyrażasz zgodę na używanie cookies, zgodnie z aktualnymi ustawieniami przeglądarki.    X

Asus RT-N18U — „dodajemy SSH" — instalacja dodatkowych pakietów

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.

r   e   k   l   a   m   a

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.  

linux sprzęt porady

Komentarze