// Tutorial · Debian · Härtung

Debian 13 (Trixie): Härtung & Wartung (Teil 2)

📅 06.09.2026 ⏱12 Min. Lesezeit ✍️ Redaktion

Teil 1 hat die Basis gelegt: Debian 13 sauber installiert, erster Benutzer, SSH-Zugang. Teil 2 macht aus dem frischen System einen gehärteten Server: SSH weiter absichern, Firewall aktivieren, Sicherheitsupdates automatisieren und eine Wartungsroutine etablieren, die ohne tägliche Handarbeit auskommt. Teil 3 folgt in den nächsten Tagen mit Monitoring und tieferer Absicherung.

Warum Härtung & Wartung?

Ein frisch installierter Server ist wie eine leere Wohnung mit offener Tür: Er funktioniert, aber jede offene Tür ist eine Einladung. Härtung bedeutet, nur die Türen zu öffnen, die wirklich gebraucht werden – und Wartung sorgt dafür, dass die Schlösser aktuell bleiben, ohne dass du täglich dran denken musst.

Serien-Kontext: Teil 1 hat Installation, Benutzer, SSH-Grundzugang und erste Tipps abgedeckt – dieser Artikel setzt direkt darauf auf. Alle Befehle laufen mit einem sudo-Benutzer, nicht als Root.
  • Minimalprinzip: Jeder installierte Dienst und jede offene Verbindung ist potenzielle Angriffsfläche.
  • Automatisierung: Sicherheitsupdates gehören zu den wenigen Dingen, die ein Server zuverlässig allein erledigen sollte.
  • Wiederholbarkeit: Eine dokumentierte Routine macht aus „hoffentlich gepflegt“ ein nachvollziehbares Setup.

Konzept: Weniger Angriffsfläche, weniger Arbeit

Teil 2 folgt einem einfachen Dreiklang, der auch für Teil 3 die Grundlage bildet:

  1. Angriffsfläche verkleinern – SSH-Richtlinien verschärfen, nur benötigte Dienste und Ports zulassen (Firewall).
  2. Sicherheitsupdates automatisierenunattended-upgrades installiert Sicherheitsupdates selbstständig und protokolliert alles.
  3. Wartung routinieren – feste, kurze Checks: Updates, Logs, Dienste, Plattenplatz. Das kostet einmal pro Woche fünf Minuten.
Wichtig: Härtung ohne Wartung ist falsche Sicherheit. Ein System, das nie aktualisiert wird, ist mit Firewall nicht sicherer – nur anders kaputt.

SSH weiter härten

Teil 1 hat PermitRootLogin no und Schlüssel-Login eingerichtet. Jetzt kommen Beschränkungen dazu, die den Alltag kaum stören, aber Brute-Force-Versuche deutlich unattraktiver machen.

99-hardening.conf vervollständigen

Lege die Datei /etc/ssh/sshd_config.d/99-hardening.conf an (ersetzt Einträge aus Teil 1):

# /etc/ssh/sshd_config.d/99-hardening.conf
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
AllowUsers lena            # nur diese Benutzer dürfen sich einloggen
MaxAuthTries 3
LoginGraceTime 30
ClientAliveInterval 300
ClientAliveCountMax 2

Anschließend die Syntax prüfen und neu laden:

# Syntax prüfen (wenn alles okay ist, erfolgt keine Ausgabe)
sudo sshd -t

# Konfiguration sanft neu laden
sudo systemctl reload ssh
⚠️ Lebenswichtige Regel: Lass deine aktuelle Terminal-Sitzung unbedingt offen! Öffne ein komplett neues, separates Terminal-Fenster und versuche dich neu einzuloggen (ssh lena@server-ip). Wenn du dich bei AllowUsers vertippt hast, kommst du im neuen Fenster nicht rein – kannst den Fehler aber im noch offenen, alten Fenster sofort korrigieren. Hättest du restart genutzt, wärst du sofort ausgesperrt.

