Dzisiaj jest 28 paź 2021, 08:32

Strefa czasowa UTC+1godz. [letni]




Nowy temat Odpowiedz w temacie  [ Posty: 19 ] 
Autor Wiadomość
 Tytuł: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 6 maja 2011, 18:20 
Offline
Użytkownik

Rejestracja: 10 kwie 2010, 21:30
Posty: 200
Znalezienie poniższych informacji nie jest banalnie proste (choć też nie jakoś niesamowicie skomplikowane), więc po własnych owocnych poszukiwaniach postanowiłem napisać mały poradnik (może komuś się kiedyś przyda :)).

Założenia:
- w jednej sieci LAN są (co najmniej) dwa routery pracujące pod kontrolą OpenWRT (router A (z którego chcemy się łączyć) 192.168.1.1 i router B (na który chcemy się łączyć) 192.168.1.2)
- chcemy mieć możliwość łączenia się pomiędzy nimi po ssh bez konieczności podawania hasła (np w celu wykorzystania tego w skryptach, lub dla zwykłej wygody)
- klucze przechowujemy w katalogu /etc/dropbear/ (niech ktoś napisze, jeżeli konwencje w tej kwestii są inne)

Niby w sieci jest pełno poradników jak to zrobić ale zdecydowana większość z nich zakłada posiadanie na maszynie klienckiej openSSH (lub czegoś posiadającego polecenie ssh-keygen), a pod OpenWRT domyślnie jest dropbear (owszem, można zmienić, tylko po co?).
Nawet na wiki OpenWRT znalazłem tylko informacje o logowaniu się bez hasła na router.

Do rzeczy.

1. Generowanie kluczy (router A)

Do wygenerowania kluczy służy polecenie dropbearkey. Można się nim posłużyć np w następujący sposób:
cd /etc/dropbear/
dropbearkey -t rsa -f key.priv | grep ssh-rsa > key.pub
Otrzymujemy klucz prywatny (key.priv), który należy trzymać w tajemnicy, oraz publiczny (key.pub), który trzeba przekazać maszynie, na którą chcemy się logować.

Skopiowanie klucza publicznego na drugi router można wykonać poleceniem (tym razem jeszcze trzeba podać hasło :)):
scp key.pub 192.168.1.2:/tmp

2. Dodawanie autoryzowanych kluczy publicznych (router B)

Skopiowany do /tmp klucz publiczny routera A należy dodać do listy kluczy autoryzowanych (druga linijka nie jest konieczna przy dodawaniu kolejnych kluczy):
cat /tmp/key.pub >> /etc/dropbear/authorized_keys
chmod 0600 /etc/dropbear/authorized_keys

3. Logowanie przy pomocy klucza (router A)

dropbear wymaga każdorazowego wyspecyfikowania, że chcemy połączyć się używając wygenerowanego klucza. Służy do tego opcja -i:
ssh -i /etc/dropbear/key.priv 192.168.1.2
Jeżeli nie chcemy podawać tego za każdym razem, możemy zrobić sobie alias:
alias ssh='ssh -i /etc/dropbear/key.priv'
Można też sprawić, by zawsze tworzył się automatycznie (ponownie - nie znam konwencji - jeśli nie jest to dobre miejsce na aliasy, niech ktoś podpowie lepsze):
echo "alias ssh='ssh -i /etc/dropbear/key.priv'" >> /etc/profile
Po tej operacji wystarczy zwykłe
ssh 192.168.1.2
To samo można zrobić np dla scp.


Oczywiście nic nie stoi na przeszkodzie by skonfigurować takie połączenia także w drugą stronę (z routera B na router A), lub dla większej ilości maszyn (na każdej klucze generujemy tylko raz, za to kopiujemy je (i dodajemy do listy autoryzowanych) na wszystkie, na które chcemy się logować).

I to właściwie tyle (prawda, ze proste?).
Wszelkie uwagi i sugestie mile widziane.

----- Dodano ----- 11 maja 2011, o 23:51 -----

4. SSH wywoływane automatycznie

Wszystko działa ładnie, gdy ssh (lub skrypt je zawierający) wywoływane jest "ręcznie" z linii poleceń. Jednak gdy chcemy, by wywołanie nastąpiło automatycznie (start routera, cron, zdarzenie hotplug, plugin exec z lcd4linux, itp) mogą pojawić się problemy.

