Strona główna » Blog » Ubuntu: jak włączyć SSH i zabezpieczyć serwer OpenSSH
Ubuntu: jak włączyć SSH i zabezpieczyć serwer OpenSSH
- 6 października 2026
- 09:00
- Autor: Adrien Roche
- Sieci

Włączanie SSH w Ubuntu: instalacja, start, otwarcie zapory
SSH w Ubuntu pochodzi z pakietu openssh-server. Ubuntu Server proponuje jego instalację podczas konfiguracji, a niemal każdy obraz chmurowy lub VPS dostarcza go już nasłuchującego; Ubuntu Desktop nie instaluje go wcale.
1. Zainstaluj openssh-server
sudo apt update
sudo apt install -y openssh-serverJeśli pakiet już istnieje, apt to zgłosi i niczego nie zmieni. Instalacja rejestruje też profil aplikacji UFW o nazwie OpenSSH, używany w kroku 3.
2. Włącz i uruchom usługę
sudo systemctl enable --now ssh
systemctl status sshW Ubuntu jednostka nazywa się ssh; sshd to alias. enable --now uruchamia demona teraz i przy każdym starcie systemu. Od Ubuntu 22.10 sshd jest aktywowany przez gniazdo: ssh.socket zajmuje port 22 i uruchamia ssh.service przy pierwszym przychodzącym połączeniu, więc status inactive (dead) z TriggeredBy: ssh.socket zaraz po instalacji jest normalny, bo port jest otwarty. Szerszy obraz znajdziesz w liście usług przez systemctl.
3. Przepuść SSH przez UFW
Ubuntu dostarcza UFW wyłączone. Jeśli je włączasz, najpierw zezwól na SSH; włączenie zapory przed dodaniem reguły to klasyczny sposób na odcięcie sobie dostępu do zdalnej maszyny.
sudo ufw allow OpenSSH
sudo ufw enable
sudo ufw statusufw allow OpenSSH korzysta z profilu aplikacji i otwiera 22/tcp. Jeśli później przeniesiesz sshd, zezwól na nowy port poleceniem sudo ufw allow 2222/tcp i usuń starą regułę. Adres serwera sprawdzisz przez hostname -I.
Łączenie z Windows, macOS lub Linux
Każdy współczesny system desktopowy ma wbudowanego klienta OpenSSH, a składnia jest wszędzie identyczna:
ssh username@SERVER_IP
ssh -p 2222 username@SERVER_IP # non-default port- Windows 10 i 11: otwórz PowerShell lub Windows Terminal i wpisz polecenie; klient OpenSSH jest częścią Windows od 2018 roku (wersja 1809). Jeśli
sshnie jest rozpoznawane, dodaj je w Ustawienia > Aplikacje > Funkcje opcjonalne. - macOS: Terminal, to samo polecenie.
- Linux: dowolny terminal;
openssh-clientjest w Ubuntu instalowany domyślnie.
Przy pierwszym połączeniu zaakceptuj odcisk klucza hosta wpisując yes; zostanie zapisany w ~/.ssh/known_hosts, a każda późniejsza zmiana wywoła ostrzeżenie. Następnie wpisz hasło konta. Kolejna sekcja zastępuje je kluczem.
Przejście na uwierzytelnianie kluczem
To właśnie logowanie hasłem botnety atakują metodą brute force przez całą dobę; klucze czynią te próby bezcelowymi. Wygeneruj parę kluczy Ed25519 na swoim komputerze, nigdy na serwerze:
ssh-keygen -t ed25519 -C "laptop-2026"Zaakceptuj domyślną ścieżkę (~/.ssh/id_ed25519) i ustaw hasło (passphrase); szyfruje ono klucz prywatny na dysku, a agent SSH sprawia, że wpisujesz je raz na sesję. Twoją maszynę opuszcza wyłącznie plik .pub.
Skopiuj klucz publiczny na serwer
W macOS i Linuksie ssh-copy-id robi to w jednym kroku, używając hasła po raz ostatni:
ssh-copy-id -i ~/.ssh/id_ed25519.pub username@SERVER_IPWindowsowa wersja OpenSSH nie zawiera ssh-copy-id; zamiast tego prześlij klucz potokiem z PowerShella:
type $env:USERPROFILE\.ssh\id_ed25519.pub | ssh username@SERVER_IP "mkdir -p ~/.ssh && chmod 700 ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 600 ~/.ssh/authorized_keys"Obie metody dopisują klucz do pliku ~/.ssh/authorized_keys danego użytkownika. Uprawnienia mają znaczenie: sshd po cichu ignoruje plik, gdy ~/.ssh nie ma trybu 700 lub gdy authorized_keys jest zapisywalny dla kogokolwiek poza właścicielem. W nowym terminalu ssh username@SERVER_IP powinno teraz zalogować cię bez hasła konta. Nie przechodź do kolejnej sekcji, dopóki to nie zadziała.
Hartowanie sshd_config: bez haseł, bez roota, z listą dozwolonych użytkowników
Podczas edycji zostaw otwartą bieżącą sesję; jeśli nowa konfiguracja coś zepsuje, to twoja droga powrotna. Plik /etc/ssh/sshd_config zaczyna się od Include /etc/ssh/sshd_config.d/*.conf, a sshd zachowuje pierwszą odczytaną wartość dla każdego słowa kluczowego, więc plik drop-in wygrywa z czymkolwiek dalej w pliku głównym. Do tego obrazy chmurowe często dostarczają /etc/ssh/sshd_config.d/50-cloud-init.conf z PasswordAuthentication yes, dlatego edycja głównego pliku tak często wydaje się nie działać. Rozwiązaniem jest drop-in o nazwie sortującej się jako pierwsza:
sudo nano /etc/ssh/sshd_config.d/00-hardening.confWklej poniższe, zamieniając username na własny login:
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
PermitRootLogin no
AllowUsers username
MaxAuthTries 3
LoginGraceTime 30
X11Forwarding no
ClientAliveInterval 300
ClientAliveCountMax 2PermitRootLogin no zakłada, że masz nieuprzywilejowane konto z prawami sudo. Jeśli do tej pory pracowałeś jako root, utwórz użytkownika sudo w Linuksie i skopiuj do niego swój klucz przed zastosowaniem pliku. Następnie sprawdź składnię, przeładuj usługę i zobacz wartości, których sshd faktycznie używa po scaleniu wszystkich dołączeń. To właśnie wypisuje sshd -T:
sudo sshd -t
sudo systemctl reload ssh
sudo sshd -T | grep -Ei 'passwordauthentication|permitrootlogin|allowusers|port'Otwórz drugi terminal i zaloguj się kluczem, zanim zamkniesz pierwszy. Co robi każda dyrektywa:
| Dyrektywa | Wartość | Efekt |
|---|---|---|
PasswordAuthentication | no | Tylko klucze; atak brute force na hasło staje się niemożliwy, a nie po prostu powolny. |
KbdInteractiveAuthentication | no | Zamyka ścieżkę wyzwanie-odpowiedź, którą PAM mógłby wykorzystać do haseł (dawniej ChallengeResponseAuthentication). |
PermitRootLogin | no | Root nie może logować się przez SSH, z kluczem czy bez; użyj sudo. |
AllowUsers | twój login (lub loginy) | Niewymienieni użytkownicy są odrzucani przed uwierzytelnieniem; [email protected]/24 przypina użytkownika do sieci. |
MaxAuthTries | 3 | Trzy nieudane próby na połączenie, potem rozłączenie. |
LoginGraceTime | 30 | Nieuwierzytelnione połączenia są zrywane po 30 sekundach. |
ClientAliveInterval / ClientAliveCountMax | 300 / 2 | Odpytuje bezczynnego klienta co pięć minut i rozłącza go po dwóch bez odpowiedzi; aktywni klienci odpowiadają automatycznie. |
X11Forwarding | no | Wyłączone, chyba że przekazujesz aplikacje graficzne. |
Keepalive ma też stronę kliencka: ServerAliveInterval 60 w ~/.ssh/config na twojej maszynie powstrzymuje routery NAT przed zrywaniem bezczynnych sesji.
Zmiana portu SSH to nie zabezpieczenie
Przeniesienie sshd z portu 22 to popularna rada. Zyskujesz mniej linii w logach. Masowe skanery przeczesują wszystkie 65 535 portów i znajdują sshd na 2222 w ciągu godzin; ktoś, kto celuje w ciebie, znajdzie go w sekundy przy użyciu nmap. Zabezpieczeniem są klucze, brak logowania roota, lista dozwolonych i fail2ban; port jest kosmetyką. Na obciążonym serwerze wciąż pomaga, bo utrzymuje log uwierzytelniania w czytelnej formie, tylko nigdy nie traktuj tego jako warstwy obrony.
Jeśli jednak go zmieniasz, zachowaj tę kolejność: otwórz nowy port w UFW, zmień port, zrestartuj, przetestuj z drugiego terminala, dopiero potem usuń starą regułę. Odkomentuj #Port 22 w /etc/ssh/sshd_config, ustaw nowy port, a następnie:
sudo ufw allow 2222/tcp
sudo sshd -t
sudo systemctl daemon-reload
sudo systemctl restart ssh.socket # Ubuntu 22.10 and later
sudo systemctl restart ssh # Ubuntu 22.04 and earlierW wydaniach z aktywacją przez gniazdo to jednostka gniazda, a nie sshd, decyduje o wiązanym porcie; Ubuntu dostarcza generator systemd, który odczytuje Port z konfiguracji sshd podczas daemon-reload i aktualizuje ssh.socket. Potwierdź poleceniem sudo ss -tlnp | grep sshd. Poradnik o sprawdzaniu otwartych portów w Linuksie wyjaśnia jego wynik. Jeśli sshd uparcie trzyma się portu 22, wyłącz aktywację przez gniazdo i pozwól usłudze samodzielnie zająć port: sudo systemctl disable --now ssh.socket && sudo systemctl enable --now ssh.service. Gdy ssh -p 2222 zadziała z nowego terminala, wykonaj sudo ufw delete allow OpenSSH.
Dodaj fail2ban i rozważ uwierzytelnianie dwuskładnikowe
Przy wyłączonych hasłach brute force nie może się powieść, ale każda próba nadal kosztuje jeden proces i jedną linię logu. fail2ban obserwuje log uwierzytelniania i banuje adresy, które wielokrotnie zawodzą:
sudo apt install -y fail2ban
sudo nano /etc/fail2ban/jail.localUmieść w pliku to:
[sshd]
enabled = true
port = ssh
backend = systemd
maxretry = 5
findtime = 10m
bantime = 1hsudo systemctl enable --now fail2ban
sudo fail2ban-client status sshdNigdy nie edytuj jail.conf; jest podmieniany przy aktualizacjach, a jail.local go nadpisuje. port = ssh rozwiązuje się przez /etc/services, więc wpisz port = 2222, jeśli przeniosłeś demona. backend = systemd czyta dziennik bezpośrednio i działa niezależnie od tego, czy twój obraz zapisuje /var/log/auth.log. fail2ban-client status sshd wypisuje zbanowane adresy; sudo fail2ban-client set sshd unbanip 203.0.113.7 zdejmuje bana. Domyślnie reguły fail2ban są przetwarzane przed regułami UFW, więc oba współistnieją.
Uwierzytelnianie dwuskładnikowe
Tam, gdzie klucz z hasłem to za mało, libpam-google-authenticator dokłada kod czasowy na wierzchu klucza: zainstaluj pakiet, uruchom google-authenticator jako użytkownik logowania, dodaj auth required pam_google_authenticator.so do /etc/pam.d/sshd (i zakomentuj tam linię @include common-auth), a następnie ustaw w sshd KbdInteractiveAuthentication yes i AuthenticationMethods publickey,keyboard-interactive. Realny zysk wobec skradzionego laptopa i jedna rzecz więcej do zgubienia: trzymaj kody zapasowe poza serwerem.
Rozwiązywanie problemów: connection refused, timed out, permission denied
Connection refused
Serwer odpowiedział, ale nic nie nasłuchuje na tym porcie: sshd jest zatrzymany, związany z innym portem albo wpisałeś zły port. Z konsoli dostawcy wykonaj systemctl status ssh i sudo ss -tlnp | grep ssh. Błąd składni całkowicie uniemożliwia start sshd; sudo sshd -t wypisuje problematyczną linię, a journalctl -u ssh -n 50 pokazuje ostatni start.
Connection timed out
Pakiety są odrzucane po cichu, a nie odbijane, co niemal zawsze oznacza zaporę: UFW bez reguły zezwalającej (sudo ufw status verbose), grupa bezpieczeństwa w panelu dostawcy albo twoja własna sieć blokująca wychodzący port 22. Hotspot z telefonu to wyklucza. ssh -v username@SERVER_IP pokazuje, gdzie zawiesza się handshake.
Permission denied (publickey)
Serwer jest osiągalny i cię odrzuca. Sprawdź po kolei: nazwę użytkownika, czy plik authorized_keys tego użytkownika zawiera klucz, który oferujesz (ssh -i ~/.ssh/id_ed25519 -v wymusza konkretny klucz), uprawnienia do ~/.ssh oraz czy login nie brakuje w AllowUsers. Na serwerze journalctl -u ssh -n 30 poda powod; Authentication refused: bad ownership or modes to opisany wcześniej problem z uprawnieniami.
Ostrzeżenie o kluczu hosta
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED po odtworzeniu serwera jest oczekiwane: wykonaj ssh-keygen -R SERVER_IP i połącz się ponownie. Jeśli niczego nie instalowałeś od nowa, ustal przyczynę, zanim gdziekolwiek wpiszesz hasło. Całkowicie odcięty? Konsola dostawcy to droga powrotna.
Wszystko powyższe zakłada maszynę, na której masz roota i możesz sobie pozwolić na zepsucie sshd i naprawę z konsoli. Linux VPS od rdp.monster to dokładnie taka maszyna: pełny dostęp root, dedykowany CPU i RAM, nielimitowane pasmo (fair-use), bez KYC, płatność kryptowalutą lub walutą fiat, od $8.99 miesięcznie, a serwer jest online około 10 sekund po potwierdzeniu płatności, czyli dość czasu, by mieć klucze na miejscu, zanim pierwszy skaner znajdzie port 22.
Najczęściej zadawane pytania
Czy Ubuntu ma SSH włączone domyślnie?
sudo apt install openssh-server. Ubuntu Server pyta podczas instalacji, czy zainstalować serwer OpenSSH, i może przy okazji zaimportować twoje klucze z GitHuba lub Launchpada. Obrazy chmurowe i VPS niemal zawsze mają openssh-server zainstalowany, włączony i przyjmujący połączenia, bo to jedyny sposób, w jaki dostawca może przekazać ci maszynę. Sprawdź poleceniem systemctl status ssh.Jak sprawdzić, czy SSH działa w Ubuntu?
systemctl status ssh mówi, czy usługa jest aktywna lub włączona przy starcie. Ponieważ Ubuntu 22.10 i nowsze używają aktywacji przez gniazdo, usługa może zgodnie z prawdą pokazywać inactive (dead) z TriggeredBy: ssh.socket, gdy nikt nie jest połączony, więc pewniejszym testem jest sudo ss -tlnp | grep ssh: linia z 0.0.0.0:22 lub [::]:22 oznacza, że SSH nasłuchuje. Z innej maszyny ssh -v username@SERVER_IP potwierdza to od końca do końca.Czy zostawienie SSH na porcie 22 jest bezpieczne?
PasswordAuthentication no i parą kluczy, a fail2ban usuwa większość hałasu. Przeniesienie sshd na 2222 lub 22222 ukrywa go tylko przed najbardziej leniwymi skanerami; skanery portów takie jak nmap i masscan znajdują go w kilka minut, a ogólnointernetowe indeksy i tak go wymieniają. Traktuj niestandardowy port jako higienę logów, a nie środek bezpieczeństwa, i nigdy nie rezygnuj z kluczy dlatego, że zmieniłeś port.Jaka jest różnica między ssh a sshd w Ubuntu?
ssh to klient, który uruchamiasz na laptopie, aby otworzyć połączenie; pochodzi z pakietu openssh-client. sshd to demon odpowiadający na serwerze, z pakietu openssh-server, konfigurowany w /etc/ssh/sshd_config (klient czyta ssh_config). Ubuntu i Debian nazywają jednostkę systemd ssh.service i deklarują sshd.service jako alias, więc systemctl restart ssh i systemctl restart sshd robią to samo; w Fedorze, RHEL i Arch jednostka nazywa się po prostu sshd.Adrien Roche, Redaktor ds. infrastruktury i hostingu
Inżynier systemowy z ponad 10-letnim doświadczeniem w administrowaniu serwerami Windows i Linux. Adrien prowadzi dokumentację infrastruktury rdp.monster i pisze nasze poradniki o RDP, hostingu VPS, administracji serwerami, sieciach i narzędziach prywatności.




