Tropic Host

Zabezpečení VPS od začátku: klíče SSH, firewall a Fail2ban

7 min čtení
Tropic
Zabezpečení VPS od začátku: klíče SSH, firewall a Fail2ban

Language: cs

Zabezpečení VPS od začátku: klíče SSH, firewall a Fail2ban

Nový VPS nelze považovat za bezpečný hned po instalaci Ubuntu. Ještě před nastavením přístupu je server viditelný skenerům: zkoušejí hesla SSH, hledají vystavené ovládací panely a kontrolují běžné zranitelnosti. V tomto návodu projdeme základní kroky zabezpečení VPS od nuly: vytvoření samostatného uživatele, nastavení ověřování pomocí klíče SSH, omezení síťových portů pomocí UFW a přidání Fail2ban. Všechny kroky fungují s Ubuntu 22.04 a 24.04, pokud příkazy spouští uživatel s oprávněními sudo.

Než začnete: vytvořte si seznam portů

Neotvírejte porty „pro jistotu“. Typický webový server potřebuje:

  • 22/tcp — SSH; ideálně ho omezte podle IP nebo ho přesuňte na jiný port pouze jako doplňkové opatření;
  • 80/tcp — HTTP; obvykle je potřeba pro přesměrování na HTTPS a ověření certifikátu;
  • 443/tcp — HTTPS.

Port aplikace, například 3000, 8080 nebo 9000, by neměl být dostupný z internetu, pokud před aplikací běží Nginx nebo Caddy. Navažte aplikaci na 127.0.0.1 nebo povolte její port pouze v interní síti. Nejprve zjistěte, co na serveru naslouchá:

sudo ss -tulpn

Po instalaci Dockeru zkontrolujte jeho pravidla iptables samostatně: publikování pomocí -p 3000:3000 může zpřístupnit port mimo očekávané nastavení. U veřejné služby je bezpečnější použít HTTPS proxy a interní port ponechat skrytý.

Krok 1. Aktualizujte systém a vytvořte správce

Připojte se k VPS pomocí přihlašovacích údajů, které jste obdrželi, a nainstalujte aktualizace:

sudo apt update
sudo apt full-upgrade -y
sudo apt install -y ufw fail2ban unattended-upgrades

Vytvořte osobního uživatele. alex nahraďte vlastním jménem:

sudo adduser alex
sudo usermod -aG sudo alex

Původní přístup neodstraňujte, dokud nový účet neotestujete v samostatném okně terminálu. Je to důležité pravidlo: chybu v SSH lze snadněji opravit, dokud je aktuální relace stále otevřená.

Krok 2. Vytvořte klíč SSH a nainstalujte ho na server

Na počítači s Linuxem, macOS nebo Windows PowerShell spusťte:

ssh-keygen -t ed25519 -C "alex@my-computer"

Stisknutím Enteru uložte klíč do výchozího souboru a poté nastavte přístupovou frázi. Soukromý klíč nikdy neposílejte v chatu, nevkládejte ho do repozitáře ani ho nekopírujte na VPS. Na server se má přenést pouze soubor s příponou .pub:

ssh-copy-id alex@SERVER_IP

Pokud ssh-copy-id není k dispozici, zobrazte veřejný klíč pomocí Get-Content $env:USERPROFILE\.ssh\id_ed25519.pub v PowerShellu a poté ho přidejte na server:

sudo install -d -m 700 -o alex -g alex /home/alex/.ssh
sudo nano /home/alex/.ssh/authorized_keys
sudo chown alex:alex /home/alex/.ssh/authorized_keys
sudo chmod 600 /home/alex/.ssh/authorized_keys

Vložte klíč na jeden řádek a před vypnutím hesel otestujte přihlášení:

ssh alex@SERVER_IP
sudo whoami

Očekávaným výsledkem posledního příkazu je root. Pokud klient SSH klíč nenajde, uveďte ho explicitně: ssh -i ~/.ssh/id_ed25519 alex@SERVER_IP.

Krok 3. Zakažte přihlášení root a ověřování heslem

Zálohujte konfiguraci SSH:

sudo cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak
sudo nano /etc/ssh/sshd_config

Ujistěte se, že soubor obsahuje tyto parametry:

PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes
KbdInteractiveAuthentication no
MaxAuthTries 3

