Czasem może przydarzyć się nam sytuacja kiedy musimy nawiązać połączenie przez sieć (LAN czy WAN) ze zdalną usługą, która nie jest szyfrowana. Przykładem może być serwer WWW nie wspierający szyfrowania, serwer baz danych, zdalny pulpit rodzaju VNC itp. Połączenie takie nie będzie bezpieczne ponieważ istnieje możliwość przechwycenia i oglądania nieszyfrowanego ruchu a tym samym naszych danych. W takich danych mogą być loginy, hasała lub inne dane wrażliwe. Sytuacja wygląda zazwyczaj tak:
W tym przykładzie na zdalnej maszynie mamy serwer Apache, który nie obsługuje szyfrowania. Z przeglądarki klienta łączymy się więc na port 80 serwera czyli wykonujemy połączenie nieszyfrowane. Cała treść transmitowana między klientem a serwerem stoi otworem dla ewentualnego napastnika. Zakładamy, że nasza usługa sieciowa pracuje na serwerze i jest dostępna na adresie IP i określonym porcie (TCP lub UDP, to nie ma teraz znaczenia). W naszym wypadku jest to serwer Apache i nasłuchuje na podanym adresie IP i porcie 80.
Poniżej przykład przechwyconego ruchu, w którym pobrano stronę WWW z serwera.
Jak widać cała treść strony jest dostępna. Co zatem zrobić aby w takie sytuacji podnieść bezpieczeństwo? Zakładamy, że nie możemy uruchomić szyfrowania naszej usługi sieciowej. Odpowiedzią jest: tunel SSH.
Tunel SSH na bazie putty (Windows)
Wykonamy z klienta Windows do serwera Linux (trzeba mieć na nim konto) połączenie szyfrowane SSH. Na bazie tego połączenia zostaną nieco zmodyfikowane porty z jakich będziemy korzystać. Przeglądarka internetowa wykonuje połączenie do serwera WWW z losowego, wysokiego portu klienta na port 80 serwera WWW (HTTP, połączenie nieszyfrowane). Jeśli chcemy taką transmisję zabezpieczyć to możemy zmienić konfigurację serwera aby nasłuchiwał na adresie lokalnym pętli zwrotnej serwera (127.0.0.1), port pozostanie ten sam choć możemy go zmienić. Nasłuchiwanie na adresie zewnętrznym (w naszym przykładzie 192.168.55.102) można wyłączyć. Efekt będzie taki, że teraz z sieci LAN/WAN nikt bezpośrednio nie dostanie się do usługi WWW co może podnieść bezpieczeństwo takiej usługi choć zależy od wymagań i sytuacji. Dostęp możliwy będzie jedynie z lokalnie uruchamianych programów (lokalnie czyli na serwerze). Jak zatem dostać się do usługi sieciowej? Rozwiązaniem jest właśnie Tunel SSH.
Z komputera klienckiego łączymy się tunelem SSH do serwera. Dodatkowo wykonamy „przekierowanie” gniazda 127.0.0.1:10000 z komputera klienckiego na gniazdo 127.0.0.1:80 serwera. Zapewni to zaszyfrowanie (za pomocą tunelu SSH) nieszyfrowanego ruchu WWW. Gniazdo 127.0.0.1:1000 oznacza, że teraz na komputerze klienckim program SSH nasłuchuje żądań przeglądarki na adresie pętli zwrotnej (127.0.0.1) na porcie 10000. Tutaj można podać dowolny port, ale nie kolidujący z usługą pracującą na komputerze klienckim.
Teraz klient SSH ze swojego adresu IP i losowego portu nawiązuje połączenie szyfrowane (ssh) do serwera SSH pracującego na maszynie zdalnej na jej adres IP (w naszym przykładzie 192.168.55.102) i na port, na którym zdalny SSH nasłuchuje (standardowo 22). Dodatkowo SSH przekieruje teraz port 10000 z komputera klienckiego na gniazdo 127.0.0.1:80 na maszynie zdalnej Na bazie takiego zaszyfrowanego połączenia wykonywane teraz może być nieszyfrowane połączenie WWW. Inaczej mówiąc SSH nasłuchuje teraz na komputerze klienckim na adresie 127.0.0.1 i porcie 10000. Wszystko co tam „wpadnie” zostanie wysłane tunelem SSH na port serwera WWW po drugiej stronie połączenia. W ten sposób można przekierować i zabezpieczyć dowolną usługę sieciową. Połączenie WWW zatem pracuje teraz na bazie połączenia (tunelu) SSH.
Procedura jest taka:
– najpierw nawiązujemy połączenie SSH klient -> serwer (z przekierowanymi portami)
– na bazie powyższego nawiązujemy połączenie w wybraną usługą sieciową pracującą na zdalnej maszynie
Konfiguracja putty:
a) Ustalamy adres serwera (z naszą usługą docelową i pracującym ssh)
b) Określamy na jakim porcie lokalnym (klient) nasłuchuje putty oraz na jaki adres IP i port zdalny ma być ruch przekierowany (najczęściej będzie to adres pętli zwrotnej na maszynie zdalnej, do której się łączymy przez SSH)
c) klikamy Add, wracamy do sekcji Session, zapisujemy ją i łączymy się klikając Open
W oknie jakie się pojawi klikamy Tak aby zapisać elektroniczny odcisk palca serwera.
Kolejno trzeba się zalogować do SSH aby zestawić tunel
Od tego momentu aby połączyć się (tym razem już bezpiecznie) ze zdalną usługą wpisujemy w kliencie (w naszym przykładzie przeglądarka) adres pętli zwrotnej 127.0.0.1 i podany w putty port lokalny (tutaj 10000).
Tunel SSH na bazie ssh (Linux)
Połączenie między systemami Linux wygląda następująco:
ssh superu@192.168.55.102 -L 10000:127.0.0.1:80
W podanym przykładzie „superu” to nazwa konta na maszynie zdalnej. Użyj swojej nazwy logowania. Opcja „-L” dokonuje przekierowania lokalnego portu 10000 na port 80 nasłuchujący na interfejsie pętli zwrotnej na maszynie zdalnej.