Przejdź do treści
StealthRDP
Zarządzanie VPS

Jak zabezpieczyć SSH na VPS z Linuksem: lista kontrolna

Zabezpieczenie SSH na nowym VPS z Ubuntu 24.04 krok po kroku: klucze SSH, ustawienia sshd, UFW i Fail2ban, z testem na każdym etapie, by nie stracić dostępu.

Opublikowano

9 min czytania

Ta lista kontrolna pokazuje, jak zabezpieczyć SSH na nowym VPS z Ubuntu 24.04 LTS: logowanie hasłem na konto root zastąpisz logowaniem wyłącznie kluczem na konto jednego, konkretnego użytkownika, a dostęp dodatkowo ochronią zapora i Fail2ban. Przy każdym ryzykownym kroku znajdziesz test, który wykonujesz, nie zamykając bieżącej sesji, a tam, gdzie Debian 12 działa inaczej – stosowną uwagę. Jeśli na serwerze działa Windows, te same zagadnienia dla RDP omawiają nasze porady dotyczące zabezpieczania pulpitu zdalnego.

Zabezpieczenie SSH: lista kontrolna w skrócie

Zabezpieczenie SSH na nowym serwerze obejmuje jedenaście kroków, a ich kolejność ma znaczenie: zanim wyłączysz logowanie jako root i logowanie hasłem, upewnij się, że użytkownik z sudo może zalogować się kluczem, a zanim włączysz zaporę, odblokuj w niej SSH.

Krok Ryzyko utraty dostępu
1. Automatyczne aktualizacje bezpieczeństwa Brak
2. Użytkownik z sudo Brak
3–4. Logowanie kluczem SSH Brak
5–7. Bez logowania jako root i bez haseł Tak: sprawdź logowanie w drugiej sesji
8. Nowy port SSH (opcjonalnie) Tak
9. Zapora UFW Tak
10. Fail2ban Może zablokować twój własny adres
11. Wyłączenie nieużywanych usług Brak

Przygotuj serwer: aktualizacje i użytkownik z sudo

Jeśli pracujesz jako root, w pierwszych dwóch krokach możesz pominąć sudo. W całym poradniku zastąp deploy nazwą swojego użytkownika, a 203.0.113.10 – adresem IP swojego serwera.

1. Zaktualizuj system i włącz automatyczne aktualizacje bezpieczeństwa

Najpierw zainstaluj oczekujące aktualizacje: apt update odświeża listy pakietów, a apt upgrade instaluje nowsze wersje zainstalowanych pakietów. [1]

Zaktualizuj system
sudo apt update
sudo apt upgrade

W Ubuntu aktualizacje bezpieczeństwa instalują się automatycznie dzięki pakietowi unattended-upgrades, który jest domyślnie zainstalowany i uruchamiany raz dziennie. Obie wartości w pliku /etc/apt/apt.conf.d/20auto-upgrades powinny wynosić „1”, a próbne uruchomienie pokaże, co zostałoby zainstalowane. [1]

Sprawdź automatyczne aktualizacje
cat /etc/apt/apt.conf.d/20auto-upgrades
sudo unattended-upgrade --dry-run -v
Oczekiwana zawartość /etc/apt/apt.conf.d/20auto-upgrades
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";

Program nie uruchamia jednak serwera ponownie, bo opcja Unattended-Upgrade::Automatic-Reboot ma domyślnie wartość false – gdy aktualizacja wymaga restartu, zrestartuj serwer ręcznie. [1] Jeśli w Debianie 12 brakuje pakietu lub pliku, zainstaluj unattended-upgrades i utwórz plik z dwoma powyższymi wierszami.

2. Utwórz zwykłego użytkownika z uprawnieniami sudo

Zadania administracyjne wykonuj na własnym koncie użytkownika za pomocą sudo, które pyta o hasło tego użytkownika, a nie o hasło roota. Członkowie grupy sudo uzyskują w ten sposób pełne uprawnienia roota. [2]

Utwórz użytkownika i dodaj go do grupy sudo
sudo adduser deploy
sudo adduser deploy sudo

adduser poprosi o hasło i kilka nieobowiązkowych informacji. [2] Ustaw długie hasło: SSH będzie korzystać z kluczy, ale sudo nadal będzie o nie pytać. Następnie sprawdź konto – polecenie sudo whoami powinno wyświetlić „root”.

Sprawdź sudo na nowym koncie
su - deploy
sudo whoami

