En server settes opp én gang og lever deretter videre av seg selv. En måned senere venter noen pakker på oppgradering, sertifikatet har kommet innenfor tre uker fra utløp, etter installasjonen av noe uvedkommende har det dukket opp en linje for mye i SSH-konfigurasjonen, og jailet som skal følge med på innloggingene har stanset uten at noen merket det. Ingenting av dette roper. Alt slutter bare stille å være sant.

Nedenfor tolv ting det er verdt å sjekke jevnlig, med kommandoene. Runden tar et kvarter. Rekkefølgen går fra det man kommer inn gjennom til det som går i stykker av seg selv.

SSH: fem linjer

Det som skal ses på, er ikke filen, men den virksomme konfigurasjonen: den settes sammen av /etc/ssh/sshd_config, hele katalogen sshd_config.d og standardverdiene fra byggingen.

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

Det vi vil se: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries på 3–4 og x11forwarding no. De tre første er døren, de to siste hengslene — et tak for antall forsøk per tilkobling, og en grafikkvideresending en server ikke har bruk for.

To forbehold, begge enkle måter å låse seg selv ute på. For det første: ikke slå av passordinnlogging og root-innlogging før du har bekreftet at nøkkelen din virker — i en egen økt, uten å lukke den pågående. Leser du dette innlogget som root med passord, er det nettopp deg de to linjene stenger ute.

For det andre: rekkefølgen på filene. OpenSSH tar den første verdien den møter for en parameter, og filene i sshd_config.d leses alfabetisk. Skybilder legger som regel en 50-cloud-init.conf der, og den vinner over din egen fil hvis du kalte den noe slikt som 90-hardening.conf. Egne innstillinger hører hjemme under et lavere nummer — 00- eller 10-. Og resultatet kontrolleres med sshd -T, ikke ved å lese filen.

Brannmur: én sjekk

sudo ufw status verbose

Her er det verdt å huske at utskriften viser hensikter, ikke resultater. En regel kan stå i listen og ikke stenge noe som helst: UFW selv er slått av, porten betjenes av noe Docker har publisert (det skriver egne regler i iptables under UFW), eller trafikken når serveren en annen vei. Det lønner seg derfor å holde regellisten opp mot hva som faktisk lytter utover:

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

fail2ban: to sjekker

Det holder ikke at tjenesten kjører — det må også finnes et fungerende jail for SSH.

sudo fail2ban-client status
sudo fail2ban-client status sshd

Den vanligste plagen her er et taust jail. På Debian 12 og nyere Ubuntu kan /var/log/auth.log mangle helt: rsyslog er ikke installert, og oppføringene lever bare i journald. Et jail med standard logpath starter da, melder seg aktivt og blokkerer aldri noen. Kuren er å peke det mot systemd-journalen:

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

Tegnet som avslører dette uten graving i konfigurasjoner: i fail2ban-client status sshd står «Currently failed» og «Total failed» på null, mens journalen åpenbart inneholder mislykkede innlogginger.

Oppdateringer: tre sjekker

Hver for seg: hvor mange pakker som venter i alt, hvor mange av dem som gjelder sikkerhet, og om systemet ber om omstart etter en kjerneoppdatering.

sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'omstart kreves'

Den tredje sjekken er om automatiske sikkerhetsoppdateringer er slått på, slik at de to første ikke blir et månedlig rituale:

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

I den filen skal det stå et ettall på begge linjene. Mangler pakken: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.

Sertifikater: én sjekk

Et Let's Encrypt-sertifikat lever nitti dager, og fornyelsen går av seg selv helt fram til den dagen den ikke gjør det. Det som skal ses på, er ikke registrarens panel, men hva 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 kommandoen gir sluttdatoen for sertifikatet som leveres for det navnet, den andre kontrollerer at fornyelsen går gjennom uten å vente på den virkelige fristen. Det lønner seg å gå gjennom alle navn serveren betjener, ikke bare hoveddomenet: det man glemmer, er som regel underdomenet som ble lagt til senere.

Disk: én sjekk

df -h
df -i

To kommandoer, fordi plass og filoppføringer tar slutt uavhengig av hverandre. På de fleste servere treffer den andre taket først — millioner av små filer i PHP-økter eller i en applikasjonsbuffer gir IUse% på 100 med gigabyte ledig. Om begge tilfellene har vi en egen tekst.

Hva som er galt med denne listen

Listen er riktig, men den har en egenskap: den krever at noen husker på den. Et kvarter i uken er ikke mye, så lenge serveren er én og så lenge det finnes en grunn. Etter to rolige måneder hoppes runden over, og at jailet har stanset, får man vite fra andres logger.

Derfor samlet vi nøyaktig disse tolv sjekkene i et eget, gratis panel — Arcivéo FREE. Det installeres med én kommando, kjører på din egen server, sender ingenting til oss og krever ingen registrering. En innsamler kjøres fra cron hvert femte minutt og skriver det samme til en lokal database: SSH-innlogginger og avviste tilkoblinger, tilstanden til UFW og fail2ban, ventende sikkerhetsoppdateringer, fristene til sertifikatene, diskplass. Historikken dekker sju dager, grensesnittet finnes på 34 språk. Prisen er null, også på en arbeidsserver: lisensen tillater installasjon på egne maskiner, bedriftens maskiner inkludert, og tillater ikke videresalg eller drift som tjeneste for andres servere.

Stakken i gratisutgaven er beskjeden: den installerer og slår på UFW og fail2ban, og viser deretter tilstanden. ModSecurity, Suricata, AIDE og de øvrige modulene finnes ikke der, de hører til den betalte. Men for å slutte å bære den ukentlige runden i hodet holder den. Hvordan de samme dataene ser ut i det fullstendige panelet, viser demosidene nedenfor.