4a. Plik /root/.ssh/known_hosts i zmienna $HOME
ssh szuka identyfikatorów znanych hostów w pliku $HOME/.ssh/known_hosts. Gdy logujemy się na router, zmienna $HOME zostaje ustawiona tak, jak jest to zapisane w pliku /etc/passwd (np "/root" dla użytkownika root). cron robi to samo przed uruchomieniem poleceń, ale np hotplug już nie (zawartość tej zmiennej jest ustawiona na "/"). Powoduje to, że ssh szuka hostów w pliku /.ssh/known_hosts (a nie w /root/.ssh/known_hosts gdzie zostały zapisane hosty zatwierdzone przez użytkownika w trybie interaktywnym), nie znajduje ich i rozłącza połączenie.
Można temu zapobiec na kilka sposobów:
- ustawiając zmienną $HOME na odpowiednią wartość przed wywołaniem ssh
- tworząc link /.ssh/known_hosts wskazujący na plik /root/.ssh/known_hosts (lub na odwrót)
- dodając do polecenia ssh opcję -y (zezwala na połączenie, gdy host jest nieznany)

Ta ostatnia opcja może być nieco niebezpieczna, ale też może się przydać, gdy chcemy się łączyć z hostami, których nie zatwierdziliśmy wcześniej (z lenistwa, lub braku możliwości) w trybie interaktywnym.

4b. stdout i stderr
Rozwiązanie tego problemu zajęło mi więcej czasu i szczerze mówiąc nadal nie do końca rozumiem przyczynę. Ale skoro się udało, to może ktoś z tego skorzysta.
Jeżeli chcemy tylko wykonać komendę na zdalnym rządzeniu, nie ma problemu, np:
/usr/bin/ssh -i /etc/dropbear/key.priv root@192.168.1.2 "/bin/touch /tmp/file"
(komenda wykona się - zostanie utworzony plik)

Jeżeli jednak interesuje nas to, co dana komenda zwraca (na standardowe wyjście, lub na wyjście błędów), sprawa robi się nieco bardziej skomplikowana.
Np. polecenie:
/usr/bin/ssh  -i /etc/dropbear/key.priv root@192.168.1.2 "/usr/bin/uptime" > /tmp/remote_host_uptime
spowoduje utworzenie pustego pliku (0 bajtów).

Jak nadmieniłem, nie do końca rozumiem przyczynę (ale ponoć ma to coś wspólnego z tym, że ssh wywołane w ten sposób przekierowuje swoje wejście, co powoduje też przekierowanie wyjść).
W przypadku "pełnego" ssh podobno wystarczy dodanie opcji -n (zakaz przekierowywania), ale dropbear, jako klient, nie posiada jej.
Rozwiązaniem jest ręczne przekierowanie wejścia np na /dev/zero (z /dev/null nie dizała):
/usr/bin/ssh  -i /etc/dropbear/key.priv root@192.168.1.2 "/usr/bin/uptime" < /dev/zero > /tmp/remote_host_uptime
Teraz już dostaniemy zarówno stdout, jak i stderr ze zdalnie wykonanej komendy.

Jest to jedyny sposób, jaki znalazłem (np proba wymuszenia emulacji pty, poprzez wielokrotną opcję -t nie pomaga) i, choć może nie najbardziej elegancki, to jednak skuteczny.

Jak zwykle chętnie przyjmę wszelkie uwagi, pomysły i opinie.

_________________
2x TP-Link TL-WR1043ND (Gargoyle PL by obsy) + SpeedStream 4101


Ostatnio zmieniony 12 maja 2011, 18:37 przez T_F, łącznie zmieniany 3 razy

Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: SSH bez hasła pomiędzy routerami.
Post: 6 maja 2011, 18:21 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 00:28
Posty: 13956
Lokalizacja: Warszawa
Pewnie że proste :). Główna różnica to taka, że dropbear szuka kluczy w innym miejscu (/etc/dropbear), nie .ssh jak to zwykle ma miejsce.

_________________
http://eko.one.pl - prawie wszystko o OpenWrt


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: SSH bez hasła pomiędzy routerami.
Post: 6 maja 2011, 18:25 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 13:13
Posty: 1942
Lokalizacja: Suwałki
dodaj do tematu [howto], łatwiej będzie szukać i późniejszym czasie nam sortować takie posty. Dzięki.

_________________
Pozdrawiam, Artur
http://digi-led.pl


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 29 sty 2018, 23:34 
Offline
Użytkownik

Rejestracja: 29 sty 2018, 23:22
Posty: 5
Witam
jak powinno wyglądać polecenie do skopiowania pliku tmp/test.txt


coś takiego ?

/usr/bin/ssh -i /etc/dropbear/key.priv root@192.168.1.99 "/tmp/test.txt > /tmp/test.txt "


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 30 sty 2018, 00:40 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 00:28
Posty: 13956
Lokalizacja: Warszawa
Skopiowania skąd?

