SSH Hardening: Kompletny Przewodnik po Bezpiecznej Konfiguracji Serwera (2026)

SSH Hardening: Jak zabezpieczyć serwer SSH w 2026?

SSH hardening to proces zabezpieczania usługi SSH (Secure Shell) przed nieautoryzowanym dostępem, atakami brute-force i eksploitacją znanych podatności. Ten artykuł zawiera praktyczną, gotową do wdrożenia konfigurację sshd_config zgodną z aktualnymi standardami bezpieczeństwa (CIS Benchmark, NIST, Mozilla OpenSSH Guidelines) – wraz z wyjaśnieniem dlaczego każde ustawienie ma znaczenie.

TL;DR: Wyłącz logowanie hasłem, wymuś klucze SSH, zablokuj root, zmień port, ogranicz algorytmy kryptograficzne do bezpiecznych, wdroż fail2ban i regularnie audytuj logi. Pełne wyjaśnienie i gotowe pliki konfiguracyjne poniżej.

 

Bezpłatne warsztaty: Zbuduj 5 Agentów AI
Sprawdź szczegóły:

Spis treści

  1. Czym jest SSH Hardening i dlaczego jest potrzebny
  2. Najczęstsze wektory ataku na SSH
  3. Uwierzytelnianie kluczem SSH zamiast hasła
  4. Wyłączenie logowania jako root
  5. Zmiana domyślnego portu SSH
  6. Twarde algorytmy kryptograficzne: Ciphers, MACs, KexAlgorithms
  7. Limity czasu, prób logowania i sesji
  8. Uwierzytelnianie dwuskładnikowe (2FA/MFA) dla SSH
  9. Fail2ban i ochrona przed atakami brute-force
  10. Firewall i ograniczanie dostępu sieciowego
  11. Port knocking i ukrywanie usługi SSH
  12. Logowanie, monitoring i audyt SSH
  13. Gotowy plik sshd_config (przykład produkcyjny)
  14. Checklist wdrożeniowa SSH Hardening
  15. Najczęściej zadawane pytania (FAQ)
  16. Podsumowanie

1. Czym jest SSH Hardening i dlaczego jest potrzebny

SSH (Secure Shell) to protokół umożliwiający zdalny, zaszyfrowany dostęp do serwera. Ponieważ jest to najczęstszy punkt wejścia administratorów do infrastruktury, jest też jednym z najczęściej atakowanych usług w internecie. Skanery botnetowe testują port 22 tysiące razy dziennie na każdym publicznym adresie IP, próbując słownikowych ataków na loginy typu root, admin, ubuntu.

Domyślna konfiguracja SSH w większości dystrybucji Linuksa (Ubuntu, Debian, CentOS, Rocky Linux, AlmaLinux) jest funkcjonalna, ale nie jest bezpieczna out-of-the-box. Domyślnie:

  • logowanie hasłem jest włączone,
  • root może logować się bezpośrednio,
  • używany jest standardowy port 22,
  • nie ma limitu prób logowania,
  • akceptowane są przestarzałe, słabe algorytmy szyfrowania.

Celem SSH hardeningu jest zredukowanie powierzchni ataku (attack surface) przy zachowaniu pełnej funkcjonalności dla uprawnionych administratorów.


2. Najczęstsze wektory ataku na SSH

Zanim przejdziemy do konfiguracji, warto zrozumieć, przed czym się bronimy:

Typ atakuOpisRyzyko
Brute-force / dictionary attackAutomatyczne próby zgadywania hasłaWysokie
Credential stuffingUżycie wyciekłych baz login:hasłoWysokie
Atak na słabe algorytmy kryptograficzneWykorzystanie przestarzałych szyfrów (np. CBC, MD5)Średnie
Privilege escalation przez rootBezpośredni dostęp do konta rootKrytyczne
Man-in-the-Middle (MITM)Przechwycenie sesji przy niezweryfikowanym kluczu hostaŚrednie
Atak typu 0-day na demona sshdWykorzystanie luki w samym oprogramowaniu OpenSSHKrytyczne (rzadkie)

3. Uwierzytelnianie kluczem SSH zamiast hasła