Jeśli w Debianie 12 nie ma polecenia sudo, najpierw zainstaluj je jako root poleceniem apt install sudo.

Skonfiguruj logowanie kluczem SSH

3. Wygeneruj klucz ed25519 na swoim komputerze

Parę kluczy utwórz na własnym komputerze, a nie na serwerze. Ubuntu zaleca typ ed25519 ze względu na krótsze klucze i mniejsze obciążenie obliczeniowe, a ssh-keygen poprosi o hasło (passphrase), które chroni klucz prywatny. [3]

Linux lub macOS
ssh-keygen -t ed25519

Zostaw domyślną nazwę pliku. Klucz prywatny to ~/.ssh/id_ed25519, a klucz publiczny, który kopiujesz na serwery, to ~/.ssh/id_ed25519.pub. [3]

W systemie Windows uruchom to samo polecenie w oknie PowerShell – para kluczy trafi do folderu .ssh w twoim profilu użytkownika. Microsoft odradza pozostawianie pustego hasła do klucza i ostrzega, że każdy, kto zdobędzie klucz prywatny, może zalogować się jako ty. [4]

Windows PowerShell
ssh-keygen -t ed25519

4. Skopiuj klucz publiczny na serwer

W systemach Linux i macOS polecenie ssh-copy-id dopisuje twój klucz publiczny do pliku ~/.ssh/authorized_keys danego użytkownika na serwerze. [3]

Linux lub macOS
ssh-copy-id deploy@203.0.113.10

W poradniku Microsoftu klucze kopiuje się inaczej: przez PowerShell albo za pomocą scp. [4] W przypadku serwera z Linuksem poniższe polecenie dopisze twój klucz i ustawi uprawnienia tak, aby zapisywać w katalogu i w pliku mogło tylko twoje konto:

Windows PowerShell
Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub | ssh deploy@203.0.113.10 "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"

sshd sprawdza te uprawnienia, zanim przyjmie logowanie – odpowiada za to opcja StrictModes, domyślnie włączona. [5] Następnie w nowym terminalu uruchom ssh deploy@203.0.113.10: logowanie powinno się udać bez podawania hasła konta. Jeśli się nie uda, spróbuj ponownie, śledząc na bieżąco log SSH na serwerze: [3]

Na serwerze
sudo journalctl -fu ssh.service

Zaostrz ustawienia sshd: konto root, hasła i użytkownicy

Kolejne kroki wyłączają logowanie jako root i logowanie hasłem. Zacznij dopiero wtedy, gdy logowanie kluczem na nowe konto działa, i nie zamykaj tej sesji, dopóki drugie logowanie się nie powiedzie.

5. Zapisz ustawienia w pliku drop-in

