Server se nastaví jednou a pak si žije sám. O měsíc později čeká část balíčků na aktualizaci, certifikát se přiblížil na tři týdny k vypršení, po instalaci něčeho cizího přibyl v konfiguraci SSH řádek navíc a jail, který měl hlídat přihlášení, se zastavil, aniž by si toho kdokoli všiml. Nic z toho nekřičí. Všechno jen tiše přestává být pravda.

Níže je dvanáct věcí, které stojí za to kontrolovat pravidelně, i s příkazy. Obchůzka zabere čtvrt hodiny. Pořadí vede od toho, čím se dovnitř vchází, k tomu, co se rozbije samo.

SSH: pět řádků

Dívat se nemá na soubor, ale na výslednou konfiguraci: skládá se z /etc/ssh/sshd_config, celého adresáře sshd_config.d a výchozích hodnot sestavení.

sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'

Co chceme vidět: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries na 3–4 a x11forwarding no. První tři jsou dveře, poslední dvě jejich panty — strop pro počet pokusů na spojení a přeposílání grafiky, které server k ničemu nepotřebuje.

Dvě výhrady, obojí snadný způsob, jak se zamknout venku. Zaprvé: nevypínejte přihlášení heslem ani přihlášení pod rootem dřív, než si ověříte, že klíč funguje — v samostatné relaci, aniž byste tu současnou zavřeli. Pokud tohle čtete přihlášení jako root heslem, zamknou venku právě vás.

Zadruhé: pořadí souborů. OpenSSH bere první hodnotu parametru, na kterou narazí, a soubory v sshd_config.d se čtou abecedně. Cloudové obrazy tam obvykle nechávají 50-cloud-init.conf, a ten přebije váš vlastní soubor, pokud jste ho pojmenovali třeba 90-hardening.conf. Vlastní nastavení patří pod nižší číslo — 00- nebo 10-. A výsledek se ověřuje příkazem sshd -T, ne čtením souboru.

Firewall: jedna kontrola

sudo ufw status verbose

Je dobré pamatovat, že tenhle výpis ukazuje záměry, ne výsledky. Pravidlo může být v seznamu a nic nezavírat: samotný UFW je vypnutý, port obsluhuje něco, co publikoval Docker (zapisuje si vlastní pravidla do iptables pod UFW), nebo se provoz k serveru dostává jinou cestou. Vyplatí se tedy porovnat seznam pravidel s tím, co ve skutečnosti naslouchá ven:

sudo ss -tulpn | grep -v '127.0.0.1\|::1'

fail2ban: dvě kontroly

Nestačí, že služba běží — musí existovat i funkční jail pro SSH.

sudo fail2ban-client status
sudo fail2ban-client status sshd

Nejčastější potíží je tu mlčící jail. Na Debianu 12 a novějších Ubuntu nemusí soubor /var/log/auth.log existovat vůbec: rsyslog není nainstalovaný a záznamy žijí jen v journaldu. Jail s výchozím logpath se pak spustí, hlásí se jako aktivní a nikoho nikdy nezabanuje. Léčí se přesměrováním na žurnál systemd:

printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban

Znak, podle kterého se to pozná bez hrabání v konfiguracích: v fail2ban-client status sshd stojí „Currently failed“ i „Total failed“ na nule, zatímco v žurnálu jsou neúspěšná přihlášení více než patrná.

Aktualizace: tři kontroly

Zvlášť: kolik balíčků čeká celkem, kolik z nich se týká bezpečnosti a jestli systém po aktualizaci jádra nežádá restart.

sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'je potřeba restart'

Třetí kontrola je, zda jsou zapnuté automatické bezpečnostní aktualizace, aby se z prvních dvou nestal měsíční rituál:

systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades

V tom souboru má na obou řádcích stát jednička. Pokud balíček chybí: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.

Certifikáty: jedna kontrola

Certifikát Let's Encrypt žije devadesát dní a obnova běží sama přesně do dne, kdy přestane. Dívat se nemá do panelu registrátora, ale na to, co server skutečně vydává:

echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run

První příkaz udá datum konce certifikátu vydávaného pro to jméno, druhý ověří, že obnova projde, aniž by se čekalo na skutečnou lhůtu. Vyplatí se projít všechna jména, která server obsluhuje, ne jen hlavní doménu: zapomíná se zpravidla na subdoménu přidanou později.

Disk: jedna kontrola

df -h
df -i

Dva příkazy, protože místo a záznamy o souborech docházejí nezávisle na sobě. Na většině serverů narazí na strop dřív ten druhý — miliony drobných souborů v PHP relacích nebo v mezipaměti aplikace dají IUse% rovné 100 při volných gigabajtech. K oběma případům máme samostatný text.

Co je na tomhle seznamu špatně

Seznam je správný, ale má jednu vlastnost: vyžaduje, aby si na něj někdo vzpomněl. Čtvrt hodiny týdně není mnoho, dokud je server jeden a dokud je důvod. Po dvou klidných měsících obchůzka vypadne a o tom, že se jail zastavil, se člověk dozví z cizích logů.

Proto jsme přesně těchto dvanáct kontrol shrnuli do samostatného bezplatného panelu — Arcivéo FREE. Instaluje se jedním příkazem, běží na vašem serveru, nic nám neposílá a nevyžaduje registraci. Sběrač se spouští z cronu každých pět minut a zapisuje totéž do místní databáze: přihlášení přes SSH a odmítnutá spojení, stav UFW a fail2banu, čekající bezpečnostní aktualizace, lhůty certifikátů, místo na disku. Historie pokrývá sedm dní, rozhraní je ve 34 jazycích. Cena je nulová, i na pracovním serveru: licence dovoluje instalovat panel na vlastní stroje, firemní nevyjímaje, a nedovoluje jej dál prodávat ani provozovat jako službu pro cizí servery.

Stack bezplatné edice je skromný: nainstaluje a zapne UFW a fail2ban a dál ukazuje stav. ModSecurity, Suricata, AIDE a ostatní moduly v ní nejsou, ty patří k placené. Ale na to, abyste si týdenní obchůzku přestali držet v hlavě, stačí. Jak tatáž data vypadají na plném panelu, ukazují ukázkové stránky níže.