To najważniejszy pojedynczy krok w SSH hardeningu. Klucz SSH (para publiczny/prywatny, np. Ed25519) jest praktycznie odporny na atak brute-force – złamanie klucza 256-bitowego jest obliczeniowo niewykonalne (Wejście do gry komputerów kwantowych drastycznie zmienia sytuację, ale wynik zależy od rodzaju algorytmu).

Generowanie klucza (na maszynie klienckiej)

ssh-keygen -t ed25519 -a 100 -C "root@twojserwer.pl"
  • -t ed25519 – nowoczesny, szybki i bezpieczny algorytm (preferowany nad RSA)
  • -a 100 – liczba rund KDF przy szyfrowaniu klucza prywatnego (utrudnia łamanie hasła klucza)
  • root – nazwa użytkownika
  • twojserwer.pl – to przykładowy zapis (tzw. placeholder), w którego miejsce należy wpisać faktyczny adres serwera, z którym chcesz się połączyć. Adres IP np. 192.168.1.50 lub 46.242.112.5 albo Nazwę domeny np. serwer123.hosting.pl lub FQDN np. vps1.twojadomena.pl (pełną, jednoznaczną nazwę domenową konkretnego urządzenia w internecie).

Jeśli serwer wymaga kompatybilności ze starszym sprzętem bez Ed25519, użyj RSA 4096 bitów:

ssh-keygen -t rsa -b 4096 -C "admin@twojserwer.pl"

Kopiowanie klucza publicznego na serwer

ssh-copy-id -i ~/.ssh/id_ed25519.pub uzytkownik@adres-serwera
cat .ssh/authorized_keys

Wyłączenie logowania hasłem w sshd_config

nano /etc/ssh/sshd_config  <- Edycja pliku sshd_config

PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
ChallengeResponseAuthentication no

Ważne: przed wyłączeniem hasła zawsze przetestuj logowanie kluczem w osobnej sesji terminala, nie zamykając bieżącej. Błąd konfiguracji może zablokować dostęp do serwera.


4. Wyłączenie logowania jako root

Konto root ma pełne uprawnienia administracyjne – jest głównym celem ataków. Zamiast logować się jako root, administratorzy powinni logować się na zwykłe konto i używać sudo.

PermitRootLogin no

Warianty pośrednie (jeśli automatyzacja wymaga dostępu roota, np. backupy):

PermitRootLogin prohibit-password

Ta opcja pozwala na logowanie roota wyłącznie kluczem, nigdy hasłem – dobry kompromis dla systemów zarządzanych (np. Ansible).


5. Zmiana domyślnego portu SSH

Zmiana portu z 22 na niestandardowy nie jest zabezpieczeniem kryptograficznym (tzw. security by obscurity), ale drastycznie redukuje szum w logach i liczbę automatycznych, masowych skanów botnetowych.

Port 2222

Wskazówki:

  • Wybierz port z zakresu 1024 – 65535, unikając popularnie skanowanych (np. 2222 jest już dość znany – rozważ losowy port powyżej 10000).
  • Pamiętaj o aktualizacji reguł firewalla i grup bezpieczeństwa w chmurze (AWS Security Groups, Azure NSG, GCP Firewall Rules).
  • To zabezpieczenie uzupełnia, a nie zastępuje pozostałe kroki hardeningu.

6. Twarde algorytmy kryptograficzne: Ciphers, MACs, KexAlgorithms

Domyślna konfiguracja OpenSSH akceptuje algorytmy zachowane dla wstecznej kompatybilności, część z nich jest już uznawana za słabą. Poniżej rekomendowana, zawężona lista zgodna z wytycznymi Mozilla OpenSSH Security Guide (poziom „Modern”):

# Algorytmy szyfrowania (Ciphers)
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr

# Algorytmy wymiany kluczy (Key Exchange)
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512

# Kody uwierzytelniania wiadomości (MACs)
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com

Wymuś także wyłącznie protokół SSH w wersji 2 (SSH-1 jest podatny na wiele znanych ataków):

W nowszych wersjach OpenSSH (7.6+) SSH-1 jest już domyślnie usunięty z kodu, ale warto jawnie to udokumentować w konfiguracji.

1. Utwórz plik hardeningu

nano /etc/ssh/sshd_config.d/99-hardening.conf

Wklej:

# SSH protocol
Protocol 2

# Encryption algorithms
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr

# Key exchange algorithms
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512

# Message authentication codes
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com