_________________
http://eko.one.pl - prawie wszystko o OpenWrt


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 30 sty 2018, 01:37 
Offline
Użytkownik

Rejestracja: 29 sty 2018, 23:22
Posty: 5
z routera (192.168.1.1 tmp/test.txt) na którym zostanie wykonany skrypt
lub polecenie z crona chce wysłać plik lub jego zawartość do routera (192.168.1.99 tmp/test.txt)

lub odwrotnie wykonać skrypt na 192.168.1.99 odczytujący zawartość pliku test.txt w katalogu tmp na routerze 192.168.1.1


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 30 sty 2018, 08:07 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 00:28
Posty: 13956
Lokalizacja: Warszawa
scp /tmp/test.txt root@192.168.1.99:/tmp/test.txt
scp root@192.168.1.99:/tmp/test.txt /tmp/test.txt

?

_________________
http://eko.one.pl - prawie wszystko o OpenWrt


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 30 sty 2018, 18:07 
Offline
Użytkownik

Rejestracja: 29 sty 2018, 23:22
Posty: 5
ale to wymaga podania hasła


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 30 sty 2018, 18:52 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 00:28
Posty: 13956
Lokalizacja: Warszawa
Czemu nie podałeś -i /etc/dropbear/key.priv?

_________________
http://eko.one.pl - prawie wszystko o OpenWrt


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 30 sty 2018, 19:01 
Offline
Użytkownik

Rejestracja: 29 sty 2018, 23:22
Posty: 5
bo:
/usr/bin/ssh -i /etc/dropbear/key.priv root@192.168.1.99:/tmp/test.txt /tmp/test.txt

zgłasza:
/usr/bin/ssh: Exited: Error resolving '192.168.1.99:' port 'tmp/test.txt'. Servname not supported for ai_socktype

a z kolei
/usr/bin/ssh -i /etc/dropbear/key.priv scp root@192.168.1.99:/tmp/test.txt /tmp/test.txt
daje:
/usr/bin/ssh: Exited: Error resolving 'scp' port '22'. Name or service not known


i nie bardzo wiem co jest nie tak


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 30 sty 2018, 19:23 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 00:28
Posty: 13956
Lokalizacja: Warszawa
Serio?

scp -i /etc/dropbear/key.priv /tmp/test.txt root@192.168.1.99:/tmp/test.txt

scp to jest oddzielne polecenie.

_________________
http://eko.one.pl - prawie wszystko o OpenWrt


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 30 sty 2018, 19:39 
Offline
Użytkownik

Rejestracja: 29 sty 2018, 23:22
Posty: 5
Dzięki wszystko działa


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 24 wrz 2021, 14:50 
Offline
Użytkownik

Rejestracja: 13 lis 2013, 22:07
Posty: 24
Tutorial spoko, normalne SSH z crona przy mojej konfiguracji działa, tylko jest jeden problem. Gdy tylko dodaję do linijki w cronie przełącznik -t (zakładam że wtedy serwer docelowy zanotuje zalogowanie się, a nie zignoruje taką sesję jak w przypadku -T czy braku przełącznika), to przestaje. Próbowałem przerzucać stdin z /dev/zero, a stderr na stdout i potem oba na lokalny plik, celem zdiagnozowania, ale ten ostatni jest pusty. Ktoś coś?

OpenWrt 21.02-SNAPSHOT, r16263-4003eeab35


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 24 wrz 2021, 15:45 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 00:28
Posty: 13956
Lokalizacja: Warszawa
ssh z crona? Tzn co właściwie robisz?

_________________
http://eko.one.pl - prawie wszystko o OpenWrt


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 24 wrz 2021, 17:14 
Offline
Użytkownik

Rejestracja: 13 lis 2013, 22:07
Posty: 24
Próbuję zalogować się raz dziennie na serwer i wykazać aktywność.

Przełącznik -T mi takiej możliwości nie daje, choć polecenie wykonywane jest bez problemów (więc klucz publiczny jest czytany, polecenia są wykonywane i ich wynik jest OK). Z kolei wymuszenie sesji interaktywnej parametrem -t w ogóle nie jest wykonywane poprawnie, tzn. nie dochodzi nawet do połączenia SSH - nie jestem jednak w stanie stwierdzić co jest nie tak.

Dodam, że wykonuję operację z użytkownika innego niż root, jeśli to coś zmienia.

