Konfiguracja SSH w Linuxie

by Patryk

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.

You may also like

Leave a Comment