Zapisz Ctrl+O, Enter, wyjdź Ctrl+X.

2. Nie restartuj jeszcze SSH

Najpierw sprawdź, czy konfiguracja jest poprawna:

sshd -t

Jeżeli nie zwróci żadnego komunikatu, konfiguracja jest syntaktycznie poprawna.

Jeżeli pojawi się błąd, nie restartuj SSH i wklej mi jego treść.

3. Sprawdź, co faktycznie zostało zastosowane

Wykonaj:

sshd -T | grep -E '^(ciphers|kexalgorithms|macs)’

Powinieneś zobaczyć odpowiednio:

ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com,aes256-ctr,aes192-ctr,aes128-ctr
macs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com,umac-128-etm@openssh.com
kexalgorithms curve25519-sha256,curve25519-sha256@libssh.org,diffie-hellman-group16-sha512,diffie-hellman-group18-sha512

4. Dopiero teraz przeładuj SSH

Jeżeli sshd -t nie zgłosił błędów:

sudo systemctl reload ssh

Nie zamykaj obecnej sesji SSH. Otwórz drugie okno terminala i sprawdź, czy możesz się zalogować.


7. Limity czasu, prób logowania i sesji

Ograniczenie liczby prób i czasu połączenia utrudnia automatyczne ataki oraz redukuje obciążenie serwera.

nano /etc/ssh/sshd_config

LoginGraceTime 30
MaxAuthTries 3
MaxSessions 4
MaxStartups 10:30:60
ClientAliveInterval 300
ClientAliveCountMax 2
  • LoginGraceTime 30 – atakujący ma tylko 30 sekund na zalogowanie się od nawiązania połączenia.
  • MaxAuthTries 3 – po 3 nieudanych próbach połączenie jest zrywane.
  • ClientAliveInterval + ClientAliveCountMax – automatyczne rozłączanie nieaktywnych sesji (odpowiednik idle timeout).

8. Uwierzytelnianie dwuskładnikowe (2FA/MFA) dla SSH

Dla środowisk o podwyższonych wymaganiach bezpieczeństwa (produkcja, dane wrażliwe, zgodność z ISO 27001/SOC 2) warto wdrożyć drugi składnik uwierzytelnienia, np. przez Google Authenticator PAM module lub FIDO2/U2F.

Instalacja modułu TOTP (Ubuntu/Debian)

apt install libpam-google-authenticator
google-authenticator

Przeskanuj kod telefonem w aplikacji google authenticator – by dodać uwierzytnianie. Wpisz podany kod z telefonu. Dokładnie przeczytaj i zatwierdź lub odmów ustawienia „y/n”.

Konfiguracja PAM (/etc/pam.d/sshd)

nano /etc/pam.d/sshd

auth required pam_google_authenticator.so <- wpisz na samym końcu pliku tekstowego i zapisz konfigurację 

Po zapisaniu pliku w nano (Ctrl + O, Enter, Ctrl + X) nie zapomnij przeładować usługi SSH:

systemctl restart ssh

Konfiguracja sshd_config

nano /etc/ssh/sshd_config


KbdInteractiveAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

Efekt: użytkownik musi podać klucz SSH ORAZ kod TOTP – kompromitacja samego klucza prywatnego nie wystarczy do przejęcia dostępu.

Alternatywa: klucze sprzętowe FIDO2/U2F (Ed25519-sk)

ssh-keygen -t ed25519-sk -O resident -O verify-required

Wymaga klucza sprzętowego (np. YubiKey) fizycznie podłączonego przy logowaniu – najwyższy poziom ochrony przed phishingiem i kradzieżą kluczy.


9. Fail2ban i ochrona przed atakami brute-force

Fail2ban monitoruje logi SSH i automatycznie blokuje adresy IP wykazujące podejrzaną aktywność (np. wielokrotne nieudane logowania).

Instalacja

apt install fail2ban

Konfiguracja (/etc/fail2ban/jail.local)


nano /etc/fail2ban/jail.local


[DEFAULT]
# Globalne ustawienia progresywnego banowania botów
bantime.increment = true
bantime.factor = 2

[sshd]
enabled = true
port    = 2222
filter  = sshd
maxretry = 4
findtime = 600
bantime  = 3600

