SSH je glavni ulaz na server. Sve sigurnosne slabosti — slabe lozinke, generični usernameovi, otvoreni port 22, neograničen pristup — gravitiraju baš tu. Ova uputa pokazuje minimum standard za produkciju: SSH ključevi, disabled password auth, rate limiting i chroot jail za untrusted korisnike.
1. SSH ključevi umjesto lozinki
Generiranje para ključeva (klijent)
ssh-keygen -t ed25519 -C "ime@uredaj" -f ~/.ssh/id_ed25519
Ed25519 je brži i sigurniji od RSA-2048. Ako trebate kompatibilnost sa starim sustavima, RSA-4096:
ssh-keygen -t rsa -b 4096
Postavljanje javnog ključa na server
ssh-copy-id user@server
# ili ručno:
cat ~/.ssh/id_ed25519.pub | ssh user@server 'mkdir -p ~/.ssh && cat >> ~/.ssh/authorized_keys && chmod 700 ~/.ssh && chmod 600 ~/.ssh/authorized_keys'
Test
ssh user@server # trebalo bi raditi bez lozinke
2. Zaključavanje SSH daemona
Uredi /etc/ssh/sshd_config:
# izmjena porta — opcionalno, smanjuje šum botova, ne daje pravu sigurnost
Port 2222
# samo ključevi
PasswordAuthentication no
ChallengeResponseAuthentication no
UsePAM yes
KbdInteractiveAuthentication no
PermitRootLogin no
PermitEmptyPasswords no
# ograniči koji korisnici smiju preko SSH
AllowUsers deploy admin sftp-client1
# bez X11 forwardinga ako ga ne trebate
X11Forwarding no
# idle timeout
ClientAliveInterval 300
ClientAliveCountMax 2
# algoritmi (sigurniji subset)
KexAlgorithms curve25519-sha256,diffie-hellman-group16-sha512
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
Provjerite konfiguraciju i restart:
sshd -t # test sintakse
systemctl restart sshd
Ne prekidajte otvorenu SSH sesiju prije testa. Otvorite drugi terminal i provjerite da možete ući — ako ne, popravite s prve sesije.
3. Firewall — ograniči tko se može spojiti
Na ufw:
ufw allow from 85.10.0.0/16 to any port 22
ufw allow from 195.29.0.0/16 to any port 22
ufw deny 22
ufw enable
Za VPN-first pristup (preporuka za ozbiljne servere), SSH otvoren samo iznutra (WireGuard / OpenVPN).
4. Fail2ban — automatsko blokiranje brute force-a
apt install fail2ban
cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
Uredite /etc/fail2ban/jail.local:
[sshd]
enabled = true
port = ssh
filter = sshd
logpath = %(sshd_log)s
maxretry = 4
findtime = 10m
bantime = 24h
ignoreip = 127.0.0.1/8 85.10.0.0/16 # vaš VPN range
systemctl restart fail2ban
fail2ban-client status sshd
5. Chroot jail za SFTP-only korisnike
Kad klijentu treba samo SFTP upload (ne shell pristup), dajte mu chroot jail — ne može izaći iz svog foldera.
# kreiraj grupu i korisnika
groupadd sftponly
useradd -m -g sftponly -s /sbin/nologin sftp-klijent1
passwd sftp-klijent1 # ili authorized_keys
# ispravna vlasništva za chroot
chown root:root /home/sftp-klijent1
chmod 755 /home/sftp-klijent1
mkdir -p /home/sftp-klijent1/upload
chown sftp-klijent1:sftponly /home/sftp-klijent1/upload
Dodajte u /etc/ssh/sshd_config:
Match Group sftponly
ChrootDirectory /home/%u
ForceCommand internal-sftp
AllowTcpForwarding no
X11Forwarding no
PasswordAuthentication no
Restart sshd i testirajte s vanjskog klijenta.
6. Dodatna zaštita: 2FA na SSH
Za adminski pristup, uparite SSH ključ s drugim faktorom (TOTP).
apt install libpam-google-authenticator
google-authenticator # interaktivno, za vašeg user-a
U /etc/pam.d/sshd:
auth required pam_google_authenticator.so nullok
U /etc/ssh/sshd_config:
AuthenticationMethods publickey,keyboard-interactive
ChallengeResponseAuthentication yes
KbdInteractiveAuthentication yes
Sada SSH traži ključ + TOTP kod.
7. Audit — što se događa
# tko je u zadnje vrijeme bio logiran
last -a | head -20
# neuspjeli pokušaji
journalctl -u sshd | grep "Failed password" | tail
# trenutno spojeni
who
# historija komandi pojedinog usera
sudo cat /home/deploy/.bash_history | tail -50
8. Ključevi — rotacija i upravljanje
- Ne dijelite privatni ključ između ljudi — svaki admin svoj.
- Nemojte čuvati privatne ključeve bez passphrase-a (koristite ssh-agent).
- Rotirajte ključeve godišnje. Stari maknite iz
authorized_keys. - Kad netko napusti tim, odmah maknite njihov ključ sa svih servera — ne mijenja se lozinka, nego briše ključ.
9. Kontrolna lista
- PasswordAuthentication = no.
- PermitRootLogin = no.
- AllowUsers ograničava tko može ući.
- fail2ban aktivan, log provjeren.
- firewall dopušta SSH samo s poznatih IP-ova / VPN-a.
- SFTP-only korisnici u chroot jailu.
- 2FA za adminski SSH.
- Ključevi popisani, vlasnici poznati, rotacija planirana.
Na WMD managed serverima ovaj setup je default — hardening radimo pri svakom podizanju okoline. Ako trebate audit postojećeg servera ili migraciju s password-based pristupa na ključeve, javite se.