SSH daje ci powłokę na zdalnej maszynie przez szyfrowany kanał. Do pierwszego logowania potrzebujesz czterech danych: adresu hosta, portu, nazwy użytkownika i metody uwierzytelnienia. Polecenie ma postać ssh uzytkownik@host, a każda odmowa połączenia ma inny komunikat i inny pierwszy odczyt.
Ta strona prowadzi od pustego terminala do działającej sesji, potem od hasła do klucza, a na końcu od komunikatu błędu do przyczyny. Konfigurację serwera po stronie sshd traktujemy jako osobny krok, nie jako część pierwszego logowania.
Co robi SSH i czego za ciebie nie zrobi?
Secure Shell to protokół zdalnego dostępu opisany w RFC 4251-4254. Po zestawieniu połączenia dostajesz to samo, co po zalogowaniu na fizycznej konsoli serwera: powłokę, w której polecenia wykonują się na tamtej maszynie. Cała transmisja - hasło, treść poleceń i wynik - idzie kanałem szyfrowanym, więc pośrednik po drodze widzi ruch, ale nie widzi jego zawartości.
Trzy rzeczy dzieją się w tej samej chwili i warto je rozdzielić, bo każda psuje się osobno. Serwer przedstawia się swoim kluczem hosta, żebyś wiedział, z którą maszyną rozmawiasz. Ty przedstawiasz się hasłem albo kluczem, żeby serwer wiedział, kim jesteś. Dopiero potem system decyduje, co wolno ci na tej maszynie zrobić. Pierwsza część odpowiada za komunikat o zmienionym kluczu hosta, druga za Permission denied (publickey), a trzecia za odmowę uprawnień już wewnątrz systemu plików.
SSH nie otwiera dostępu, którego nie masz. Jeśli hosting współdzielony nie udostępnia powłoki, żadna komenda tego nie obejdzie - dostęp do terminala jest funkcją planu usługi, którą sprawdzasz w panelu albo u dostawcy, zanim zaczniesz diagnozować cokolwiek innego. Na własnym serwerze VPS masz go z definicji, razem z obowiązkiem jego pilnowania.
Zbierz cztery dane, zanim otworzysz terminal
Zapisz je sobie obok, bo każda pomyłka w tych czterech polach daje inny błąd i wysyła diagnozę w złą stronę.
| Dana | Skąd ją weźmiesz | Czym grozi pomyłka |
|---|---|---|
| Adres hosta | panel dostawcy albo nazwa domeny wskazująca na serwer | próba logowania na cudzą maszynę albo brak odpowiedzi |
| Port | panel dostawcy; standard protokołu to 22, ale dostawcy bywają przestawieni na inny | odmowa na poziomie portu, chociaż serwer działa |
| Nazwa użytkownika | panel, umowa albo osoba, która zakładała konto | odrzucone uwierzytelnienie mimo dobrego hasła |
| Metoda uwierzytelnienia | ustawienie serwera: hasło, klucz albo oba | pytanie o hasło, którego serwer nie przyjmie |
Ustal też, gdzie wpisujesz polecenie. Terminal na laptopie i sesja na serwerze wyglądają identycznie, a odpowiadają na pytania o dwie różne maszyny - ten sam nawyk obowiązuje przy wszystkich poleceniach administracyjnych.
W przykładach niżej uzytkownik, host.przyklad.pl i PORT to miejsca do podstawienia twoimi wartościami, nie gotowe fragmenty do wklejenia.
Pierwsze połączenie krok po kroku
- Uruchom
ssh uzytkownik@host.przyklad.pl. Klient OpenSSH jest wbudowany w macOS, Linux i Windows w wersjach z opcjonalnym komponentem OpenSSH Client, więc osobny program nie jest potrzebny. - Gdy serwer słucha na innym porcie, dodaj
-p PORT:ssh -p PORT uzytkownik@host.przyklad.pl. - Przy pierwszym połączeniu klient pokaże odcisk klucza hosta i zapyta, czy chcesz kontynuować. Porównaj ten ciąg z odciskiem podanym przez dostawcę w panelu albo w wiadomości o utworzeniu serwera. Zgadza się - potwierdź; nie zgadza się - przerwij i wyjaśnij rozbieżność, zanim wpiszesz jakiekolwiek hasło.
- Po potwierdzeniu klient zapisze klucz hosta w pliku
~/.ssh/known_hostsi przy kolejnych logowaniach sprawdzi go bez pytania. - Zaloguj się hasłem albo kluczem, zależnie od ustawienia serwera.
Sprawdź, gdzie faktycznie wylądowałeś. hostname wypisze nazwę maszyny, id tożsamość konta, a pwd katalog startowy. Trzy odczyty, żaden nic nie zmienia, a razem odpowiadają na pytanie, czy sesja prowadzi tam, gdzie zamierzałeś. Sesję kończysz poleceniem exit.
Krok trzeci jest jedynym, którego nie da się nadrobić później. Odcisk klucza hosta potwierdza się przy pierwszym połączeniu albo nie potwierdza wcale - po zapisaniu wpisu do known_hosts klient przestaje pytać i przyjmuje ten klucz jako prawdę o serwerze.
Jak przejść z hasła na klucz?
Klucz zastępuje hasło parą plików: prywatny zostaje u ciebie, publiczny trafia na serwer. Serwer sprawdza, czy masz odpowiadający klucz prywatny, a sam sekret nigdy nie idzie po sieci. Przy okazji znikają logowania hasłem, które zgaduje pierwszy lepszy skaner.
- Uruchom
ssh-keygen -t ed25519 -C "opis-do-czego-ten-klucz", żeby wygenerować parę kluczy. Ed25519 jest domyślnym typem w nowszych wydaniach OpenSSH i wystarcza do dostępu administracyjnego. - Ustaw hasło do klucza prywatnego, gdy generator o nie zapyta. Klucz bez hasła oznacza, że kopia pliku z laptopa daje dostęp do serwera każdemu, kto ją zdobędzie.
- Wgraj klucz publiczny na serwer poleceniem
ssh-copy-id -p PORT uzytkownik@host.przyklad.pl. Polecenie dopisze zawartość pliku.pubdo~/.ssh/authorized_keysna serwerze, bez nadpisywania wpisów, które już tam są. - Zaloguj się ponownie i potwierdź, że serwer nie pyta o hasło konta. Dopiero ten test dowodzi, że klucz działa.
- Nazwy hostów, porty i użytkowników zapisz w pliku
~/.ssh/config, żeby nie wpisywać ich za każdym razem.
Wpis w ~/.ssh/config wygląda tak i skraca całe polecenie do ssh produkcja:
Host produkcja
HostName host.przyklad.pl
User uzytkownik
Port PORT
IdentityFile ~/.ssh/id_ed25519
Za tę wygodę płaci się ryzykiem pomyłki, bo skrót produkcja wygląda w terminalu tak samo niepozornie jak skrót do maszyny testowej, więc nazywaj wpisy tak, żeby jednym spojrzeniem odróżnić serwer produkcyjny od reszty.
Freelancer wdraża stronę na serwerze klienta. Klucz wygenerował bez hasła, bo tak było szybciej, i skopiował go na drugi komputer, żeby móc pracować z domu. Po zakończeniu współpracy klient zmienił hasło do panelu i uznał sprawę za zamkniętą. Wpis w
authorized_keyszostał nienaruszony, bo hasło do panelu i klucz SSH to dwa niezależne wejścia do maszyny. Odebranie dostępu przez klucz oznacza usunięcie wpisu z plikuauthorized_keysna serwerze - i nic innego tego nie zastąpi. To fikcyjna scena, ale każdy jej element zdarza się naprawdę.
Odwrotność tej sceny jest równie kosztowna. Wyłączenie logowania hasłem, zanim potwierdzisz działające logowanie kluczem, zamyka cię przed własnym serwerem. Kolejność jest zawsze ta sama: najpierw działający klucz potwierdzony logowaniem, dopiero potem zmiana ustawień sshd - a druga sesja SSH otwarta w tle na czas tej zmiany kosztuje zero i ratuje dostęp, gdy konfiguracja okaże się błędna.
Dlaczego SSH nie wchodzi?
Komunikat rozstrzyga, gdzie szukać. Tabela rozdziela cztery odmowy, które w potocznej rozmowie nazywa się tak samo - "nie mogę się połączyć".
| Objaw | Co odpada z gry | Pierwszy odczyt |
|---|---|---|
Connection refused |
serwer odpowiada, ale na tym porcie nikt nie nasłuchuje | sprawdź numer portu, potem ss -ltnp na maszynie, jeśli masz do niej inne wejście |
| Oczekiwanie zakończone limitem czasu | pakiet nie dochodzi albo nie wraca | ustal, czy adres jest poprawny i czy po drodze nie stoi zapora albo lista dozwolonych adresów |
Permission denied (publickey) |
maszyna i port są dobre, odrzucone jest uwierzytelnienie | sprawdź nazwę użytkownika i to, czy klucz publiczny faktycznie leży w authorized_keys tego konta |
Host key verification failed |
serwer przedstawił inny klucz hosta niż zapisany w known_hosts |
wyjaśnij, dlaczego klucz się zmienił, zanim cokolwiek skasujesz |
Pierwszy wiersz i drugi to ta sama klasa problemu co odmowa połączenia w przeglądarce - warstwa sieci i portu, jeszcze przed jakimkolwiek logowaniem. Trzeci wiersz dotyczy tożsamości. Czwarty jest jedynym, który wymaga ostrożności zamiast szybkiego działania.
Wpisy w known_hosts kasuje się dopiero po ustaleniu przyczyny. Klucz hosta zmienia się po przeinstalowaniu systemu, migracji maszyny albo odtworzeniu jej z kopii - i wtedy nowy odcisk potwierdzasz u dostawcy tak samo jak przy pierwszym logowaniu. Skasowanie wpisu bez tego ustalenia usuwa jedyne ostrzeżenie, jakie klient ma dla ciebie o podmienionym serwerze.
Osobno stoi komunikat o zbyt szerokich prawach do klucza prywatnego. Klient odmawia użycia pliku, do którego dostęp mają inni użytkownicy maszyny - klucz prywatny ma być czytelny wyłącznie dla właściciela, a katalog ~/.ssh dostępny wyłącznie dla niego. To ten sam mechanizm, który opisuje zmiana uprawnień plików, tylko wymuszony przez klienta zamiast przez system.
Jeśli po zalogowaniu widzisz odmowy przy konkretnych plikach, to już nie jest problem SSH. Sesja stoi, a odmawia system plików - dalsza diagnoza należy do błędu Permission denied wewnątrz systemu, nie do klienta SSH.
Co dalej ustawić po stronie serwera?
Trzy zmiany w pliku /etc/ssh/sshd_config zmniejszają powierzchnię ataku, a każda ma warunek, którego nie wolno pominąć:
- Wyłączenie logowania hasłem - wykonalne dopiero po potwierdzonym logowaniu kluczem dla każdej osoby, która ma dostęp do tej maszyny.
- Wyłączenie bezpośredniego logowania na konto
root- wymaga wcześniejszego konta zwykłego użytkownika z prawem podniesienia uprawnień. - Ograniczenie dostępu do wskazanych kont - wymaga listy osób, która nie zostawia poza nią nikogo pracującego na serwerze.
Każdą zmianę sprawdzasz przed przeładowaniem usługi poleceniem sshd -t, które waliduje składnię konfiguracji. Po przeładowaniu otwórz połączenie z drugiego terminala, nie zamykając bieżącej sesji. Bieżąca sesja żyje niezależnie od nowej konfiguracji i jest twoją drogą powrotu, gdy nowe połączenie nie wejdzie.
Przeniesienie usługi na port inny niż standardowy zmniejsza liczbę wpisów w logach z automatycznych skanów, ale nie jest zabezpieczeniem - port da się wykryć skanowaniem. Traktuj to jako sprzątanie logów, nie jako ochronę konta.
Kiedy SSH przestaje być właściwym narzędziem?
Kopiowanie plików przez otwartą sesję i ręczne przeklejanie zawartości kończy się rozjazdem między maszynami. Do przenoszenia danych po tym samym szyfrowanym kanale służy synchronizacja plików przez rsync, z próbnym uruchomieniem przed właściwym transferem. Do jednorazowego skopiowania pojedynczego pliku wystarczy scp z pakietu OpenSSH.
Powtarzalne zadania administracyjne też przestają być pracą dla ręcznej sesji. Gdy to samo polecenie wykonujesz na kilku maszynach, wraca ono jako skrypt albo zadanie w harmonogramie, a rola SSH ogranicza się do transportu. Co i w jakiej kolejności uruchamiać na samym serwerze, opisuje osobno mapa poleceń administratora, a podział odpowiedzialności za maszynę - strona o serwerze i jego utrzymaniu.
Pytania o SSH
Czym różni się SSH od SSL?
Odpowiadają na dwa różne pytania. SSH daje zdalną powłokę i uwierzytelnia konkretne konto na konkretnej maszynie, kluczem albo hasłem. TLS, potocznie nazywany SSL, szyfruje ruch aplikacji takich jak strona WWW i uwierzytelnia serwer certyfikatem od zaufanego wystawcy. Mechanizm certyfikatu opisuje strona o SSL i TLS.
Czy do SSH potrzebuję programu PuTTY?
Nie. Klient OpenSSH jest wbudowany w macOS, Linux i Windows z zainstalowanym komponentem OpenSSH Client, więc polecenie ssh działa prosto z terminala albo PowerShella. PuTTY pozostaje wygodnym wyborem tam, gdzie potrzebujesz graficznego menedżera zapisanych sesji, ale niczego nie odblokowuje.
Jak sprawdzić, czy serwer w ogóle przyjmuje połączenia SSH?
Zacznij od komunikatu, który dostajesz przy próbie logowania - on rozstrzyga więcej niż jakikolwiek test dostępności. Odmowa na porcie znaczy, że maszyna odpowiada, ale usługa nie nasłuchuje pod tym numerem. Brak odpowiedzi do wyczerpania limitu czasu wskazuje na adres albo zaporę po drodze.
Co zrobić, gdy zgubię klucz prywatny?
Wygeneruj nową parę i wgraj nowy klucz publiczny na serwer inną, wciąż działającą drogą - drugim kluczem, dostępem hasłem albo konsolą awaryjną w panelu dostawcy. Potem usuń stary wpis z pliku authorized_keys, bo bez tego zgubiony klucz nadal otwiera konto.
Czy hosting współdzielony daje dostęp przez SSH?
To zależy od planu usługi, nie od twojego komputera. Część dostawców udostępnia powłokę w wyższych planach i podaje w panelu host, port oraz nazwę użytkownika; część nie udostępnia jej wcale. Sprawdź to w panelu przed diagnozowaniem połączenia, bo brak uprawnienia do powłoki wygląda tak samo jak błąd konfiguracji.
Źródła
Opis protokołu i jego części opiera się na dokumentach RFC 4251-4254 organizacji IETF oraz na podręcznikach projektu OpenSSH dla poleceń ssh, ssh-keygen, ssh-copy-id, sshd i pliku ssh_config. Dostępność klienta OpenSSH w systemie Windows opisuje dokumentacja Microsoft Learn.