Polecenie, którego używam w cronie:
HOME=~localuser ssh -v -l remoteuser -i /path/to/private_key -t remote.host "echo 'INTERACTIVE SHELL TEST' >>/writable/remote/file.txt"


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 25 wrz 2021, 08:33 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 00:28
Posty: 13956
Lokalizacja: Warszawa
Nie wiem co robiłeś, ale to działa tak po prostu. Z crona w OpenWrt:
root@AP8:~# grep ssh /etc/crontabs/root
*/1 * * * * ssh -i /root/key.priv cezary@10.1.1.1 "echo 'INTERACTIVE SHELL TEST' >>/tmp/file.txt"

10.1.1.1 jest zwykłym debianem, tworzy się plik i normalnie odkłada w nim podany tekst. Bez żadnego kombinowania.

_________________
http://eko.one.pl - prawie wszystko o OpenWrt


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 25 wrz 2021, 12:04 
Offline
Użytkownik

Rejestracja: 13 lis 2013, 22:07
Posty: 24
Tak, taka konstrukcja działa. Ale jeśli dodam przełącznik -t do polecenia (tak jak wskazałem wyżej), to już plik nie jest uzupełniany. Dodam, że w miejscu 'INTERACTIVE SHELL TEST' wcześniej był zestaw poleceń lokalnie generujących bieżący czas, nazwę hosta i adres IP interfejsu WAN - i bez przełącznika -t (albo z -T) każda taka konfiguracja działa, ale nie wykazuje wtedy aktywności, tj. docelowy system operacyjny nie uwzględnia tego logowania w swojej historii. Dlatego chciałem posłużyć się parametrem -t, ale wówczas żadne polecenie nie jest wykonywane po stronie zdalnej. Próba przekierowania wejścia z /dev/zero i wyjścia/błędów na plik lokalny generuje pusty plik (bądź nic nie dopisuje). System docelowy w moim przypadku to FreeBSD 12.2, powłoką po zalogowaniu jest bash.

Generalnie chciałbym logować się na koncie, na którym trzymam swoje rzeczy, ale nielogowanie się na nim przez jakiś czas powoduje blokadę i późniejsze usunięcie go, bo traktowane jest to tak jakby nie było używane. A że ja go używam ostatnio dość często, tylko nie od strony SSH, i obawiam się że mogę czasem zapomnieć się zalogować, to wolałbym to robić z automatu, z miejsca które kontroluję i mam pod ręką. Jeśli kiedyś okaże się że ten automat już nie działa, to będzie najpewniej równoznaczne z tym, że już tego konta nie potrzebuję, i wtedy słusznie nie będzie do niego dostępu.


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 25 wrz 2021, 12:25 
Offline
Administrator
Awatar użytkownika

Rejestracja: 10 kwie 2010, 00:28
Posty: 13956
Lokalizacja: Warszawa
A zamiast tych poleceń jak wykonasz skrypt który wykonuje te polecenia?

_________________
http://eko.one.pl - prawie wszystko o OpenWrt


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
 Tytuł: Re: [HOWTO] SSH bez hasła pomiędzy routerami.
Post: 25 wrz 2021, 12:33 
Offline
Użytkownik

Rejestracja: 13 lis 2013, 22:07
Posty: 24
Mam taki wpis w /etc/crontabs/koz (zmienione nazwy i godziny, ale reszta taka sama) - nie działa:
20 3 * * * HOME=~koz ssh -l kozi -i ~koz/.ssh/id_dropbear -t host1.webhosting.pl "echo $(date -Iseconds | cut -d '+' -f 1 | sed 's/T/ /g') $(cat /proc/sys/kernel/hostname) $(ifconfig wan | grep -w inet | awk '{print $2}' | cut -d ':' -f 2) >>~/uptime.txt"


Ale jeśli usunę z niego -t, to jest teoretycznie OK, tylko system zdalny nie uwzględnia tego jako logowanie - ergo: nie przedłuża mi czasu aktywności konta. Wariant z -t działa z wiersza poleceń OpenWrt.

//edit: Inna sprawa, że dzięki takim poleceniom mogę np. wykonywać jakieś backupy na dysku podłączonym do rutera, tylko wolałbym żeby to się odbywało właśnie z uwzględnieniem logowania w historii. Pamiętam że kiedyś mi to działało, nie mam niestety już tamtego polecenia.


Na górę
 Wyświetl profil  
Odpowiedz z cytatem  
Wyświetl posty nie starsze niż:  Sortuj wg  
Nowy temat Odpowiedz w temacie  [ Posty: 19 ] 

Strefa czasowa UTC+1godz. [letni]


Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 48 gości


Nie możesz tworzyć nowych tematów
Nie możesz odpowiadać w tematach
Nie możesz zmieniać swoich postów
Nie możesz usuwać swoich postów

Szukaj:
Przejdź do:  
cron
designed by digi-led.pl
...Copyright © 2010-2013, Ekipa openrouter.info