Wer mag, kann zusätzlich den Standard-Port ändern (in derselben Datei: Port 2222). Das ist keine echte Sicherheit, reduziert aber das Log-Rauschen enorm – und muss dann in der Firewall berücksichtigt werden.

Firewall mit UFW (nftables)

Debian 13 nutzt standardmäßig nftables; UFW ist nur ein bequemer Regelschreiber darüber und auf Servern der einfachste Einstieg.

sudo apt install ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw enable
sudo ufw status verbose

Reihenfolge ist entscheidend: Erst SSH erlauben, dann erst ufw enable – sonst schneidest du dir die eigene Verbindung ab. Nach dem Aktivieren kurz prüfen:

sudo nft list ruleset | head -n 30   # UFW-Regeln landen als nftables-Kette
Server-Dienste: Für jeden Dienst später einzeln öffnen – z. B. sudo ufw allow 80,443/tcp comment 'Web'.
🛑 Achtung bei Docker-Nutzung: Docker besitzt eine eigene iptables/nftables-Logik. Wenn du später Container startest und Ports freigibst (z. B. -p 80:80), hebelt Docker die UFW-Firewall standardmäßig komplett aus! Der Port ist dann trotz ufw default deny incoming weltweit offen. Wie man dieses Sicherheitsrisiko elegant löst, schauen wir uns im kommenden Teil 5 (Container-Härtung) an.

Automatische Updates (unattended-upgrades)

Der wichtigste Teil der Wartung läuft ohne dich: Sicherheitsupdates automatisch installieren. Debian bringt dafür unattended-upgrades mit – im Installer von Teil 1 konnte es bereits aktiviert werden; hier richten wir es gezielt ein.

Installation & Aktivierung

sudo apt update
sudo apt install unattended-upgrades apt-listchanges
sudo dpkg-reconfigure unattended-upgrades   # „Automatische Installation von Sicherheitsupdates?“ → Ja

Die Datei /etc/apt/apt.conf.d/20auto-upgrades sollte danach so aussehen:

APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
APT::Periodic::AutocleanInterval "7";

Reboot-Politik

Nach Kernel- oder Library-Updates ist meist ein Neustart nötig. In /etc/apt/apt.conf.d/50unattended-upgrades kann Debian automatisch neu starten – sinnvoll bei Servern mit Wartungsfenster:

Unattended-Upgrade::Automatic-Reboot "true";
Unattended-Upgrade::Automatic-Reboot-Time "02:00";
Vorsicht beim Reboot: Automatische Neustarts mitten im Betrieb können Dienste unterbrechen – das kennt man von Watchtower & Co. Wer das nicht will, lässt Automatic-Reboot auf "false" und startet nach Kontrolle selbst neu (siehe Wartungsroutine).

Testen & Logs

sudo unattended-upgrades --dry-run --debug   # Probelauf
tail -n 30 /var/log/unattended-upgrades/unattended-upgrades.log
systemctl list-timers apt-daily*

Standardmäßig werden nur Pakete aus stable-security automatisch installiert – das ist die richtige Voreinstellung für Server. Zusätzliche Quellen (z. B. Backports) erst nach bewusster Freigabe in der 50er-Datei eintragen.

Wartungsroutine

Einmal pro Woche fünf Minuten – mehr braucht ein Debian-Server mit automatischen Sicherheitsupdates nicht:

sudo apt update && sudo apt full-upgrade   # restliche Updates
sudo apt autoremove --purge
sudo systemctl --failed                    # fehlgeschlagene Dienste?
df -h                                      # Plattenplatz
journalctl -p err -b                       # Fehler seit Boot

Nach Kernel-Updates wird ein Neustart nötig – Debian legt dafür eine Markierung an:

ls /var/run/reboot-required && echo 'Neustart nötig'
Journal-Größe begrenzen: journalctl --vacuum-size=100M räumt das Systemlog auf – oder dauerhaft über SystemMaxUse=100M in /etc/systemd/journald.conf.

