Debian-Server: Grundabsicherung nach der Installation

Debian-Server: Grundabsicherung nach der Installation

Ein frisch installierter Debian-Server wird grundlegend abgesichert – mit Benutzerzugang, SSH-Härtung, Firewall, Fail2Ban und automatischen Sicherheitsupdates.

Ausgangslage: Frisch bereitgestellter Server (Root-Zugang, Provider-Standardinstallation)

Ziel: Solide Grundkonfiguration fuer den späteren Betrieb - Zugang absichern, System aktuell halten, Basisschutz aktivieren

Getestet: Debian 13 (trixie) (2026-08-08)

Alle Beispiele mit fiktiven Daten: Server beispielserver.example.com, User anna, Mail-Relay mailrelay.example.com.

Ausgangslage

Root-Login per SSH, Passwort-Auth, Standard-Port 22 - so kommt ein Server frisch vom Provider. Bevor irgendein Dienst draufkommt, sichern wir den Zugang ab und bringen das System auf einen sauberen Stand.

1. Benutzer anlegen und SSH-Key hinterlegen

Root bleibt fuer den taeglichen Zugriff tabu. Erst einen Admin-User anlegen:

adduser anna
usermod -aG sudo anna
mkdir -p /home/anna/.ssh
chown -R anna:anna /home/anna/.ssh
chmod 700 /home/anna/.ssh

Auf dem eigenen Rechner einen dedizierten Key pro Server erzeugen (kein Passphrase-Zwang, aber empfohlen):

ssh-keygen -t ed25519 -f ~/.ssh/id_ed25519_beispielserver -C "anna@beispielserver"

Public Key auf dem Server eintragen:

echo "ssh-ed25519 AAAA... anna@beispielserver" >> /home/anna/.ssh/authorized_keys
chmod 600 /home/anna/.ssh/authorized_keys

Login testen (root-Session dabei offen lassen!):

ssh -i ~/.ssh/id_ed25519_beispielserver anna@beispielserver.example.com
sudo whoami

Kommt root zurueck, ist sudo eingerichtet.

2. SSH absichern

Config sichern, dann anpassen:

cp /etc/ssh/sshd_config /etc/ssh/sshd_config.bak

In /etc/ssh/sshd_config setzen:

Port 4022
PermitRootLogin no
PasswordAuthentication no
PubkeyAuthentication yes

Vor dem Neustart immer testen:

sshd -t
systemctl restart ssh
⚠️ Wichtig

Die alte root-Session nicht schliessen, bis der Login auf dem neuen Port in einem zweiten Fenster bestaetigt ist:

ssh -p 4022 anna@beispielserver.example.com

Erst wenn das klappt, die alte Session beenden.

3. System aktualisieren

apt update
apt list --upgradable
apt full-upgrade -y

Ist ein neuer Kernel dabei, folgt ein Reboot. Vorher pruefen, ob ein Rescue-Zugang beim Provider verfuegbar ist (Absicherung falls nach dem Reboot etwas klemmt).

reboot

Nach dem Neustart erneut per SSH verbinden und pruefen:

uname -r

4. Firewall einrichten

apt install -y ufw
ufw default deny incoming
ufw default allow outgoing
ufw allow 4022/tcp comment 'SSH'
ufw show added

Regeln pruefen, bevor scharf geschaltet wird. Dann:

ufw enable

Sofort in einem zweiten Fenster (bestehende Session offen lassen!) den Login erneut testen.

ℹ️ Info
Debian 13: ufw status kann “active” melden, waehrend systemctl status ufw “inactive (dead)” zeigt - das ist normal, die Regeln laufen direkt im Kernel. Fuer Monitoring-Skripte den ufw status-Text pruefen, nicht den systemd-Status.

5. Fail2Ban einrichten

apt install -y fail2ban

Eigene Config-Datei anlegen, nie die Default-Datei direkt bearbeiten:

tee /etc/fail2ban/jail.local << 'EOF'
[DEFAULT]
bantime  = 1h
findtime = 10m
maxretry = 5

[sshd]
enabled = true
port    = 4022
EOF

systemctl restart fail2ban
fail2ban-client status sshd

6. Mail-Relay konfigurieren

Fuer System-Mails (Cronjobs, Health-Checks) reicht ein einfacher Relay-Client, kein voller Mailserver. Beispiel mit OpenSMTPD, Relay ueber einen bestehenden Mailserver:

apt install -y opensmtpd

Zugangsdaten hinterlegen:

tee /etc/secrets << 'EOF'
relaylabel anna@mailrelay.example.com:DEIN_PASSWORT
EOF
chmod 600 /etc/secrets

Config unter /etc/smtpd.conf (Debian-Pfad, nicht /etc/mail/):

tee /etc/smtpd.conf << 'EOF'
table aliases file:/etc/aliases
table secrets file:/etc/secrets
table localdomains { "beispielserver.example.com", "beispielserver", "localhost" }

listen on localhost

action "local" maildir alias <aliases>
action "outbound" relay host smtp+tls://relaylabel@mailrelay.example.com:587 auth <secrets> mail-from beispielserver@example.com

match for domain <localdomains> action "local"
match from local for any action "outbound"
EOF

smtpd -n
systemctl restart opensmtpd
🪨 Stolperstein

Steht root in der localdomains-Tabelle, versucht das System, lokal an den Systemuser root zuzustellen - das scheitert unter Debian mit permission denied. Loesung: In /etc/aliases root auf eine externe Adresse umleiten:

tee -a /etc/aliases << 'EOF'
root: admin-beispielserver@example.com
EOF
systemctl restart opensmtpd

