Een server wordt één keer ingericht en leeft daarna vanzelf verder. Een maand later wachten er pakketten op een upgrade, is het certificaat tot op drie weken van zijn vervaldatum geschoven, staat er na de installatie van iets vreemds een regel te veel in de SSH-configuratie, en is de jail die de aanmeldingen moet bewaken gestopt zonder dat iemand het merkte. Niets daarvan schreeuwt. Het houdt alleen stilletjes op waar te zijn.
Hieronder twaalf dingen die het waard zijn om regelmatig te controleren, met de commando’s. De ronde kost een kwartier. De volgorde loopt van dat waardoor men binnenkomt naar dat wat vanzelf stukgaat.
SSH: vijf regels
Waar het om gaat is niet het bestand maar de werkelijke configuratie: die wordt samengesteld uit /etc/ssh/sshd_config, de hele map sshd_config.d en de standaardwaarden van de build.
sudo sshd -T | grep -iE 'permitrootlogin|passwordauthentication|permitemptypasswords|maxauthtries|x11forwarding'
Wat we willen zien: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries op 3–4 en x11forwarding no. De eerste drie zijn de deur, de laatste twee de scharnieren — een bovengrens aan pogingen per verbinding, en grafische doorvoer waar een server niets aan heeft.
Twee kanttekeningen, allebei makkelijke manieren om jezelf buiten te sluiten. Ten eerste: zet aanmelden met wachtwoord en aanmelden als root niet uit voordat u hebt vastgesteld dat uw sleutel werkt — in een aparte sessie, zonder de huidige te sluiten. Leest u dit terwijl u als root met een wachtwoord bent ingelogd, dan sluiten juist die twee regels u buiten.
Ten tweede: de volgorde van de bestanden. OpenSSH neemt de eerste waarde die het voor een parameter tegenkomt, en de bestanden in sshd_config.d worden alfabetisch gelezen. Cloud-images zetten daar meestal een 50-cloud-init.conf neer, en die wint het van uw eigen bestand als u dat bijvoorbeeld 90-hardening.conf hebt genoemd. Eigen instellingen horen onder een lager nummer — 00- of 10-. En het resultaat controleert u met sshd -T, niet door het bestand te lezen.
Firewall: één controle
sudo ufw status verbose
Daarbij is het goed te onthouden dat deze uitvoer bedoelingen toont en geen resultaten. Een regel kan in de lijst staan en niets afsluiten: UFW zelf staat uit, de poort wordt bediend door iets wat Docker heeft gepubliceerd (het schrijft zijn eigen regels in iptables onder UFW), of het verkeer bereikt de server langs een andere weg. Het loont dus om de regellijst te leggen naast wat er werkelijk naar buiten luistert:
sudo ss -tulpn | grep -v '127.0.0.1\|::1'
fail2ban: twee controles
Het is niet genoeg dat de dienst draait — er moet ook een werkende jail voor SSH zijn.
sudo fail2ban-client status
sudo fail2ban-client status sshd
Het vaakst gaat het hier mis met een zwijgende jail. Op Debian 12 en recente Ubuntu-versies kan /var/log/auth.log helemaal ontbreken: rsyslog is niet geïnstalleerd en de regels leven alleen in journald. Een jail met het standaard logpath start dan, meldt zich actief en blokkeert nooit iemand. De remedie is hem op het systemd-journaal richten:
printf '[sshd]\nenabled = true\nbackend = systemd\n' | sudo tee /etc/fail2ban/jail.d/sshd-systemd.local
sudo systemctl restart fail2ban
Het teken waaraan u dit herkent zonder in configuraties te graven: in fail2ban-client status sshd blijven «Currently failed» en «Total failed» op nul staan terwijl het journaal onmiskenbaar mislukte aanmeldingen bevat.
Updates: drie controles
Apart: hoeveel pakketten er in totaal wachten, hoeveel daarvan beveiligingsupdates zijn, en of het systeem na een kernel-update om een herstart vraagt.
sudo apt update
apt list --upgradable 2>/dev/null | grep -c -- '-security'
ls /var/run/reboot-required 2>/dev/null && echo 'herstart nodig'
De derde controle is of automatische beveiligingsupdates aanstaan, zodat de eerste twee geen maandelijks ritueel worden:
systemctl status unattended-upgrades --no-pager
cat /etc/apt/apt.conf.d/20auto-upgrades
In dat bestand hoort op beide regels een 1 te staan. Ontbreekt het pakket: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.
Certificaten: één controle
Een Let's Encrypt-certificaat leeft negentig dagen, en de verlenging werkt vanzelf tot precies de dag waarop ze dat niet meer doet. Waar het om gaat is niet het paneel van de registrar maar wat de server werkelijk uitlevert:
echo | openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -enddate
sudo certbot renew --dry-run
Het eerste commando geeft de einddatum van het certificaat dat voor die naam wordt uitgeleverd; het tweede controleert dat de verlenging lukt, zonder de echte termijn af te wachten. Het loont om alle namen langs te gaan die de server bedient, niet alleen het hoofddomein: wat men vergeet is doorgaans het later toegevoegde subdomein.
Schijf: één controle
df -h
df -i
Twee commando’s, omdat ruimte en bestandsregistraties onafhankelijk van elkaar opraken. Op de meeste servers raakt de tweede het plafond eerder — miljoenen kleine bestanden in PHP-sessies of een applicatiecache geven een IUse% van 100 terwijl er nog gigabytes vrij zijn. Over beide gevallen hebben we een apart stuk.
Wat er aan deze lijst mankeert
De lijst klopt, maar heeft één eigenschap: er moet iemand aan denken. Een kwartier per week is weinig, zolang er één server is en zolang er aanleiding is. Na twee rustige maanden wordt de ronde overgeslagen, en dat de jail is gestopt verneemt men uit andermans logs.
Daarom hebben we precies deze twaalf controles in een apart, gratis paneel gezet — Arcivéo FREE. Het wordt met één commando geïnstalleerd, draait op uw eigen server, stuurt ons niets en vraagt geen registratie. Een verzamelaar loopt elke vijf minuten via cron en schrijft hetzelfde naar een lokale database: SSH-aanmeldingen en geweigerde verbindingen, de staat van UFW en fail2ban, openstaande beveiligingsupdates, termijnen van certificaten, schijfruimte. De geschiedenis beslaat zeven dagen, de interface bestaat in 34 talen. De prijs is nul, ook op een zakelijke server: de licentie staat installatie op eigen machines toe, bedrijfsmachines inbegrepen, en staat doorverkoop of exploitatie als dienst voor andermans servers niet toe.
De stack van de gratis editie is bescheiden: hij installeert en activeert UFW en fail2ban en toont vanaf dat punt de staat. ModSecurity, Suricata, AIDE en de overige modules zitten er niet in, die horen bij de betaalde. Maar om de wekelijkse ronde niet meer in het hoofd te hoeven houden is hij genoeg. Hoe dezelfde gegevens er op het volledige paneel uitzien, tonen de demopagina's hieronder.