Po wcześniejszych artykułach nasze laboratorium potrafi już całkiem sporo. Hosty mają poprawnie skonfigurowane interfejsy sieciowe, znają swoje adresy IP, potrafią rozwiązywać nazwy hostów, a dzięki routingowi komunikują się także pomiędzy różnymi podsieciami. To idealny moment, żeby dołożyć kolejną bardzo praktyczną warstwę, czyli zdalne zarządzanie systemami przez SSH.
I właśnie tutaj zaczyna się prawdziwe życie administratora. W praktyce mało kto biega dziś do serwerowni z klawiaturą pod pachą, żeby wpisać kilka poleceń bezpośrednio przy maszynie. Znacznie częściej łączysz się z serwerem zdalnie, z innego Linuxa albo z Windowsa, i wykonujesz całą pracę przez terminal.
Najważniejszym protokołem do tego celu jest dziś SSH. Starszy Telnet historycznie robił coś podobnego, ale przesyłał dane w formie nieszyfrowanej, więc we współczesnych środowiskach praktycznie się go już nie używa. SSH jest jego bezpiecznym następcą i podstawowym narzędziem do zdalnego logowania, wykonywania poleceń, przesyłania plików oraz administracji systemami Unix/Linux.
W tym artykule pokażę Ci, jak uruchomić i używać SSH w tym samym laboratorium, które przygotowaliśmy wcześniej.
Czym jest SSH
SSH to protokół sieciowy służący do bezpiecznego zdalnego łączenia się z innym komputerem. Umożliwia zalogowanie się na zdalny system, wykonywanie poleceń, przesyłanie plików oraz tunelowanie ruchu.
SSH działa w modelu klient-serwer:
- klient SSH inicjuje połączenie,
- serwer SSH nasłuchuje na określonym porcie i przyjmuje połączenia.
Najważniejsza różnica względem dawnych rozwiązań polega na tym, że komunikacja przez SSH jest szyfrowana. Dotyczy to zarówno przesyłanych danych, jak i procesu logowania. Dzięki temu nie wysyłasz loginu i hasła jawnym tekstem przez sieć.
Środowisko testowe wykorzystane w tym artykule

W tym wpisie nie budujemy nowego laba od zera. Korzystamy z tego samego środowiska, które zostało przygotowane w poprzednich wpisach. W tym artykule przyjmiemy, że:
- Ubuntu będzie pełnił rolę serwera SSH,
- Debian będzie klientem SSH po stronie Linuxa,
- Windows CL1 będzie klientem SSH po stronie Windowsa.
Łączenie się poprzez SSH w Linuxie
Najpopularniejszą implementacją SSH w systemach Linux jest OpenSSH. Na maszynie, do której chcesz się łączyć, potrzebujesz pakietu serwerowego. Na maszynie, z której będziesz się łączyć, potrzebujesz klienta SSH.
Ubuntu jako serwer SSH
Na Ubuntu instalujemy serwer SSH:
sudo apt install -y openssh-server
Po instalacji uruchom i włącz usługę:
sudo systemctl enable --now ssh
Sprawdź jej stan:
sudo systemctl status ssh
Jeśli wszystko działa poprawnie, serwer SSH powinien być włączony i nasłuchiwać domyślnie na porcie 22.

Debian jako klient SSH
Na Debianie klient SSH zwykle jest już obecny. Jeśli jednak go brakuje, doinstaluj go:
apt install -y openssh-client
Tak naprawdę już w tym momencie możemy łączyć się zdalnie poprzez SSH z Ubuntu. Musimy znać tylko użytkownika oraz adres z jakim chcemy się połączyć. Jeśli wcześniej skonfigurowałeś nazwy hostów, wygodniej będzie połączyć się po nazwie. Jako, że wcześniej skonfigurowaliśmy nazwy hostów, możemy wygodnie połączyć się po jego nazwie.
ssh patryk@ubuntu
Przy pierwszym połączeniu klient SSH zapyta o potwierdzenie odcisku palca serwera. To normalne. W ten sposób klient zapisuje informację o tym, z jakim hostem się łączy. Jeśli masz pewność, że łączysz się z właściwą maszyną, wpisz yes.
Następnie system poprosi o hasło użytkownika. Jeśli wszystko jest poprawnie skonfigurowane, zostaniesz zalogowany na zdalną maszynę.
Żeby zakończyć sesję SSH, wpisz exit.