Zum Testen wird ein mail-Kommando benoetigt, das ist bei Debian nicht vorinstalliert:

apt install -y mailutils

Bei der Installation kann ein Debconf-Dialog zur Mailserver-Konfiguration erscheinen - dort “Keine Konfiguration” waehlen, da OpenSMTPD separat als Relay laeuft.

Testen:

echo "Testmail" | mail -s "Testbetreff" root
journalctl -u opensmtpd -n 15 --no-pager
ℹ️ Info
systemctl reload opensmtpd schlaegt bei diesem Unit fehl (“Job type reload is not applicable”) - nach Config-Aenderungen systemctl restart opensmtpd verwenden.

7. Health-Check einrichten

Ein taegliches Script, das Diskspace, Firewall- und Fail2Ban-Status sowie verfuegbare Updates prueft und per Mail meldet - Grundgeruest, je nach Server um weitere Kennzahlen (Speicher, Load, Dienste) erweiterbar:

tee /usr/local/bin/beispielserver-health.sh << 'SCRIPT'
#!/bin/bash
HOSTNAME=$(hostname)
DATE=$(date '+%Y-%m-%d %H:%M:%S')
STATUS="OK"

DISK=$(df -h / | awk 'NR==2 {print $5}')
UFW=$(ufw status | grep -q "Status: active" && echo active || echo inactive)
FAIL2BAN=$(systemctl is-active fail2ban)
UPDATES=$(apt list --upgradable 2>/dev/null | grep -c upgradable)

[[ "$UFW" != "active" ]] && STATUS="WARN"
[[ "$FAIL2BAN" != "active" ]] && STATUS="WARN"
[[ "$UPDATES" -gt 0 ]] && STATUS="WARN"

REPORT="$HOSTNAME Health Check - $DATE
Disk: $DISK
UFW: $UFW
Fail2Ban: $FAIL2BAN
Updates verfuegbar: $UPDATES
"

echo "$REPORT" | mail -s "[$STATUS] $HOSTNAME Health Check" root
SCRIPT
chmod +x /usr/local/bin/beispielserver-health.sh

Als Cronjob taeglich um 06:00:

echo "0 6 * * * root /usr/local/bin/beispielserver-health.sh" | tee /etc/cron.d/beispielserver-health
🪨 Stolperstein

Debian 13 bringt cron nicht in der Minimalinstallation mit. Ein angelegter Cronjob unter /etc/cron.d/ liegt dann zwar bereit, wird aber nie ausgefuehrt - ohne Fehlermeldung. Vor dem ersten produktiven Cronjob pruefen:

which cron
systemctl status cron --no-pager

Fehlt der Dienst, nachinstallieren und aktivieren:

apt install -y cron
systemctl enable --now cron

Danach greift der Cronjob wie erwartet.

8. Firewall beim Provider zusaetzlich aktivieren

Neben der Server-Firewall (ufw) bieten viele Provider eine vorgelagerte Netzwerk-Firewall im Kundenpanel an. Sinnvoll als zusaetzliche Ebene (“Defense in Depth”): Traffic wird schon vor dem Server gefiltert, entlastet also Netzwerk-Interface und Kernel - und dient als Rueckfallebene, falls ufw mal aus Versehen falsch konfiguriert oder deaktiviert wird.

Vorgehen im Kundenpanel (Beispiel mit einem typischen Anbieter-Interface, “Experte”-Modus):

  1. Alle mitgelieferten Standardregeln deaktivieren, die nicht gebraucht werden (Plesk, POP3/IMAP, SMTP, HTTP/HTTPS, FTP, MySQL - auf einem frischen Server laeuft davon meist nichts extern).
  2. Eigene Regel anlegen: Beschreibung SSH beispielserver, Zielport 4022, Protokoll TCP.
  3. Vor dem Speichern pruefen: Quellport bleibt auf dem vollen Client-Bereich (z.B. 1024:65535) - das ist der Port, von dem der eigene Rechner aus verbindet, nicht der Serverport. Nur der Zielport wird auf 4022 eingeschraenkt.
  4. Aenderung speichern, danach sofort in einem zweiten Fenster (laufende Session offen lassen!) den Login testen:
ssh -p 4022 anna@beispielserver.example.com

Erst wenn der Login bestaetigt ist, die alte Session schliessen.

🪨 Stolperstein
Provider-Firewalls arbeiten meist vor dem Server im Netzwerk. Ein Fehler hier sperrt den Zugang komplett aus, ufw auf dem Server selbst hilft dann nicht - der Traffic kommt gar nicht erst an. Deshalb immer zuerst die neue Regel anlegen und testen, bevor die alte deaktiviert wird.

Ergebnis

Server-Zugang abgesichert (Key-only, kein Root-Login, eigener Port), System aktuell, Firewall doppelt abgesichert (ufw + Provider-Firewall) und Fail2Ban aktiv, Mail-Relay funktionsfaehig, taeglicher Health-Check eingerichtet. Basis fuer den weiteren Ausbau steht.

Michael von den Drachen

entwickelt Bücher, Software und offene Regelwerke rund um technische Systeme, digitale Unabhängigkeit und langlebige Softwarearchitekturen.
Mehr über Michael →

Offenes Wissen braucht Menschen

Wir entwickeln Ideen, teilen Wissen, und lassen Open-Sorce-Software und -Werkzeuge entstehen. Mit deiner Unterstützung hilfst du uns, diese Arbeit langfristig fortzuführen.
Mitwirken und unterstützen →
Debian-Server: Grundabsicherung nach der Installation
Vorheriger Artikel → OpenBSD: Pending Patches im täglichen Health-Check