Postanowiłem zebrać dla potomnych (i dla siebie, w razie jakbym czegoś zapomniał) kilka informacji, które ułatwią używanie tego narzędzia oraz pokać inne potencjalne zastosowania inne niż zdalne logowanie.
Automatyczna autoryzacja
Logowanie do zdalnej maszyny jest trywialne:
ssh -llogin nazwa-serwera
potem podajemy hasło i gotowe. Problem pojawia się gdy hasło wygląda tak:
z7kw=TQksHO!CVGSMXmX#5K42hK@ePMQs6(YS
SSH (na szczęście) nie pamięta haseł, ani nie pozwala podawać ich w postaci przełącznika (wtedy można by zapisać hasło w jakimś skrypcie). Jest jednak proste rozwiązania tego problemu – autoryzacja przez parę: klucz prywatny – klucz publiczny.
Cała operacja sprowadza się do trzech kroków: wygenerowania ww. pary, umieszczenia w ustawieniach użytkownika klucza prywatnego i skopiowania na maszynę zdalną klucza prywatnego.
Nie będę przepisywał sczegółowej instrukcji, którą znajdziecie tutaj: http://www.csua.berkeley.edu/~ranga/notes/ssh_nopass.html
Aliasy
Wpisanie nazwy użytkownika i nazwy serwera jako argumentów polecenia nie jest zbyt kłopotliwe, dopóki nie wygląda to tak (przykład skrajny :) ):
ssh -p 1234 -leustachybrzeczyszczykiewicz serwer-osiemnasty.szafa-trzydziestadruga.siec-szkieletowa.funnela.com
Z pomocą przychodzi plik konfiguracyjny, który dostępny jest pod ścieżką ~/.ssh/config (jak go nie ma, to trzeba sobie zrobić).
Można w nim ustawić na prawdę wiele rzeczy (zachęcam do lektury: man ssh_config ), ale nas w tej chwili interesuje najbardziej trywialna: aliasy.
Po dodaniu takiego wpisu do konfiguracji:
Host s18s32
HostName serwer-osiemnasty.szafa-trzydziestadruga.siec-szkieletowa.funnela.com
Port 1234
User eustachybrzeczyszczykiewicz
HostKeyAlias serwer18szafa32
pan Eustachy, aby dostać się na serwer osiemnasty w trzydziestej drugiej szafie wpisuje po prostu:
ssh s18s32
lub
ssh serwer18szafa32
I nie musi już pamiętać nazwy serwera, numeru portu czy nazwy użytkownika. Przede wszystkim nie musi tego za każdym razem wpisywać.
Przekierowywanie portów
Bardzo przydatną w specyficznych sytuacjach funkcją SSH jest możliwość przekierowania portów dowolnej zdalnej maszyny na komputer lokalny. Rozważmy taki przykład:
Nadgorliwy administrator sieci zablokował praktycznie wszystkie usługi. Nawet HTTP kuleje – nie da się wysłać większej porcji danych POST. Na szczęscie działa SSH. (tak jest skonfigurowana sieć Politechniki Poznańskiej).
My chcemy z takiej sieci zrobić commit SVN ( port: 3690 ) lub połączyć się z bazą danych.
Na pomoc przychodzi oczywiście SSH.
Przy okazji połączenia SSH stawiamy tunel, który mapuje porty jakiejś zdalnej maszyny (np. tej na którą logujemy się przez SSH) na porty lokalne.
W tym celu do pliku konfiguracyjnego dopisujemy linijkę w formacie:
LocalForward <port lokalny> <maszyna zdalna>:<port zdalny>
np:
Host tunnel
HostName serwer-pierwszy.funnela.com
User root
LocalForward 3690 localhost:3690
LocalForward 5432 localhost:5432
LocalForward 8080 router.funnela.com:8080
po zestawieniu połączenia ( ssh tunnel ), możemy połączyć się z komputerem lokalnym na porcie 3690 aby uzyskać połączenie z SVN na serwerze pierwszym. Analogicznie dla Postgresa.
Aby nie mieć w programach klienckich dwóch konfiguracji dla połączenia przez tunel ( połączenie z localhost ) i bezpośrednio, można zastosować prosty trick. Po połączeniu tunelu należy dodać do /etc/hosts wpis, który powiąże nazwę serwera ( serwer-pierwszy.funnela.com ) z adresem 127.0.0.1. Od tej chwili wszelkie połączenia SVN lub Postgres z serwer-pierwszy.funnela.com będą szły przez tunel i zgrabnie ominą firewalla.
Podobnie będą działały połączenia z localhost na porcie 8080, jednak tym razem zostaną przekierowane na zupełnie inną maszynę (router).
SOCKS Proxy
W celu ominięcia firewalla lub w przypadku konieczności połączenia się z użyciem innego zewnętrznego adresu IP, możemy również skorzystać z kolejnej przydatnej funkcji SSH – SOCKS proxy. Podczas nawiązywania połączenia ze zdalnym serwerem, możemy użyć przełącznika -D wraz z numerem lokalnego portu. Podczas takiego połączenia nasz komputer lokalny będzie działał jako serwer SOCKS. Wystarczy teraz w ustawieniach programu klienckiego (lub ustawieniach sieci np. w Max OS X) wskazać, żeby połączenie odbywało się przez serwer SOCKS pod adresem localhost na podanym wcześniej porcie. Możemy teraz cieszyć się połączeniem przekierowanym przez nasz serwer SSH.
Serwer proxy jest znacznie prostszy w konfiguracji niż przekierowywanie portów – nie wymaga konfiguracji każdej usługi oddzielnie. Ma jednak sporą wadę: nie wszystkie programy potrafią korzystać z proxy, więc jego zastosowanie ogranicza się głównie do przeglądarki internetowej.
Oczywiście połączenie przez SSH jest zawsze szyfrowane, więc korzystanie z SOCKS lub przekierowywania portów nie tylko pozwala ominąć blokadę portów w sieci, ale również chroni nas przed analizą pakietów przez dynamiczny firewall bądź przechwyceniem ich przez intruza.