Łączenie się z Linuxem z poziomu Windowsa przez PuTTY
Dotąd łączyliśmy się pomiędzy systemami Linux. W praktyce bardzo często będziesz jednak łączyć się z serwerem linuksowym z komputera z Windows. Do tego świetnie nadaje się PuTTY. Aplikacja ta pozwala łączyć się w sposób zdalny ze zdalnymi serwerami.
W tym przykładzie:
- Windows CL1 jest klientem SSH,
- Ubuntu jest serwerem SSH,
- ruch przechodzi przez wcześniej skonfigurowany routing.
To oznacza, że z hosta Windows CL1 (172.16.10.10) łączymy się z serwerem Ubuntu (172.16.20.11), mimo że oba urządzenia znajdują się w różnych sieciach.
Po uruchomieniu PuTTY powinieneś zobaczyć okno aplikacji po lewej. Nie będe zagłębiał się w szczegóły konfiguracji tej aplikacji, być może w przyszłości powstanie osobny wpis na ten temat. Na obecny moment wyjaśnię po prostu, jakie dane należy wpisać aby móc się połączyć. Najważniejsze są dwa pola, wszystkie widoczne w górnym oknie.

W polu Host Name wpisz adres urządzenia, z którym chcesz się połączyć. Jeżeli po wcześniejszym artykule o nazwach masz dodane odpowiednie wpisy w pliku hosts po stronie Windowsa, możesz użyć nazwy:
ubuntu
W polu port zostawiamy domyślny port, na którym nasłuchuje zwykle serwer SSH – 22. W dalszej części poradnika zademonstruje jak zmienić domyślny port, na inny niż standardowy. Jako typ połączenia pozostawiamy domyślne SSH.
Przy pierwszym połączeniu PuTTY wyświetli komunikat o odcisku palca serwera. Jeśli dane się zgadzają, zaakceptuj połączenie. Następnie wpisz nazwę użytkownika i hasło. Podczas wpisywania hasła nie zobaczysz poruszającego się kursora ani żadnych wpisanych znaków. Jest to standardowe zabezpieczenie Putty, aby nikt za twoimi plecami nie podejrzał hasła. Po zalogowaniu zobaczysz terminal zdalnego systemu Ubuntu widoczny na screenie po prawej.
Gdzie znajdują się pliki konfiguracyjne SSH
Pliki konfiguracyjne SSH znajdują się w katalogu /etc/ssh/. Najważniejszymi z nich są dwa pliki:
- ssh_config – konfiguracja klienta SSH,
- sshd_config – konfiguracja serwera SSH.
W praktyce to właśnie plik:
/etc/ssh/sshd_config
interesuje nas najbardziej, bo odpowiada za sposób działania serwera SSH. Przed edycją dobrze zrobić kopię zapasową:
sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
Po wszelkich zmianach w pliku należy zrestartować usługę ssh poniższym poleceniem. W przeciwnym wypadku nie zobaczymy zmian.
systemctl restart ssh
Zabezpieczanie serwera SSH
To, że serwer działa, nie oznacza jeszcze, że jego domyślna konfiguracja jest najlepsza. Warto od razu zadbać o kilka rzeczy.
Zmiana domyślnego portu
Domyślny port SSH to 22. Większość automatycznych skanerów i prostych ataków zaczyna właśnie od tego portu, dlatego wielu administratorów zmienia go na inny.
W celu zmiany portu wystarczy odnaleźć parametr “Port” w pliku /etc/ssh/sshd_config, odkomentować go i zmienić jego wartość na przykładowo 2570. Następnie należy zrestartować usługę ssh poleceniem: systemctl restart ssh.
Od tego momentu podczas łączenia trzeba będzie podawać port:
ssh -p 2570 patryk@ubuntu
Wyłączenie pustych haseł
Dobrą praktyką jest upewnienie się, że serwer nie pozwala logować się użytkownikom bez hasła. W pliku /etc/ssh/sshd_config odkomentuj linie:
PermitEmptyPasswords no
Zablokowanie logowania na konto root
Bezpośrednie logowanie na konto root po SSH to zły pomysł. Lepiej logować się na zwykłego użytkownika i w razie potrzeby korzystać z sudo. To jedna z najważniejszych zmian w pliku konfiguracyjnym ssh.
PermitRootLogin no
Ustawienie limitu bezczynności
3Jeśli chcesz, aby sesje SSH nie wisiały bez końca, ustaw limit bezczynności:
ClientAliveInterval 300
Limit ten liczony jest w sekundach, to oznacza, że po około 5 minutach braku aktywności połączenie zostanie zakończone.
Ograniczenie logowania do wybranych użytkowników
Możesz wskazać, którzy użytkownicy w ogóle mają mieć prawo logowania przez SSH. Można tego dokonać w bardzo prosty sposób, korzystając z poniższego parametru po którym należy podać użytowników którzy mają mieć dostęp.
AllowUsers patryk kamil
Możesz też ograniczyć dostęp do określonych grup:
AllowGroups ssh_users
To bardzo praktyczne, szczególnie gdy na systemie istnieje wielu użytkowników, ale tylko część z nich powinna mieć dostęp administracyjny.
Logowanie za pomocą klucza asymetrycznego
Logowanie hasłem działa, ale dużo lepszym rozwiązaniem jest użycie kluczy SSH. W takim modelu:
- na komputerze klienta tworzysz parę kluczy,
- klucz prywatny zostaje u Ciebie,
- klucz publiczny trafia na serwer,
- serwer wpuszcza Cię na podstawie klucza, a nie zwykłego hasła.
To wygodniejsze i bezpieczniejsze.
Uwierzytelnianie kluczem SSH z Linuxa do Linuxa
W naszym laboratorium:
- Debian będzie klientem,
- Ubuntu będzie serwerem.
Generowanie pary kluczy na Debianie
Zaloguj się na Debianie jako użytkownik, który będzie łączył się z Ubuntu, i wygeneruj klucz. W moim przypadku zalogowałem się na użytkownika Patryk.
ssh-keygen -t ed25519 -C "patryk@firma.local.com"
Po uruchomieniu polecenia system zapyta:
- Jak nazwać klucz (ja nazwałem go po prostu klucz)
- gdzie zapisać klucz,
- czy chcesz zabezpieczyć go hasłem.
Domyślnie klucze zostaną zapisane w katalogu:
~/.ssh/
Najczęściej będą to pliki:
~/.ssh/klucz
~/.ssh/klucz.pub
Wysłanie klucza publicznego na Ubuntu
Najwygodniej użyć polecenia ssh-copy-id, które kopiuje klucz pomiędzy systemami:
ssh-copy-id -i ~/.ssh/klucz.pub patryk@ubuntu
Po podaniu hasła użytkownika z ubuntu wartość tego klucza zostanie dopisana do pliku authorized_keys w podkatalogu ssh w katalogu domowym użytkownika Patryk na systemie Ubuntu.

