A kiszolgálót egyszer állítják be, azután magától él tovább. Egy hónappal később néhány csomag frissítésre vár, a tanúsítvány három hétre közelített a lejárathoz, valami idegen telepítése után egy fölösleges sor került az SSH beállításaiba, a jail pedig, amelynek a bejelentkezéseket kellene figyelnie, leállt anélkül, hogy bárki észrevette volna. Ezek közül egyik sem kiabál. Minden csak csendben megszűnik igaz lenni.

Az alábbiakban tizenkét dolog, amelyet érdemes rendszeresen ellenőrizni, parancsokkal együtt. A kör negyedórát vesz igénybe. A sorrend attól halad, amin át bejutnak, addig, ami magától romlik el.

SSH: öt sor

Nem a fájlt kell megnézni, hanem a tényleges konfigurációt: az /etc/ssh/sshd_config fájlból, a teljes sshd_config.d könyvtárból és a fordítás alapértékeiből áll össze.

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

Amit látni szeretnénk: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries 3–4 körül és x11forwarding no. Az első három az ajtó, az utolsó kettő a zsanérja — korlát a kapcsolatonkénti próbálkozásokra, és grafikus továbbítás, amelyre egy kiszolgálónak nincs szüksége.

Két kikötés, mindkettő könnyű módja annak, hogy kizárja magát. Először: ne kapcsolja ki a jelszavas és a root-bejelentkezést addig, amíg meg nem győződött róla, hogy a kulcsa működik — külön munkamenetben, a jelenlegi bezárása nélkül. Ha ezt rootként, jelszóval bejelentkezve olvassa, az a két sor éppen önt zárja ki.

Másodszor: a fájlok sorrendje. Az OpenSSH az első értéket veszi, amellyel egy paraméterre találkozik, és az sshd_config.d fájljai betűrendben olvasódnak be. A felhőképek általában egy 50-cloud-init.conf fájlt hagynak ott, és az felülírja a sajátját, ha azt például 90-hardening.conf névre keresztelte. A saját beállítások kisebb szám alá valók — 00- vagy 10-. Az eredményt pedig az sshd -T paranccsal kell ellenőrizni, nem a fájl elolvasásával.

Tűzfal: egy ellenőrzés

sudo ufw status verbose

Érdemes észben tartani, hogy ez a kimenet szándékokat mutat, nem eredményeket. Egy szabály szerepelhet a listán úgy, hogy semmit nem zár le: maga az UFW ki van kapcsolva, a portot olyasmi szolgálja ki, amit a Docker tett közzé (saját szabályait az iptablesbe írja az UFW alá), vagy a forgalom más úton éri el a kiszolgálót. Megéri tehát a szabálylistát összevetni azzal, ami valóban kifelé figyel:

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

fail2ban: két ellenőrzés

Nem elég, hogy a szolgáltatás fut — működő jail is kell az SSH-hoz.

sudo fail2ban-client status
sudo fail2ban-client status sshd

A leggyakoribb baj itt a néma jail. Debian 12-n és a friss Ubuntukon a /var/log/auth.log akár egyáltalán nem is létezik: az rsyslog nincs telepítve, a bejegyzések csak a journaldban élnek. A gyári logpath beállítású jail ilyenkor elindul, aktívnak jelenti magát, és soha senkit nem tilt ki. A gyógymód az, hogy a systemd naplójára irányítjuk:

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

A jel, amelyből ez a konfigurációkban való turkálás nélkül kiderül: a fail2ban-client status sshd kimenetében a „Currently failed” és a „Total failed” nullán áll, miközben a naplóban bőven vannak sikertelen bejelentkezések.

Frissítések: három ellenőrzés

Külön-külön: hány csomag vár összesen, azokból hány biztonsági, és kér-e a rendszer újraindítást egy kernelfrissítés után.

sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'újraindítás szükséges'

A harmadik ellenőrzés az, hogy be van-e kapcsolva az automatikus biztonsági frissítés, nehogy az első kettőből havi rituálé legyen:

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

Abban a fájlban mindkét sorban egyesnek kell állnia. Ha a csomag hiányzik: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.

Tanúsítványok: egy ellenőrzés

Egy Let's Encrypt tanúsítvány kilencven napig él, a megújítás pedig magától működik — pontosan addig a napig, amíg abba nem hagyja. Nem a regisztrátor felületét kell nézni, hanem azt, amit a kiszolgáló valóban kiszolgál:

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

Az első parancs megadja annak a tanúsítványnak a lejáratát, amelyet arra a névre ad ki a kiszolgáló; a második ellenőrzi, hogy a megújítás átmegy, anélkül hogy a valódi határidőt megvárnánk. Érdemes végigmenni minden néven, amelyet a kiszolgáló kiszolgál, nem csak a fő domainen: rendszerint a később hozzáadott aldomain az, amelyik kimarad.

Lemez: egy ellenőrzés

df -h
df -i

Két parancs, mert a hely és a fájlbejegyzések egymástól függetlenül fogynak el. A legtöbb kiszolgálón a második ér előbb a plafonhoz — PHP-munkamenetekben vagy alkalmazásgyorsítótárban lévő több millió apró fájl 100-as IUse% értéket ad, miközben gigabájtok szabadok. Mindkét esetről külön írásunk van.

Mi a baj ezzel a listával

A lista helyes, de van egy tulajdonsága: megköveteli, hogy valaki emlékezzen rá. Heti negyedóra nem sok, amíg egy kiszolgáló van, és amíg van rá ok. Két nyugodt hónap után a kör kimarad, és arról, hogy a jail leállt, mások naplóiból értesül az ember.

Ezért tettük pontosan ezt a tizenkét ellenőrzést egy külön, ingyenes felületbe — Arcivéo FREE. Egyetlen paranccsal telepíthető, a saját kiszolgálóján fut, semmit nem küld nekünk, és nem kér regisztrációt. Egy gyűjtő ötpercenként indul cronból, és ugyanazt írja egy helyi adatbázisba: SSH-bejelentkezések és elutasított kapcsolatok, az UFW és a fail2ban állapota, várakozó biztonsági frissítések, a tanúsítványok határidői, lemezterület. Az előzmény hét napot fog át, a felület 34 nyelven érhető el. Az ár nulla, munkakiszolgálón is: a licenc engedi a felület telepítését saját gépekre, a cég gépeit is beleértve, és nem engedi a továbbértékesítést vagy a szolgáltatásként való üzemeltetést mások kiszolgálóihoz.

Az ingyenes kiadás készlete szerény: telepíti és bekapcsolja az UFW-t és a fail2bant, onnantól pedig az állapotot mutatja. A ModSecurity, a Suricata, az AIDE és a többi modul nincs benne, azok a fizetőshöz tartoznak. De ahhoz, hogy a heti kört ne kelljen fejben tartani, elég. Hogy ugyanezek az adatok hogyan néznek ki a teljes felületen, azt az alábbi bemutatóoldalak mutatják meg.