V Ubuntu mohou být nastavení umístěna v /etc/ssh/sshd_config.d/*.conf, proto zkontrolujte efektivní konfiguraci:

sudo sshd -t
sudo sshd -T | grep -E 'permitrootlogin|passwordauthentication|pubkeyauthentication|maxauthtries'

Pokud sshd -t ohlásí chybu, nerestartujte službu, dokud neopravíte syntaxi. Po úspěšné kontrole nastavení použijte:

sudo systemctl reload ssh

Staré připojení SSH ponechte otevřené a přihlášení pomocí klíče otestujte v novém okně. Vypnutí hesel bez ověřeného klíče je nejčastější způsob, jak ztratit přístup k serveru.

Krok 4. Nakonfigurujte UFW, aniž byste zablokovali SSH

UFW je pohodlný obal nad síťovými pravidly Linuxu. Nejprve nastavte bezpečné výchozí hodnoty a potom povolte SSH a webové porty:

sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'
sudo ufw enable

Aktivaci potvrďte až po přidání pravidla pro SSH. Zkontrolujte výsledek:

sudo ufw status verbose
sudo ufw status numbered

U trvalé kancelářské IP můžete SSH omezit na tuto adresu:

sudo ufw delete allow 22/tcp
sudo ufw allow from YOUR.PUBLIC.IP to any port 22 proto tcp comment 'SSH office'

Tuto možnost použijte pouze s trvalou IP a přístupem ke konzoli poskytovatele: pokud se adresa změní, můžete se sami odříznout.

Jak dočasně otevřít port aplikace

Pokud potřebujete službu zkontrolovat přímo, vytvořte pravidlo s omezeným zdrojem:

sudo ufw allow from YOUR.PUBLIC.IP to any port 8080 proto tcp

Po testu ho smažte pomocí čísla, které zobrazí ufw status numbered:

sudo ufw delete RULE_NUMBER

Nepoužívejte sudo ufw allow 1:65535/tcp: takové pravidlo promění firewall ve formalitu.

Krok 5. Povolte Fail2ban pro SSH

Fail2ban analyzuje logy a po několika neúspěšných pokusech o přihlášení přidá dočasné blokovací pravidlo. Nenahrazuje klíče SSH ani firewall, ale omezuje šum z automatizovaných pokusů hrubou silou.

Vytvořte místní konfiguraci, aby aktualizace balíčků nepřepsaly vaše nastavení:

sudo cp /etc/fail2ban/jail.conf /etc/fail2ban/jail.local
sudo nano /etc/fail2ban/jail.local

V části [DEFAULT] nastavte rozumné hodnoty:

[DEFAULT]
bantime = 1h
findtime = 10m
maxretry = 5
backend = systemd
banaction = ufw

[sshd]
enabled = true
port = 22

Spusťte službu a zkontrolujte jail:

sudo systemctl enable --now fail2ban
sudo fail2ban-client status
sudo fail2ban-client status sshd

Ve výstupu sshd zkontrolujte počet neúspěšných pokusů a zablokované adresy. Nepřidávejte do seznamu ban vlastní IP. Pro trvalou výjimku použijte ignoreip = 127.0.0.1/8 YOUR.PUBLIC.IP v části [DEFAULT].

Krok 6. Povolte automatické aktualizace

Automatické aktualizace jsou užitečné pro bezpečnostní balíčky, ale restarty po aktualizaci jádra je stále nutné řídit:

sudo dpkg-reconfigure -plow unattended-upgrades
sudo systemctl status unattended-upgrades

Jednou týdně zkontrolujte, zda je vyžadován restart:

test -f /var/run/reboot-required && echo 'Требуется перезапуск'

Před ručním restartem se ujistěte, že máte funkční klíč a přístup ke konzoli VPS. Po restartu zkontrolujte služby aplikace, Nginx, UFW a Fail2ban.

Krok 7. Zkontrolujte výsledek zvenčí

Ochranu ověřte z jiného počítače, nejen čtením konfigurace:

ssh -o PreferredAuthentications=password -o PubkeyAuthentication=no alex@SERVER_IP

Příkaz by měl skončit zamítnutím přístupu. Samostatně otestujte funkční přihlášení pomocí klíče:

ssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 alex@SERVER_IP

Na VPS zkontrolujte naslouchající adresy a pravidla:

sudo ss -lntup
sudo ufw status numbered
sudo fail2ban-client status sshd

Port aplikace by měl naslouchat na 127.0.0.1, pokud není určen pro přímý přístup. Z externího hostitele můžete použít nmap SERVER_IP, ale skenujte pouze vlastní server: kontrola infrastruktury někoho jiného bez povolení může porušovat zákon i pravidla poskytovatele.

Zálohy a obnova

Ochrana SSH nechrání před smazanými daty, chybou správce ani napadenou aplikací. Kopie databáze, konfigurace a uživatelských souborů ukládejte odděleně od VPS. Minimální nastavení tvoří denní záloha, několik verzí z předchozích dnů a pravidelné testy obnovy.

Hesla ani tokeny nezapisujte do skriptů v prostém textu. Pokud dojde k odhalení tajného údaje, okamžitě ho zneplatněte a vytvořte nový.

Jak vybrat VPS pro bezpečný projekt

Bezpečnost začíná kontrolou nad infrastrukturou. Na VPS si můžete sami zvolit operační systém, pravidla firewallu, způsob přístupu, zálohy a umístění služeb. U malého webu nebo API je stabilní síť, SSD úložiště a konzole pro obnovu důležitější než nadbytek virtuálních jader.

Při spuštění projektu na VPS u tropic.host si předem definujte jeho veřejné vstupní body: ve většině případů stačí SSH, HTTP a HTTPS. Databázi a ovládací panely ponechte v interní síti. S růstem projektu pomáhají samostatné instance VPS pro aplikaci, databázi a monitoring oddělit domény poruch.

Časté chyby

  • Vypnutí hesel před otestováním přihlášení pomocí klíče. Aktuální relaci ponechte otevřenou a nové přihlášení testujte samostatně.
  • Ponechání 22/tcp otevřeného pro celý svět, i když by ho bylo možné povolit pouze z důvěryhodných adres.
  • Přímé publikování portů Dockeru. Nejprve zkontrolujte pravidla Dockeru a UFW.
  • Instalace Fail2ban bez další kontroly logů. Po změnách projděte journalctl -u ssh a stav jail.

Závěr

Základní ochrana VPS nezabere mnoho času, pokud kroky provedete ve správném pořadí: vytvořte samostatného uživatele, nainstalujte klíč SSH, ověřte přístup, zakažte přihlášení root a hesla, povolte UFW, nakonfigurujte Fail2ban a nastavte automatické aktualizace. Potom přidejte zálohy, logování a externí monitoring.

Tyto kroky server neučiní nezranitelným, ale odstraní nejčastější chyby počáteční konfigurace. Dalším krokem je přizpůsobit bezpečnostní profil konkrétní aplikaci: aktualizovat závislosti, omezit oprávnění služeb, chránit administrační panely a pravidelně kontrolovat otevřené porty.

FAQ

Musím změnit výchozí port SSH?

Ne nutně. Přesunutí portu omezí automatizovaný šum, ale nenahradí klíče, vypnutá hesla, UFW ani Fail2ban. Pokud port změníte, aktualizujte pravidlo firewallu a parametr port v jailu Fail2ban.

Co mám dělat, když po konfiguraci UFW ztratím přístup?

Použijte webovou nebo záchrannou konzoli poskytovatele a zkontrolujte pravidlo SSH i konfiguraci sshd. Starou funkční relaci nezavírejte, dokud nepotvrdíte nové přihlášení.

Stačí Fail2ban k ochraně SSH?

Ne. Fail2ban reaguje na neúspěšná přihlášení, ke kterým už došlo. Základem mají být klíče SSH, vypnuté ověřování heslem, minimální oprávnění uživatele a omezený firewall.

Mohu povolit SSH pouze z jedné IP adresy?

Ano, pokud je adresa trvalá: přidejte pro ni pravidlo UFW allow from. Předem si zajistěte přístup ke konzoli poskytovatele nebo jinou záložní cestu, protože po změně IP bude připojení zablokováno.

Jak často mám kontrolovat zabezpečení VPS?

Po každé změně SSH, firewallu nebo publikování portů Dockeru proveďte kontrolu portů a otestujte přihlášení. V rámci běžné údržby kontrolujte aktualizace a logy alespoň jednou týdně a pravidelně testujte obnovu ze zálohy.