En server sættes op én gang og lever derefter videre af sig selv. En måned senere venter nogle pakker på opgradering, certifikatet er kommet inden for tre uger af udløbet, efter installationen af noget uvedkommende er der dukket en linje for meget op i SSH-konfigurationen, og det jail, der skulle holde øje med logins, er standset, uden at nogen opdagede det. Intet af det råber. Det hele holder bare stille op med at være sandt.
Herunder tolv ting, der er værd at tjekke regelmæssigt, med kommandoerne. Runden tager et kvarter. Rækkefølgen går fra det, man kommer ind gennem, til det, der går i stykker af sig selv.
SSH: fem linjer
Det, der skal ses på, er ikke filen, men den virksomme konfiguration: den sættes sammen af /etc/ssh/sshd_config, hele mappen sshd_config.d og byggets standardværdier.
sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'
Hvad vi gerne vil se: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries på 3–4 og x11forwarding no. De tre første er døren, de to sidste dens hængsler — et loft over antal forsøg pr. forbindelse og en grafikvideresendelse, som en server ikke har brug for.
To forbehold, begge nemme måder at låse sig selv ude på. For det første: sluk ikke for adgangskodelogin og root-login, før du har bekræftet, at din nøgle virker — i en separat session, uden at lukke den nuværende. Læser du dette logget ind som root med adgangskode, er det netop dig, de to linjer lukker ude.
For det andet: filernes rækkefølge. OpenSSH tager den første værdi, den møder for en parameter, og filerne i sshd_config.d læses alfabetisk. Sky-images lægger som regel en 50-cloud-init.conf der, og den vinder over din egen fil, hvis du kaldte den noget i retning af 90-hardening.conf. Egne indstillinger hører hjemme under et lavere nummer — 00- eller 10-. Og resultatet kontrolleres med sshd -T, ikke ved at læse filen.
Firewall: ét tjek
sudo ufw status verbose
Her er det værd at huske, at udskriften viser hensigter, ikke resultater. En regel kan stå på listen og ikke lukke noget: UFW selv er slået fra, porten betjenes af noget, Docker har publiceret (det skriver sine egne regler i iptables under UFW), eller trafikken når serveren ad en anden vej. Det betaler sig derfor at holde regellisten op mod, hvad der faktisk lytter udad:
sudo ss -tulpn | grep -v '127.0.0.1\|::1'
fail2ban: to tjek
Det er ikke nok, at tjenesten kører — der skal også være et fungerende jail til SSH.
sudo fail2ban-client status
sudo fail2ban-client status sshd
Den hyppigste ærgrelse her er et tavst jail. På Debian 12 og nyere Ubuntu findes /var/log/auth.log måske slet ikke: rsyslog er ikke installeret, og posterne lever kun i journald. Et jail med standardens logpath starter så, melder sig aktivt og blokerer aldrig nogen. Det kureres ved at pege det mod systemd-journalen:
printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban
Tegnet, der afslører dette uden at rode i konfigurationer: i fail2ban-client status sshd står «Currently failed» og «Total failed» på nul, mens journalen tydeligvis indeholder mislykkede logins.
Opdateringer: tre tjek
Hver for sig: hvor mange pakker der venter i alt, hvor mange af dem der vedrører sikkerhed, og om systemet beder om genstart efter en kerneopdatering.
sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'genstart krævet'
Det tredje tjek er, om automatiske sikkerhedsopdateringer er slået til, så de to første ikke bliver et månedligt ritual:
systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades
I den fil skal der stå et ettal på begge linjer. Mangler pakken: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.
Certifikater: ét tjek
Et Let's Encrypt-certifikat lever halvfems dage, og fornyelsen kører af sig selv lige indtil den dag, den ikke gør. Det, der skal ses på, er ikke registrarens panel, men hvad serveren faktisk leverer:
echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run
Den første kommando giver slutdatoen for det certifikat, der leveres for det navn, den anden kontrollerer, at fornyelsen går igennem uden at vente på den rigtige frist. Det betaler sig at gennemgå alle navne, serveren betjener, ikke kun hoveddomænet: det, man glemmer, er som regel underdomænet, der blev tilføjet senere.
Disk: ét tjek
df -h
df -i
To kommandoer, fordi plads og filposter slipper op uafhængigt af hinanden. På de fleste servere rammer den anden loftet først — millioner af små filer i PHP-sessioner eller i en applikationscache giver IUse% på 100 med gigabyte tilbage. Om begge tilfælde har vi en selvstændig tekst.
Hvad der er galt med denne liste
Listen er rigtig, men den har en egenskab: den kræver, at nogen husker den. Et kvarter om ugen er ikke meget, så længe serveren er én, og så længe der er en anledning. Efter to rolige måneder springes runden over, og at jailet er standset, får man at vide fra andres logfiler.
Derfor samlede vi præcis disse tolv tjek i et selvstændigt, gratis panel — Arcivéo FREE. Det installeres med én kommando, kører på din egen server, sender intet til os og kræver ingen registrering. En indsamler kører fra cron hvert femte minut og skriver det samme til en lokal database: SSH-logins og afviste forbindelser, tilstanden for UFW og fail2ban, ventende sikkerhedsopdateringer, certifikaternes frister, diskplads. Historikken dækker syv dage, grænsefladen findes på 34 sprog. Prisen er nul, også på en arbejdsserver: licensen tillader installation på egne maskiner, virksomhedens maskiner inklusive, og tillader ikke videresalg eller drift som tjeneste for andres servere.
Stakken i gratisudgaven er beskeden: den installerer og slår UFW og fail2ban til og viser derefter tilstanden. ModSecurity, Suricata, AIDE og de øvrige moduler er ikke med, de hører til den betalte. Men for at holde op med at bære den ugentlige runde i hovedet rækker den. Hvordan de samme data ser ud i det fulde panel, viser demosiderne nedenfor.