# Wskazanie Debianowi, by czytał logi z journald, a nie z pliku auth.log
backend = systemd

  • bantime.increment = true – każda kolejna blokada tego samego IP jest dłuższa (progresywne kary).
  • Sprawdzenie statusu:
fail2ban-client status sshd

10. Firewall i ograniczanie dostępu sieciowego

UFW (Ubuntu/Debian)

ufw default deny incoming
ufw allow 2222/tcp
ufw allow from 203.0.113.0/24 to any port 2222 proto tcp
ufw enable

firewalld (RHEL/CentOS/Rocky/AlmaLinux)

firewall-cmd --permanent --add-port=2222/tcp
firewall-cmd --permanent --remove-service=ssh
firewall-cmd --reload

iptables — ograniczenie tempa nowych połączeń (rate limiting)

iptables -A INPUT -p tcp --dport 2222 -m conntrack --ctstate NEW -m recent --set
iptables -A INPUT -p tcp --dport 2222 -m conntrack --ctstate NEW -m recent --update --seconds 60 --hitcount 4 -j DROP

Dla środowisk chmurowych zawsze dodatkowo ogranicz dostęp na poziomie Security Groups / VPC firewall – to pierwsza linia obrony, zanim ruch w ogóle dotrze do systemu operacyjnego.


11. Port knocking i ukrywanie usługi SSH

Dla środowisk wymagających dodatkowej dyskrecji można wdrożyć port knocking – SSH pozostaje domyślnie zamknięty w firewallu i otwiera się dopiero po odebraniu sekwencji „pukania” na określone porty.

sudo apt install knockd

Przykładowa konfiguracja /etc/knockd.conf:

[openSSH]
    sequence = 7000,8000,9000
    seq_timeout = 5
    command = /sbin/iptables -A INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags = syn

[closeSSH]
    sequence = 9000,8000,7000
    seq_timeout = 5
    command = /sbin/iptables -D INPUT -s %IP% -p tcp --dport 2222 -j ACCEPT
    tcpflags = syn

Port knocking dobrze uzupełnia hardening, ale nie zastępuje solidnego uwierzytelniania – traktuj go jako dodatkową warstwę, nie fundament bezpieczeństwa.


12. Logowanie, monitoring i audyt SSH

Bezpieczna konfiguracja to nie tylko prewencja, ale też wykrywanie prób ataku.

nano /etc/ssh/sshd_config

LogLevel VERBOSE
SyslogFacility AUTH

LogLevel VERBOSE dodatkowo loguje odcisk klucza (fingerprint) używany przy każdym logowaniu – przydatne przy audycie i wykrywaniu nieautoryzowanych kluczy.

Przydatne komendy do audytu

# Ostatnie logowania SSH
last -f /var/log/wtmp

# Nieudane próby logowania - jeśli takowe istnieją
grep "Failed password" /var/log/auth.log | tail -50

# Aktywne sesje SSH
who
ss -tnp | grep :2222

Dla większych środowisk warto wysyłać logi do centralnego systemu SIEM (np. Wazuh, Graylog, ELK Stack) i skonfigurować alerty na wzorce ataków.


13. Gotowy plik sshd_config (przykład produkcyjny)

Poniżej kompletny, gotowy do wdrożenia plik /etc/ssh/sshd_config łączący wszystkie omówione praktyki:

# === SSH Hardening Configuration ===
Port 2222
Protocol 2
AddressFamily inet

# Uwierzytelnianie
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication yes
AuthenticationMethods publickey,keyboard-interactive
PermitEmptyPasswords no
ChallengeResponseAuthentication no

# Dostęp
AllowUsers admin deploy
LoginGraceTime 30
MaxAuthTries 3
MaxSessions 4
MaxStartups 10:30:60

# Sesja
ClientAliveInterval 300
ClientAliveCountMax 2
TCPKeepAlive no
X11Forwarding no
AllowAgentForwarding no
AllowTcpForwarding no
PermitTunnel no

# Kryptografia
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
KexAlgorithms curve25519-sha256,curve25519-sha256@libssh.org
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com

# Logowanie
LogLevel VERBOSE
SyslogFacility AUTH

# Banner
Banner /etc/ssh/banner.txt

Po wprowadzeniu zmian zawsze zweryfikuj poprawność składni przed restartem usługi:

sshd -t
systemctl restart sshd

