Ein Server wird einmal eingerichtet und lebt danach von selbst weiter. Einen Monat später warten einige Pakete auf ein Upgrade, das Zertifikat ist bis auf drei Wochen an sein Ablaufdatum herangerückt, nach der Installation von etwas Fremdem steht eine zusätzliche Zeile in der SSH-Konfiguration, und das Jail, das die Anmeldungen beobachten soll, ist stehen geblieben, ohne dass es jemand bemerkt hätte. Nichts davon schreit. Es hört alles nur still auf, wahr zu sein.

Im Folgenden zwölf Dinge, die sich regelmäßig zu prüfen lohnen, mit den Befehlen. Der Durchgang dauert etwa fünfzehn Minuten. Die Reihenfolge läuft von dem, worüber man hereinkommt, zu dem, was von selbst kaputtgeht.

SSH: fünf Zeilen

Anzusehen ist nicht die Datei, sondern die wirksame Konfiguration: Sie setzt sich aus /etc/ssh/sshd_config, dem gesamten Verzeichnis sshd_config.d und den Vorgaben des Builds zusammen.

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

Sehen wollen wir: permitrootlogin no, passwordauthentication no, permitemptypasswords no, maxauthtries bei 3–4 und x11forwarding no. Die ersten drei sind die Tür, die letzten beiden ihre Scharniere — eine Obergrenze für Versuche pro Verbindung und eine Grafikweiterleitung, für die ein Server keine Verwendung hat.

Zwei Vorbehalte, beides leichte Wege, sich auszusperren. Erstens: Schalten Sie Passwortanmeldung und root-Anmeldung nicht ab, bevor Sie geprüft haben, dass Ihr Schlüssel funktioniert — in einer separaten Sitzung, ohne die laufende zu schließen. Wenn Sie gerade selbst als root mit Passwort angemeldet sind, sperren genau diese beiden Zeilen Sie aus.

Zweitens die Reihenfolge der Dateien. OpenSSH nimmt den ersten Wert, der ihm für einen Parameter begegnet, und die Dateien in sshd_config.d werden alphabetisch gelesen. Cloud-Abbilder legen dort meist eine 50-cloud-init.conf ab, und die überstimmt Ihre eigene Datei, wenn diese etwa 90-hardening.conf heißt. Eigene Einstellungen gehören unter eine kleinere Nummer — 00- oder 10-. Und das Ergebnis prüft man mit sshd -T, nicht durch Lesen der Datei.

Firewall: eine Prüfung

sudo ufw status verbose

Dabei ist zu bedenken, dass diese Ausgabe Absichten zeigt und nicht Ergebnisse. Eine Regel kann in der Liste stehen und nichts schließen: UFW selbst ist deaktiviert, der Port wird von etwas bedient, das Docker veröffentlicht hat (es schreibt eigene Regeln unterhalb von UFW in iptables), oder der Verkehr erreicht den Server schlicht auf einem anderen Weg. Es lohnt sich also, die Regelliste mit dem abzugleichen, was tatsächlich nach außen lauscht:

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

fail2ban: zwei Prüfungen

Es genügt nicht, dass der Dienst läuft — es braucht auch ein funktionierendes Jail für SSH:

sudo fail2ban-client status
sudo fail2ban-client status sshd

Das häufigste Ärgernis hier ist ein stummes Jail. Auf Debian 12 und neueren Ubuntu-Versionen kann es /var/log/auth.log gar nicht geben: rsyslog ist nicht installiert, die Einträge leben nur im journald. Ein Jail mit dem Standard-logpath startet dann, meldet sich als aktiv und sperrt niemals jemanden. Abhilfe schafft die Umstellung auf das systemd-Journal:

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

Das Anzeichen, an dem man das ohne Wühlen in Konfigurationen erkennt: In fail2ban-client status sshd stehen „Currently failed“ und „Total failed“ auf null, während im Journal eindeutig fehlgeschlagene Anmeldungen stehen.

Updates: drei Prüfungen

Getrennt: wie viele Pakete überhaupt warten, wie viele davon sicherheitsrelevant sind und ob das System nach einem Kernel-Upgrade um einen Neustart bittet.

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

Die dritte Prüfung ist, ob automatische Sicherheitsupdates eingeschaltet sind, damit die ersten beiden nicht zum monatlichen Ritual werden:

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

In dieser Datei sollte in beiden Zeilen eine 1 stehen. Fehlt das Paket: sudo apt install unattended-upgrades && sudo dpkg-reconfigure -plow unattended-upgrades.

Zertifikate: eine Prüfung

Ein Let's-Encrypt-Zertifikat lebt neunzig Tage, und die Erneuerung läuft gewöhnlich von selbst — genau bis zu dem Tag, an dem sie es nicht mehr tut. Anzusehen ist nicht das Panel des Registrars, sondern das, was der Server tatsächlich ausliefert:

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

Der erste Befehl nennt das Ablaufdatum des Zertifikats, das für diesen Namen ausgeliefert wird; der zweite prüft, dass die Erneuerung durchgeht, ohne die echte Frist abzuwarten. Es lohnt sich, alle Namen durchzugehen, die der Server bedient, nicht nur die Hauptdomain: Vergessen wird regelmäßig die später hinzugefügte Subdomain.

Festplatte: eine Prüfung

df -h
df -i

Zwei Befehle, denn Platz und Dateieinträge gehen unabhängig voneinander zur Neige. Auf den meisten Servern stößt der zweite zuerst an die Decke — Millionen kleiner Dateien in PHP-Sitzungen oder im Anwendungscache ergeben IUse% von 100 bei noch freien Gigabyte. Zu beiden Fällen haben wir einen eigenen Beitrag.

Was an dieser Liste nicht stimmt

Die Liste ist richtig, hat aber eine Eigenschaft: Sie verlangt, dass jemand an sie denkt. Fünfzehn Minuten pro Woche sind wenig, solange es nur einen Server gibt und solange es einen Anlass gibt. Nach zwei ruhigen Monaten fällt der Durchgang aus, und dass das Jail stehen geblieben ist, erfährt man aus fremden Logs.

Deshalb haben wir genau diese zwölf Prüfungen in eine eigene, kostenlose Oberfläche gepackt — Arcivéo FREE. Sie wird mit einem Befehl installiert, läuft auf Ihrem eigenen Server, sendet nichts an uns und braucht keine Registrierung. Ein Sammler läuft alle fünf Minuten per Cron und schreibt dasselbe in eine lokale Datenbank: SSH-Anmeldungen und abgewiesene Verbindungen, den Zustand von UFW und fail2ban, ausstehende Sicherheitsupdates, Fristen der Zertifikate, Speicherplatz. Die Historie umfasst sieben Tage, die Oberfläche gibt es in 34 Sprachen. Der Preis ist null, auch auf einem Arbeitsserver: Die Lizenz erlaubt die Installation auf eigenen Maschinen, Firmenmaschinen eingeschlossen, und erlaubt nicht den Weiterverkauf oder den Betrieb als Dienst für fremde Server.

Der Stack der kostenlosen Ausgabe ist bescheiden: Sie installiert und aktiviert UFW und fail2ban und zeigt von da an den Zustand. ModSecurity, Suricata, AIDE und die übrigen Module sind nicht dabei, die gehören zur kostenpflichtigen. Aber um den wöchentlichen Durchgang nicht mehr im Kopf behalten zu müssen, reicht sie. Wie dieselben Daten auf der vollen Oberfläche aussehen, zeigen die Demo-Seiten unten.