Program ssh (Secure Shell) służy do logowania się na zdalne komputery (przez sieć) i zdalnego wykonywania komend. W przeciwieństwie do programów typu rsh czy telnet oferuje bezpieczną, szyfrowaną komunikację, uniemożliwia więc ewentualne podsłuchiwanie transmisji. Autoryzacja użytkownika może się odbywać na kilka sposobów. Najprostszym jest autoryzacja przy pomocy podawanego przez użytkownika hasła. Po uruchomieniu komendy:
ssh login@hostprogram pyta się o hasło. login oznacza tu nazwę użytkownika, a host nazwę komputera, np. kazik@mail.praterm.com.pl. Często przydatne jest, aby ssh nie pytał się o hasło - umożliwia to między innymi wygodne używanie ssh z programów nieinterakcyjnych (np. przez system BODAS).
Skonfigurowanie ssh wymaga kilku prostych kroków:
W systemie muszą być zainstalowane odpowiednie pakiety, zawierające między innymi program ssh (pod Debianem są to pakiety openssh-client dla programu ssh i openssh-server dla serwera ssh). Praktycznie wszystkie współczesne dystrybucje Linuksa zawierają domyślnie te pakiety.
Następnie można skonfigurować ssh tak, żeby nie było konieczne podawanie hasła.
Załóżmy, że np. użytkownik janosik na komputerze alpha chce się logować na komputer beta jako użytkownik ondraszek. W tym celu janosik musi sprawdzić, czy w jego katalogu domowym, w podkatalogu .ssh znajdują się pliki id_rsa i id_rsa.pub. Pliki te zawierają klucz prywatny i publiczny. Jeżeli ich nie mamy, to możemy je stworzyć przez wywołanie:
ssh-keygen -t rsaNa zadawane przez program pytania należy odpowiadać naciskając po prostu Enter, czyli wybierając wartości domyślne.
Plik .ssh/id_rsa jest naszym kluczem publicznym - należy go chronić i nikomu nie udostępniać. Natomiast plik .ssh/id_rsa.pub kopiujemy na konto użytkownika ondraszek na komputerze beta i dodajemy do pliku .ssh/authorized_keys2 - jeżeli tego pliku nie ma, musimy go stworzyć. Sekwencja komend do wykonania mogłaby wyglądać tak:
scp .ssh/id_rsa.pub ondraszek@beta: ssh ondraszek@beta mkdir -p .ssh cat id_rsa.pub >> .ssh/authorized_keys2Ważne jest też ustawienie odpowiednich praw zapisu - katalog .ssh powinien mieć tylko prawa odczytu i zapisu dla właściciela, a plik authorized_keys2 dodatkowo prawa odczytu dla innych. Jeżeli uprawnienia będą nieprawidłowe, ssh odmówi użycia klucza. Właściwe uprawnienia użytkownik ondraszek może ustawić przez wykonanie komend:
chmod 0700 ~/.ssh chmod 0644 ~/.ssh/authorized_keys2
Teraz, po wpisaniu przez użytkownika janosik na komputerze alpha polecenia
ssh ondraszek@betapowinno nastąpić zalogowanie na komputer beta, bez pytania o hasło.
W razie wystąpienia problemów z autoryzacją trzeba uruchomić ssh w trybie verbose (ssh -v). Program wyświetli wtedy błędy, co znacznie ułatwia rozpoznanie problemu.
Powyższy opis odnosi się do wersji drugiej protokołu SSH. W starszych dystrybucjach Linuksa domyślnie używana była wersja 1 protokołu. Dla wersji tej zamiast pliku authorized_keys2 używany był plik authorized_keys, generowany był klucz typu RSA1 (czyli do generacji klucza wywołanie ssh-key -t rsa1), klucz domyślnie umieszczany był w plikach identity i identity.pub. Używaną wersję protokołu można wymusić przez wpis Protocol 2,1 w pliku /etc/ssh/ssh_config (ważna jest kolejność liczb, można też zostawić tylko jedną liczbę) lub przez opcję w linii poleceń ssh, np. -1. Obecnie używanie wersji 1 protokołu nie jest zalecane, ze względu na mniejsze bezpieczeństwo.
Plikiem konfiguracyjnym dla klienta ssh jest /etc/ssh/ssh_config. Oprócz wspomnianej wyżej wersji protokołu możemy ustawić globalnie kilka innych parametrów, między innymi.:
StrictHostKeyChecking - ustawienie, czy klient ssh może automatycznie dodawać hosty do pliku ~/.ssh/known_hosts. Przyjmuje jedną z trzech wartości: 'yes', 'no' lub 'ask' (wartość domyślna). Jeżeli ustawimy na 'yes', to wpisy będą dodawane automatycznie, 'no' oznacza, że będziemy musieli wpisy dodawać ręcznie, natomiast 'ask' oznacza, że ssh sam będzie dodawał wpisy po potwierdzeniu użytkownika.
Uwaga - jeśli dodamy klucz jakiegoś komputera do pliku known_hosts i będziemy próbowali połączyć się z innym komputerem (o innym kluczu) używającym z jakiegoś powodu tego samego IP (częste, jeśli np. lokalne adresy IP w różnych sieciach, z których korzystamy się pokrywają), ssh podniesie alarm, podejrzewając że ktoś "podmienił" komputer, na który chcemy się zalogować. W szczególności nie pozwoli na zalogowanie się na taki komputer z użyciem hasła (logowanie po wymianie kluczy mimo ostrzeżenia będzie możliwe). Aby zalogować się za pomocą hasła, musimy ręcznie w edytorze tekstowym usunąć odpowiednią linię z pliku .ssh/known_hosts. Każdy klucz trzymany jest w osobnej linii, ssh poda w ostrzeżeniu numer linii, o którą chodzi.
ssh -o StrictHostKeyChecking=no ondraszek@beta
Plikiem konfiguracyjnym dla serwera SSH jest plik /etc/ssh/sshd_config.
Często jest potrzeba do dostania się maszyny "schowanej" za bramką internetową. W przypadku rozwiązań typu NAT lub Masquarading, bezpośrednie połączenie się ze schowanym komputerem z zewnątrz nie jest możliwe. Możliwa jest natomiast inicjalizacja połączenia ssh z docelowego komputera i zalogowanie się na niego przez tak zwany tunel zwrotny.
Tunel ten tworzymy wywołując na docelowym komputerze następujące polecenie:
ssh user@server -R 7777:localhost:22Podany numer portu - 7777 - jest przykładowy. Może być to dowolny numer portu nieużywany na komputerze server. Takie polecenie spowoduje utworzenie tunelu zwrotnego - na docelowy komputer można się zalogować z komputera server przez wydanie polecenia:
ssh localhost -p 7777Jeżeli tunel ma być aktywny przez dłuższy czas, warto uruchamiając tunel podać dodatkowe polecenie, którego aktywność zabezpieczy przez zerwaniem połączenia uznanego za nieużywane. Przykładowo:
ssh user@server -R 7777:localhost:22 "/bin/sh -c 'while true; do sleep 5; \ echo +; done'"
Jeszcze lepszym rozwiązaniem jest użycie programu autossh (w Debianie paczka o takiej samej nazwie). Program ten pozwala na uruchomienie tunelu z wykorzystaniem dodatkowego portu monitorującego - zerwane lub zablokowane połączenia są automatycznie wznawiane. Przykładowe wywołanie autossh mogłoby wyglądać następująco:
autossh -fN -M 7778 -R 7777:localhost:22 user@serverOpcja -f powoduje przejście autossh w tło, opcja -N jest przekazywana do ssh - zakazuje wykonywania komend - tylko przekierowywanie portów (zwiększa to bezpieczeństwo). Numer portu do monitorowania, tu przykładowo 7778, może być również dowolny, ale unikalny.
Oczywiście pozostaje problem, jak na docelowym komputerze, który jest niedostępny, uruchomić tunel. Możemy podyktować odpowiednie polecenie przez telefon, ale na dłuższą metę warto dodać albo odpowiednie wywołanie ssh np. do crontaba, albo uruchomienie autossh przez skrypty startowe systemu.
Notatka: Oprogramowanie SZARP zawiera zarówno gotowy skrypt ssh_tunel.sh, jak i paczkę szarp-tunnel, wykorzystującą autossh do uruchomienia tunelu zwrotnego.
Poprzedni | Spis treści | Następny |
Diagnozowanie problemów z pppd | Początek rozdziału | Tunelowanie połączeń X-Windows |