Test logowania kluczem
Teraz możesz spróbować połączyć się ponownie z systemem ubuntu wskazując utworzony klucz:
ssh -i ~/.ssh/klucz patryk@ubuntu
Jeśli ustawiłeś hasło dla klucza prywatnego, system poprosi o nie. To nie jest hasło użytkownika z Ubuntu, tylko hasło chroniące sam klucz prywatny.
Agent SSH

Żeby nie wpisywać hasła do klucza przy każdym logowaniu, możesz użyć agenta SSH. W pliku ~/.bashrc należy dodać poniższe linie w dowolnym miejscu.
if [[ $- == *i* ]]; then
eval "$(ssh-agent -s)" >/dev/null
ssh-add ~/.ssh/klucz 2>/dev/null
fi
Następnie przeloguj się. Od tego momentu kolejne połączenia SSH w tej sesji będą wygodniejsze. Hasło do klucza będzie wymagane tylko podczas pierwszego zalogowania do Debiana. Potem wszelkie połączenia z systemem ubuntu będą nawiązywane bez hasła.
Uwierzytelnianie kluczem z Windowsa do Linuxa przez PuTTY
Jeśli łączysz się z Ubuntu z poziomu Windows CL1 przez PuTTY, możesz również użyć klucza asymetrycznego.
Generowanie klucza w PuTTYgen
Uruchom PuTTYgen i wygeneruj nową parę kluczy typu:
Ed25519
Nadaj kluczowi hasło i zapisz:
- klucz prywatny jako plik .ppk,
- klucz publiczny skopiuj z pola Public key for pasting into OpenSSH authorized_keys file.

Dodanie klucza publicznego na serwerze Ubuntu
Na Ubuntu zaloguj się na konto użytkownika, który ma przyjmować połączenia, i upewnij się, że katalog .ssh istnieje:
mkdir -p ~/.ssh
chmod 700 ~/.ssh
vi ~/.ssh/authorized_keys
Wklej do pliku zawartość klucza publicznego z PuTTYgen, zapisz i ustaw odpowiednie prawa:
chmod 600 ~/.ssh/authorized_keys

Ustawienie klucza prywatnego w PuTTY
W PuTTY przejdź do:
Connection -> SSH -> Auth -> credential
i wskaż zapisany wcześniej plik .ppk.

Po połączeniu z serwerem Ubuntu PuTTY użyje klucza prywatnego do logowania. Jeśli klucz ma ustawione hasło, zostaniesz poproszony o jego wpisanie.
Łączenie z serwerem plików przez Filezille po SSH

SSH to nie tylko terminal. Na tym samym protokole działa także SFTP (SSH File Transfer Protocol), czyli bezpieczny transfer plików.
W praktyce możesz użyć np. FileZilli i połączyć się z serwerem Ubuntu przez:
- host: 172.16.20.11 albo ubuntu,
- port: 22 lub zmieniony port SSH,
- protokół: SFTP,
- logowanie: hasłem albo kluczem.
Dzięki temu w łatwy sposób można wymieniać pliki pomiędzy urządzeniami za pomocą eksploratora plików widocznego w oknie filezilli.