Wartung heißt auch: wissen, was läuft. Ein kurzer Blick auf offene Ports und aktive Dienste gehört dazu:

ss -tulpn
systemctl list-units --type=service --state=running

AppArmor & System-Dienste

Debian aktiviert AppArmor bereits standardmäßig für viele Pakete. Ein kurzer Check zeigt, ob die Profile laden:

sudo aa-status | head -n 20
  • Enforce vs. Complain: Enforce blockiert, Complain protokolliert nur – für eigene Profile erst im Complain-Modus testen.
  • Nur Dienste installieren, die gebraucht werden: apt autoremove nimmt nicht genutzte Pakete mit raus.
  • Dienste an den Bedarf binden: z. B. SSH nur lokal, Web-Dienste später hinter dem Reverse Proxy.
Teil-3-Vorgeschmack: In Teil 3 vertiefen wir AppArmor-Profile, Kernel-Parameter (sysctl), Monitoring und Fail2ban/sshguard – dieser Artikel bleibt bewusst bei der soliden Grundlage.

Quick-Check-Liste

Damit nichts vergessen wird – die komplette Teil-2-Routine auf einen Blick:

  1. SSH: AllowUsers gesetzt, PermitRootLogin no, Passwort-Login aus, sudo sshd -t grün?
  2. Firewall: UFW aktiv, Default deny incoming, nur 22 (und später nötige Dienste) offen?
  3. Updates: unattended-upgrades installiert, Sicherheitsquellen aktiv, Reboot-Politik entschieden?
  4. Routine: Wöchentlicher full-upgrade + journalctl -p err-Check eingeplant?
  5. Backup: Grund-Backup des Systems einplanen – Teil 3 nimmt das Konzept auf.

Häufige Probleme

ProblemLösung
Nach ufw enable keine SSH-Verbindung mehrVorher ufw allow 22/tcp ausgeführt? Falls nicht: per Konsole (VNC/IPMI) verbinden und ufw allow 22/tcp nachholen.
AllowUsers sperrt mich ausZweite SSH-Verbindung offen halten; sshd -t prüft nur die Syntax, nicht deine Benutzerliste.
unattended-upgrades läuft nichtsystemctl list-timers apt-daily* prüfen, Log unter /var/log/unattended-upgrades/, Probelauf mit --dry-run --debug.
„dpkg was interrupted“ bei aptLaufenden unattended-upgrade-Prozess abwarten oder sudo dpkg --configure -a ausführen.
Journal frisst Plattejournalctl --vacuum-size=100M bzw. SystemMaxUse in journald.conf setzen.
Kernel-Update ohne Neustartls /var/run/reboot-required zeigt, ob ein Neustart ansteht – im Wartungsfenster durchführen.

Fazit & Ausblick Teil 3

Mit SSH-Härtung, aktiver Firewall und automatischen Sicherheitsupdates ist der Server aus Teil 1 jetzt ein System, das im Alltag wenig Aufmerksamkeit braucht – aber im Ernstfall aktuell und dicht ist. Die wöchentliche Fünf-Minuten-Routine fängt den Rest ab.

Die 4 Merksätze aus Teil 2: ① Weniger offene Dienste = weniger Angriffsfläche.
② Firewall erst öffnen, dann aktivieren – sonst bist du draußen.
③ Sicherheitsupdates automatisch, Rest-Updates wöchentlich.
④ Jede Härtung gehört dokumentiert, sonst hilft sie niemandem.

Teil 3 (in den nächsten Tagen) vertieft: Fail2ban/sshguard, Kernel-Parameter, AppArmor-Profile für eigene Dienste, Monitoring mit Alarmierung und die Backup-Strategie. Bis dahin gilt: regelmäßig full-upgrade, Logs im Blick – und weiter viel Spaß mit Debian.

📝
....

Wir betreiben unsere komplette Infrastruktur selbst auf Open-Source-Software und schreiben nur über Tools, die wir im Alltag wirklich einsetzen. Fragen zum Artikel? Schreib uns.