14. Checklist wdrożeniowa SSH Hardening

  • [ ] Wygenerowano i wdrożono klucze SSH (Ed25519), wyłączono PasswordAuthentication
  • [ ] PermitRootLogin no lub prohibit-password
  • [ ] Zmieniono domyślny port 22
  • [ ] Ograniczono dostęp przez AllowUsers/AllowGroups
  • [ ] Zawężono Ciphers, MACs, KexAlgorithms do bezpiecznych
  • [ ] Skonfigurowano LoginGraceTime, MaxAuthTries, ClientAliveInterval
  • [ ] Wdrożono 2FA/MFA (TOTP lub FIDO2)
  • [ ] Zainstalowano i skonfigurowano fail2ban
  • [ ] Wyłączono X11Forwarding, AllowTcpForwarding, PermitTunnel jeśli niepotrzebne
  • [ ] Włączono LogLevel VERBOSE i skonfigurowano monitoring/SIEM
  • [ ] Przetestowano konfigurację (sshd -t) i logowanie przed zamknięciem obecnej sesji
  • [ ] Wykonano kopię zapasową działającej konfiguracji przed zmianami

15. Najczęściej zadawane pytania (FAQ)

Czy zmiana portu SSH naprawdę poprawia bezpieczeństwo?

Sama w sobie nie eliminuje ryzyka (to nie jest zabezpieczenie kryptograficzne), ale drastycznie redukuje liczbę automatycznych skanów i prób ataku w logach, ułatwiając wykrycie realnych zagrożeń.

Czy wyłączenie logowania hasłem jest bezpieczne dla wszystkich środowisk?

Tak, jest rekomendowane wszędzie tam, gdzie możliwe jest zarządzanie kluczami SSH. Jedynym ryzykiem jest utrata dostępu w razie błędu konfiguracji – dlatego zawsze należy testować w osobnej sesji.

Jaka jest różnica między PermitRootLogin no a prohibit-password?

no” całkowicie blokuje logowanie na konto root przez SSH. prohibit-password pozwala na logowanie roota wyłącznie kluczem SSH – przydatne w zautomatyzowanych systemach zarządzania konfiguracją.

Czy fail2ban wystarczy zamiast firewalla?

Nie. Fail2ban działa reaktywnie (blokuje po wykryciu ataku), a firewall działa prewencyjnie. Te mechanizmy powinny działać razem, najlepiej uzupełnione o Security Groups na poziomie chmury.

Jak często aktualizować konfigurację SSH hardeningu?

Warto przeglądać konfigurację co najmniej raz na kwartał oraz po każdej większej aktualizacji OpenSSH, ponieważ rekomendowane algorytmy kryptograficzne zmieniają się wraz z postępem kryptoanalizy.

Czy Ed25519 jest bezpieczniejszy niż RSA?

Ed25519 oferuje porównywalny lub wyższy poziom bezpieczeństwa przy znacznie krótszym kluczu i szybszych operacjach kryptograficznych. Jest rekomendowany jako domyślny wybór, o ile środowisko go wspiera.


16. Podsumowanie

SSH hardening to proces wielowarstwowy – żadne pojedyncze ustawienie nie zastąpi kompleksowego podejścia. Kluczowe filary to: uwierzytelnianie kluczem zamiast hasłem, eliminacja bezpośredniego dostępu roota, zawężenie algorytmów kryptograficznych, limity prób i czasu logowania, dodatkowa warstwa 2FA oraz aktywny monitoring i ochrona przed brute-force (fail2ban + firewall).

Wdrożenie powyższej checklisty i przykładowego pliku sshd_config pozwala zredukować powierzchnię ataku SSH do minimum, zachowując pełną funkcjonalność dla uprawnionych administratorów. Bezpieczeństwo SSH nie jest jednorazową konfiguracją – to proces wymagający regularnego audytu i aktualizacji zgodnie z rozwojem zagrożeń i standardów kryptograficznych.


Ostatnia aktualizacja: sierpień 2026. Artykuł bazuje na wytycznych CIS Benchmark, Mozilla OpenSSH Security Guidelines oraz dokumentacji OpenSSH.

 



Bezpłatne warsztaty: Zbuduj 5 Agentów AI

Sprawdź szczegóły:

https://asdevops.pl/warsztaty/

 

Bezpłatne warsztaty - Zbuduj 5 Agentów AI

X