W Ubuntu plik /etc/ssh/sshd_config zaczyna się od wiersza Include /etc/ssh/sshd_config.d/*.conf, a OpenSSH w przypadku większości ustawień zachowuje pierwszą wczytaną wartość, więc pliki z tego katalogu mają pierwszeństwo przed plikiem głównym. [3] Dołączane pliki są wczytywane w kolejności leksykograficznej, a dla każdej opcji obowiązuje pierwsza wartość, jaką odczyta sshd, [5] dlatego nazwij swój plik 00-hardening.conf.

/etc/ssh/sshd_config.d/00-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowUsers deploy

Według dokumentacji sshd_config te opcje działają następująco:

  • PermitRootLogin no blokuje logowanie na konto root przez SSH. Wartość domyślna, prohibit-password, odrzuca hasła dla roota, ale nadal przyjmuje klucze. [5]
  • PasswordAuthentication no wyłącza logowanie hasłem, które domyślnie jest dozwolone. [5]
  • KbdInteractiveAuthentication no wyłącza metodę keyboard-interactive – osobny sposób logowania, również domyślnie włączony; dawniej ta opcja nazywała się ChallengeResponseAuthentication. [5]
  • AllowUsers deploy (opcjonalnie) pozwala logować się tylko wymienionym użytkownikom. W odróżnieniu od większości opcji każdy kolejny wiersz AllowUsers rozszerza listę. [5] Wpisz nazwę bezbłędnie, inaczej nikt się nie zaloguje.

Od teraz traktuj konto z sudo tak jak konto root: według dokumentacji pakietu openssh w Ubuntu każde konto, z którego można uzyskać uprawnienia roota, jest z punktu widzenia ataków z zewnątrz równoważne kontu root. [6] W Debianie 12 najpierw sprawdź poleceniem grep -n Include /etc/ssh/sshd_config, czy plik zawiera wiersz Include.

6. Sprawdź, czy żaden plik nie włącza z powrotem logowania hasłem

Skoro obowiązuje pierwsza wartość, każdy plik, który w kolejności sortowania znajdzie się przed twoim, ma pierwszeństwo. Przeszukaj katalog:

Znajdź wszystkie pliki, które ustawiają te opcje
ls /etc/ssh/sshd_config.d/
sudo grep -riE 'passwordauthentication|kbdinteractive|permitrootlogin|allowusers' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/

W obrazach chmurowych cloud-init zapisuje zarządzane przez siebie ustawienia SSH w pliku /etc/ssh/sshd_config.d/50-cloud-init.conf, o ile sshd_config dołącza ten katalog. [7] Jeśli ten plik zawiera PasswordAuthentication yes, ma pierwszeństwo przed każdym plikiem, który znajdzie się po nim w kolejności sortowania – właśnie dlatego nazwa twojego pliku zaczyna się od 00. Zmień tam wartość również na no, żeby pliki były ze sobą zgodne.

7. Sprawdź konfigurację i uruchom ponownie SSH

Przed restartem sprawdź pliki: błędne ustawienie może sprawić, że sshd się nie uruchomi, a SSH może być twoją jedyną drogą dostępu do serwera. [3]

Sprawdź konfigurację, potem zrestartuj
sudo sshd -t
sudo systemctl restart ssh.service

Najpierw popraw wszystko, co zgłosi sshd -t. Po restarcie nie zamykaj bieżącej sesji i sprawdź logowanie z drugiego terminala:

Na swoim komputerze, w nowym terminalu
ssh deploy@203.0.113.10
ssh root@203.0.113.10

Pierwsze logowanie powinno się udać, a drugie zostać odrzucone. Jeśli logowanie na twoje konto się nie powiedzie, cofnij zmianę w otwartej sesji i sprawdź log SSH tak jak w kroku 4. [3]

Czy warto zmienić port SSH?

Tylko jeśli chcesz mieć mniej szumu w logach. Nowy port przenosi SSH z domyślnego portu 22, [5] więc boty, które sprawdzają wyłącznie port 22, go nie znajdą, ale skanowanie wszystkich portów i tak wykryje SSH. Prawdziwą ochronę zapewniają klucze i wyłączone logowanie hasłem.

8. Zmień port w Ubuntu 24.04 (opcjonalnie)

Jeśli UFW lub inna zapora jest już włączona, najpierw odblokuj w niej nowy port. Nie zamykaj sesji, dopóki logowanie przez nowy port nie zadziała.

W Ubuntu 24.04 na porcie 22 nasłuchuje ssh.socket, korzystając z mechanizmu aktywacji gniazd systemd (socket activation). Generator systemd zamienia wiersze Port z pliku sshd_config i jego plików drop-in na ustawienia gniazda, dlatego po zmianie portu trzeba przeładować konfigurację systemd i uruchomić ponownie ssh.socket. [6]

sshd akceptuje więcej niż jeden wiersz Port, [5] więc na czas testowania nowego portu zostaw też port 22:

Dodaj do /etc/ssh/sshd_config.d/00-hardening.conf
Port 22
Port 2222
Zastosuj zmianę portu w Ubuntu 24.04
sudo sshd -t
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket

Sprawdź nowy port z drugiego terminala. Potem usuń wiersz Port 22, powtórz te trzy polecenia i w krokach 9 i 10 używaj portu 2222.

Na swoim komputerze, w nowym terminalu
ssh -p 2222 deploy@203.0.113.10

W Debianie 12 najpierw sprawdź, czy gniazdo jest używane. Jeśli jest nieaktywne, zmiana zacznie obowiązywać po ponownym uruchomieniu usługi.

Debian 12
systemctl is-active ssh.socket
sudo systemctl restart ssh.service

Zapora, Fail2ban i otwarte porty

9. Odblokuj SSH w UFW, a potem włącz zaporę

Włączenie UFW może zerwać twoją sesję SSH, a włączona zapora blokuje każdy port, na który nie zezwala żadna reguła. Dodaj regułę dla SSH, zanim uruchomisz ufw enable.

Zapora UFW jest po instalacji wyłączona, a po włączeniu domyślnie odrzuca ruch przychodzący. Jej dokumentacja ostrzega, że ufw enable może zerwać połączenia SSH, więc najpierw dodaj regułę dla SSH. [8]

Dla SSH użyj reguły limit zamiast allow. Reguła limit nadal przepuszcza połączenia, ale blokuje adres, który w ciągu 30 sekund spróbuje otworzyć 6 lub więcej połączeń. Nie dodawaj obu reguł, bo UFW stosuje pierwszą pasującą regułę. [8]

Ogranicz liczbę połączeń SSH, a potem włącz UFW
sudo ufw limit 22/tcp
sudo ufw enable
sudo ufw status verbose

Gdy włączasz UFW przez SSH, program prosi o potwierdzenie. [8] Po zmianie portu SSH ustaw regułę limit dla 2222/tcp zamiast dla portu 22. Jeśli w Debianie 12 nie ma polecenia ufw, najpierw zainstaluj UFW. Jeśli w ogóle nie chcesz wystawiać SSH do publicznego internetu, łącz się z nim wyłącznie przez prywatną sieć WireGuard. Ochronę wykraczającą poza sam serwer opisuje nasza lista kontrolna ochrony VPS przed atakami DDoS.

10. Włącz Fail2ban dla sshd

Po kilku nieudanych próbach logowania Fail2ban może zablokować twój własny adres IP. Jeśli masz stały adres IP, dodaj go do ignoreip, a podczas testów nie zamykaj sesji.

W Ubuntu 24.04 pakiet zawiera plik /etc/fail2ban/jail.d/defaults-debian.conf, który włącza jail sshd, ustawia backend = systemd i blokuje adresy przez nftables. [9] Backend systemd odczytuje dziennik systemd (journal), więc jail nie potrzebuje osobnego pliku logu. [10]

Zainstaluj Fail2ban i sprawdź domyślne ustawienia pakietu
sudo apt install fail2ban
cat /etc/fail2ban/jail.d/defaults-debian.conf

Domyślny plik jail.conf dostarczany z Fail2ban blokuje adres na 10 minut po 5 nieudanych próbach w ciągu 10 minut i zaznacza, że tego pliku nie należy edytować – swoje zmiany zapisz w jail.local. [10]

/etc/fail2ban/jail.local
[sshd]
enabled = true
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1h
ignoreip = 127.0.0.1/8 ::1 198.51.100.7

Zastąp 198.51.100.7 swoim stałym adresem albo usuń ten adres. Standardowy jail używa port = ssh, więc po zmianie portu SSH dodaj port = 2222. [10] W Debianie 12 zostaw tu backend = systemd i zainstaluj python3-systemd – bibliotekę Pythona do obsługi systemd, z której korzysta ten backend. [10] Następnie uruchom ponownie Fail2ban i sprawdź, czy działa:

Zastosuj ustawienia
sudo systemctl restart fail2ban
sudo systemctl status fail2ban

11. Sprawdź, co jeszcze nasłuchuje

Każdy otwarty port to kolejna furtka do serwera. UFW potrafi wyświetlić wszystkie nasłuchujące porty TCP i otwarte porty UDP, a przy każdym z nich adres (* oznacza wszystkie interfejsy), program, który go obsługuje, i reguły, które go dotyczą. [8]

Wyświetl nasłuchujące porty i ich reguły
sudo ufw show listening

Usługa nasłuchująca na adresie 127.0.0.1 jest dostępna tylko z samego serwera. Niepotrzebne usługi dostępne z zewnątrz wyłącz poleceniem systemctl disable --now – tak samo w dokumentacji pakietu openssh w Ubuntu wyłącza się ssh.socket. [6]

Wyłącz niepotrzebną usługę
sudo systemctl disable --now SERVICE_NAME

Jeśli odetniesz sobie dostęp

Najczęściej dostęp traci się przez zbyt wczesne zamknięcie ostatniej działającej sesji. Jeśli mimo wszystko do tego dojdzie:

  • Skorzystaj z sesji, która jest jeszcze otwarta: cofnij ostatnią zmianę, uruchom sshd -t i zrestartuj usługę.
  • Odczekaj chwilę, jeśli odrzuciła cię zapora UFW: jej reguła limit liczy próby w oknie 30 sekund. [8]
  • Przeczekaj blokadę Fail2ban, która trwa tyle, ile wynosi bantime – w powyższym pliku jail.local godzinę, [10] albo połącz się z innej sieci, na przykład przez hotspot w telefonie.
  • W ostateczności przeinstaluj serwer. Jeśli korzystasz ze StealthRDP, w Centrum pomocy znajdziesz instrukcję, jak przeinstalować serwer z panelu klienta: wybierasz system operacyjny, czekasz 3–5 minut i łączysz się przez SSH. Po ponownej instalacji masz czysty system, więc dane trzeba przywrócić z kopii zapasowej. Nasz poradnik o automatycznych kopiach zapasowych VPS pomoże ci zawczasu je skonfigurować.

Masz wątpliwości? Wsparcie StealthRDP jest dostępne 24/7 przez Telegram, zgłoszenia w panelu klienta i e-mail info@stealthrdp.com.

Częste pytania

Na czym polega zabezpieczenie SSH?

Zabezpieczenie SSH (ang. SSH hardening) to taka zmiana ustawień serwera SSH, by ograniczyć liczbę kont i metod logowania, przez które można się do niego dostać: klucze zamiast haseł, brak logowania jako root i opcjonalnie dostęp tylko dla wskazanych użytkowników. OpenSSH domyślnie przyjmuje logowanie hasłem i metodą keyboard-interactive, dlatego właśnie je wyłącza się w pierwszej kolejności. [5]

Dlaczego PasswordAuthentication no nie działa w Ubuntu?

Prawdopodobnie inny plik ustawia tę opcję wcześniej. W Ubuntu plik sshd_config dołącza katalog /etc/ssh/sshd_config.d/ na samym początku, a OpenSSH zachowuje pierwszą znalezioną wartość. [3] W obrazach chmurowych sprawdź w tym katalogu plik 50-cloud-init.conf, do którego cloud-init zapisuje swoje ustawienia SSH. [7]

Czy zmiana portu SSH poprawia bezpieczeństwo?

Tylko trochę. SSH nie nasłuchuje już wtedy na domyślnym porcie 22, więc nie znajdą go boty, które sprawdzają wyłącznie ten port, ale pełne skanowanie portów i tak go wykryje. [5] Klucze i wyłączone logowanie hasłem dają znacznie więcej.

Czy wyłączyć logowanie jako root przez SSH?

Tak, ale dopiero wtedy, gdy użytkownik z sudo może się logować kluczem. PermitRootLogin no całkowicie blokuje logowanie jako root, a wartość domyślna, prohibit-password, nadal przyjmuje klucze roota. [5] Dokumentacja pakietu openssh w Ubuntu dodaje, że konto z sudo wymaga takiej samej ostrożności jak konto root. [6]

Czy Fail2ban jest potrzebny, jeśli SSH przyjmuje tylko klucze?

Nie jest konieczny, ale się przydaje: blokuje adresy, z których raz po raz nie udaje się zalogować, domyślnie po 5 nieudanych próbach w ciągu 10 minut. [10] W Ubuntu 24.04 pakiet domyślnie włącza jail sshd. [9]

Czy zapora UFW jest domyślnie włączona w Ubuntu?

Nie. Po instalacji zapora UFW jest wyłączona, a po włączeniu odrzuca połączenia przychodzące, na które nie zezwala żadna reguła. [8] Zanim uruchomisz ufw enable, dodaj regułę dla SSH.

Źródła i odnośniki
  1. Automatic updates — Ubuntu Server documentation (dostęp: 2026-11-03)
  2. User management — Ubuntu Server documentation (dostęp: 2026-11-03)
  3. OpenSSH server — Ubuntu Server documentation (dostęp: 2026-11-03)
  4. Key-based authentication in OpenSSH for Windows — Microsoft Learn (dostęp: 2026-11-03)
  5. sshd_config(5): OpenSSH daemon configuration file — OpenBSD manual pages (dostęp: 2026-11-03)
  6. openssh: debian/README.Debian (ubuntu/noble-updates) — Ubuntu (Launchpad) (dostęp: 2026-11-03)
  7. cloudinit/ssh_util.py — GitHub (canonical/cloud-init) (dostęp: 2026-11-03)
  8. ufw - program for managing a netfilter firewall — Ubuntu Manpages (dostęp: 2026-11-03)
  9. fail2ban: debian/debian-files/jail.d_defaults-debian.conf (ubuntu/noble-updates) — Ubuntu (Launchpad) (dostęp: 2026-11-03)
  10. fail2ban 1.0.2: config/jail.conf — GitHub (fail2ban/fail2ban) (dostęp: 2026-11-03)

Czytaj dalej