Einleitung — Warum Server-Sicherheit kein optionales Extra ist

Du hast dir gerade einen frischen Debian 13 (Trixie) Server aufgesetzt — Glückwunsch! Aber bevor du irgendetwas darauf installierst, gibt es eine Sache, die du zuerst erledigen solltest: deinen Server absichern.

Ein ungesicherter Server im Internet ist wie eine offene Haustür in einer belebten Straße. Innerhalb von Minuten nach dem ersten Boot scannen automatisierte Bots deine IP-Adresse und versuchen, sich per SSH einzuloggen — mit Standard-Benutzernamen wie root, admin oder test. Das ist kein Horrorszenario, das ist Alltag.

In diesem Guide lernst du Schritt für Schritt, wie du:

  • Dein System aktuell hältst und automatische Updates einrichtest
  • Einen sicheren Benutzer anlegst und den Root-Login deaktivierst
  • SSH richtig absicherst (Schlüssel statt Passwörter, Port ändern)
  • Eine Firewall mit UFW konfigurierst
  • Fail2ban gegen Brute-Force-Angriffe einsetzt
  • Optional: Zwei-Faktor-Authentifizierung für SSH einrichtest

Jeder Befehl wird erklärt — nicht nur was du tippst, sondern warum. So verstehst du, was auf deinem Server passiert, und kannst bei Problemen selbst reagieren.

⏱️ Zeitaufwand: ca. 30–45 Minuten

Voraussetzungen

Bevor wir loslegen, stelle sicher, dass du Folgendes hast:

  • Einen frisch installierten Debian 13 (Trixie) Server — bei einem Hoster wie Hetzner, Netcup, DigitalOcean oder als lokale VM
  • Root-Zugang per SSH — du kannst dich als root per Terminal verbinden
  • Einen SSH-Client — unter Linux/macOS ist das Terminal eingebaut, unter Windows nutze PuTTY oder das Windows Terminal mit OpenSSH
  • Grundlegende Terminal-Kenntnisse — du weißt, wie man Befehle eingibt und mit nano oder vim Dateien bearbeitet

Verbinde dich jetzt mit deinem Server:

ssh root@DEINE_SERVER_IP

Bereit? Dann los!

Schritt 1: System aktualisieren

Das Allererste auf jedem neuen Server: alle Pakete auf den neuesten Stand bringen. Dein Hoster liefert das System-Image möglicherweise nicht tagesaktuell aus, und veraltete Pakete können bekannte Sicherheitslücken enthalten.

apt update && apt upgrade -y

Was passiert hier?

  • apt update — Aktualisiert die Paketlisten. Dein Server erfährt, welche neuen Versionen verfügbar sind.
  • apt upgrade -y — Installiert alle verfügbaren Updates. Das -y bestätigt automatisch.
  • && — Führt den zweiten Befehl nur aus, wenn der erste erfolgreich war.

Falls der Kernel aktualisiert wurde, starte den Server neu:

reboot

Warte etwa 30 Sekunden und verbinde dich erneut per SSH.

Unattended-Upgrades installieren

Damit dein Server auch in Zukunft automatisch Sicherheitsupdates erhält, richten wir unattended-upgrades gleich mit ein. Die Details konfigurieren wir in Schritt 6.

apt install -y unattended-upgrades apt-listchanges

apt-listchanges informiert dich optional per Mail über Änderungen in aktualisierten Paketen — nützlich, um den Überblick zu behalten.

Schritt 2: Neuen Benutzer anlegen & Root-Login deaktivieren

Direkt als root zu arbeiten ist gefährlich. Ein Tippfehler, und du löschst versehentlich das halbe System. Außerdem ist root der erste Benutzername, den Angreifer ausprobieren. Wir legen deshalb einen normalen Benutzer mit sudo-Rechten an.

Benutzer erstellen

adduser deinname

Ersetze deinname durch deinen gewünschten Benutzernamen. Du wirst nach einem Passwort und optionalen Infos (Name, Telefon etc.) gefragt — die optionalen Felder kannst du mit Enter überspringen.

⚠️ Wichtig: Wähle ein starkes Passwort! Mindestens 12 Zeichen, Groß-/Kleinbuchstaben, Zahlen und Sonderzeichen.

Sudo-Rechte vergeben

usermod -aG sudo deinname

Was passiert hier?

  • usermod — Ändert einen bestehenden Benutzer
  • -aG sudo — Fügt den Benutzer zur Gruppe sudo hinzu (-a = append, ohne bestehende Gruppen zu entfernen)

Ab jetzt kann deinname mit sudo vor einem Befehl Admin-Aktionen ausführen — aber nur bewusst und mit Passwortabfrage.

Testen — bevor du dich aussperrst!

⚠️ Schließe deine aktuelle SSH-Sitzung NICHT! Öffne ein neues Terminal-Fenster und teste den Login:

ssh deinname@DEINE_SERVER_IP

Dann teste sudo:

sudo whoami

Die Ausgabe sollte root sein. Funktioniert? Perfekt. Erst dann machen wir weiter.

Schritt 3: SSH absichern

SSH ist das Tor zu deinem Server. Standardmäßig lauscht es auf Port 22, akzeptiert Passwort-Logins und erlaubt Root-Zugang — alles Dinge, die wir jetzt ändern.

SSH-Schlüssel erstellen (auf deinem lokalen PC)

Falls du noch kein SSH-Schlüsselpaar hast, erstelle eines auf deinem lokalen Computer (nicht auf dem Server!):

ssh-keygen -t ed25519 -C "dein@email.de"

Warum ed25519? Es ist der modernste und sicherste Algorithmus für SSH-Schlüssel — schneller und mit kürzeren Schlüsseln als RSA, bei gleicher oder besserer Sicherheit.

Bestätige den Standard-Speicherort mit Enter und vergib optional eine Passphrase (empfohlen!).

Öffentlichen Schlüssel auf den Server kopieren

ssh-copy-id deinname@DEINE_SERVER_IP

Dieser Befehl kopiert deinen öffentlichen Schlüssel in die Datei ~/.ssh/authorized_keys auf dem Server. Ab jetzt kannst du dich ohne Passwort einloggen — der Server erkennt deinen Schlüssel.

Teste es: Öffne eine neue SSH-Sitzung. Du solltest ohne Passwortabfrage (bzw. nur mit Schlüssel-Passphrase) reinkommen.

SSH-Konfiguration anpassen

Jetzt bearbeiten wir die SSH-Server-Konfiguration. Mach vorher ein Backup:

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

Dann öffne die Konfiguration:

sudo nano /etc/ssh/sshd_config

Suche und ändere folgende Zeilen (oder füge sie hinzu, falls sie nicht existieren):

# SSH-Port ändern (Standard: 22)
Port 2222

# Root-Login komplett verbieten
PermitRootLogin no

# Nur Schlüssel-Authentifizierung erlauben
PasswordAuthentication no
PubkeyAuthentication yes

# Leere Passwörter verbieten (Sicherheitsnetz)
PermitEmptyPasswords no

# Maximale Anmeldeversuche begrenzen
MaxAuthTries 3

# Nur bestimmte Benutzer erlauben (optional, aber empfohlen)
AllowUsers deinname

Warum den Port ändern? Port 22 ist der Standard. Automatisierte Scanner probieren fast ausschließlich Port 22. Ein anderer Port eliminiert >90% des automatisierten Rauschens in deinen Logs. Das ist kein echter Sicherheitsgewinn gegen gezielte Angriffe, aber es reduziert den Lärm massiv.

⚠️ Merke dir den neuen Port! Wenn du ihn vergisst und die Firewall den alten Port sperrt, bist du ausgesperrt.

Speichere die Datei (Ctrl+O, Enter, Ctrl+X in nano) und prüfe die Konfiguration auf Syntaxfehler:

sudo sshd -t

Keine Ausgabe = kein Fehler. Dann den SSH-Dienst neu starten:

sudo systemctl restart sshd

⚠️ GANZ WICHTIG: Schließe deine aktuelle Sitzung NICHT! Teste den neuen Login in einem separaten Terminal:

ssh -p 2222 deinname@DEINE_SERVER_IP

Funktioniert alles? Erst dann die alte Sitzung schließen.

Schritt 4: Firewall mit UFW einrichten

Eine Firewall kontrolliert, welcher Netzwerkverkehr deinen Server erreichen darf. UFW (Uncomplicated Firewall) ist ein benutzerfreundliches Frontend für iptables — perfekt für den Einstieg.

UFW installieren und konfigurieren

sudo apt install -y ufw

Zuerst setzen wir die Standardregeln:

# Alles eingehende blockieren
sudo ufw default deny incoming

# Alles ausgehende erlauben
sudo ufw default allow outgoing

Warum? Ein Server sollte nur auf explizit erlaubten Ports erreichbar sein. Ausgehender Traffic wird erlaubt, damit dein Server Updates herunterladen und DNS-Anfragen stellen kann.

Benötigte Ports freigeben

# SSH auf dem neuen Port erlauben
sudo ufw allow 2222/tcp comment 'SSH'

# Webserver (falls du einen betreibst oder planst)
sudo ufw allow 80/tcp comment 'HTTP'
sudo ufw allow 443/tcp comment 'HTTPS'

⚠️ Hast du den SSH-Port in Schritt 3 geändert? Dann hier den gleichen Port eintragen! Wenn du hier 22 erlaubst, aber SSH auf 2222 läuft, sperrst du dich aus.

Firewall aktivieren

sudo ufw enable

Du wirst gefragt, ob du fortfahren möchtest — bestätige mit y. Überprüfe den Status:

sudo ufw status verbose

Die Ausgabe sollte in etwa so aussehen:

Status: active
Logging: on (low)
Default: deny (incoming), allow (outgoing), disabled (routed)

To                         Action      From
--                         ------      ----
2222/tcp                   ALLOW IN    Anywhere        # SSH
80/tcp                     ALLOW IN    Anywhere        # HTTP
443/tcp                    ALLOW IN    Anywhere        # HTTPS

IPv6 aktivieren (optional, aber empfohlen)

Stelle sicher, dass UFW auch IPv6-Traffic filtert:

sudo nano /etc/default/ufw

Setze:

IPV6=yes

Dann UFW neu laden:

sudo ufw reload

Schritt 5: Fail2ban installieren & konfigurieren

Fail2ban überwacht Log-Dateien und sperrt IP-Adressen automatisch, die zu viele fehlgeschlagene Login-Versuche haben. Es ist dein automatischer Türsteher gegen Brute-Force-Angriffe.

Installation

sudo apt install -y fail2ban

Konfiguration erstellen

⚠️ Bearbeite niemals /etc/fail2ban/jail.conf direkt — diese Datei wird bei Updates überschrieben. Erstelle stattdessen eine lokale Kopie:

sudo nano /etc/fail2ban/jail.local

Füge folgenden Inhalt ein:

[DEFAULT]
# Sperrzeit: 1 Stunde
bantime = 3600

# Zeitfenster für fehlgeschlagene Versuche: 10 Minuten
findtime = 600

# Nach 3 Fehlversuchen sperren
maxretry = 3

# E-Mail-Benachrichtigung (optional)
# destemail = dein@email.de
# sender = fail2ban@deinserver.de
# action = %(action_mwl)s

enabled = true port = 2222 filter = sshd logpath = /var/log/auth.log maxretry = 3 bantime = 3600

Was bedeuten die Einstellungen?

  • bantime = 3600 — Gesperrte IPs werden für 3600 Sekunden (1 Stunde) blockiert
  • findtime = 600 — Fail2ban schaut sich die letzten 10 Minuten an
  • maxretry = 3 — Nach 3 fehlgeschlagenen Versuchen innerhalb von findtime wird die IP gesperrt
  • port = 2222 — Muss mit deinem SSH-Port übereinstimmen!

E-Mail-Benachrichtigungen einrichten (optional)

Wenn du per E-Mail informiert werden willst, wenn eine IP gesperrt wird, kommentiere die drei Zeilen unter [DEFAULT] ein und installiere einen Mail-Dienst:

sudo apt install -y mailutils

Ändere dann die action-Zeile:

  • %(action_)s — Nur sperren (Standard)
  • %(action_mw)s — Sperren + E-Mail mit Whois-Info
  • %(action_mwl)s — Sperren + E-Mail mit Whois-Info und relevanten Log-Zeilen

Fail2ban starten

sudo systemctl enable fail2ban
sudo systemctl start fail2ban

Status prüfen:

sudo fail2ban-client status sshd

Hier siehst du, wie viele IPs aktuell gesperrt sind und wie viele fehlgeschlagene Versuche erkannt wurden.

Schritt 6: Automatische Sicherheitsupdates konfigurieren

Wir haben unattended-upgrades bereits in Schritt 1 installiert. Jetzt konfigurieren wir es richtig.

sudo nano /etc/apt/apt.conf.d/50unattended-upgrades

Stelle sicher, dass folgende Zeilen aktiv (nicht auskommentiert) sind:

Unattended-Upgrade::Allowed-Origins {
    "${distro_id}:${distro_codename}";
    "${distro_id}:${distro_codename}-security";
    "${distro_id}ESM:${distro_codename}-infra-security";
};

// Automatisch alte Kernel und nicht mehr benötigte Pakete entfernen
Unattended-Upgrade::Remove-Unused-Kernel-Packages "true";
Unattended-Upgrade::Remove-Unused-Dependencies "true";

// Bei Kernel-Updates automatisch neustarten (optional)
// Unattended-Upgrade::Automatic-Reboot "true";
// Unattended-Upgrade::Automatic-Reboot-Time "03:00";

Automatischen Reboot aktivieren? Wenn dein Server keine kritischen Dienste hat, die nicht unterbrochen werden dürfen, ist ein automatischer Reboot um 3 Uhr nachts bei Kernel-Updates sinnvoll. Für Produktionsserver mit strengen Uptime-Anforderungen lieber manuell neustarten.

Jetzt den Timer aktivieren:

sudo nano /etc/apt/apt.conf.d/20auto-upgrades

Inhalt:

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

Was bedeutet das?

  • Täglich Paketlisten aktualisieren
  • Täglich verfügbare Upgrades herunterladen und installieren
  • Wöchentlich den Paket-Cache aufräumen

Teste die Konfiguration:

sudo unattended-upgrades --dry-run --debug

Damit siehst du, was aktualisiert würde, ohne tatsächlich etwas zu ändern.

Schritt 7 (Optional): Zwei-Faktor-Authentifizierung für SSH

Für maximale Sicherheit kannst du SSH mit einem zweiten Faktor absichern — zusätzlich zum SSH-Schlüssel wird ein zeitbasierter Code (TOTP) aus einer Authenticator-App abgefragt.

⚠️ Achtung: Dieser Schritt ist fortgeschritten. Ein Fehler kann dich aussperren. Halte immer eine Backup-Zugangsweg offen (z.B. Konsole beim Hoster).

Google Authenticator PAM-Modul installieren

sudo apt install -y libpam-google-authenticator

Für deinen Benutzer einrichten

Führe als dein normaler Benutzer (nicht root!) aus:

google-authenticator

Beantworte die Fragen wie folgt:

  • Time-based tokens?y
  • Du siehst einen QR-Code — scanne ihn mit deiner Authenticator-App (Google Authenticator, Authy, Aegis, etc.)
  • Update your .google_authenticator file?y
  • Disallow multiple uses?y
  • Increase time window?n
  • Enable rate-limiting?y

⚠️ Notiere dir die Emergency Scratch Codes! Diese sind dein Notfall-Zugang, falls du dein Handy verlierst.

PAM konfigurieren

sudo nano /etc/pam.d/sshd

Füge am Ende hinzu:

auth required pam_google_authenticator.so

SSH für 2FA anpassen

sudo nano /etc/ssh/sshd_config

Ändere oder ergänze:

ChallengeResponseAuthentication yes
AuthenticationMethods publickey,keyboard-interactive

Das bedeutet: Zuerst wird der SSH-Schlüssel geprüft, dann der TOTP-Code abgefragt. Zwei Faktoren.

sudo systemctl restart sshd

Teste in einem neuen Terminal! Du solltest zuerst nach deinem Schlüssel und dann nach dem Verification Code gefragt werden.

Zusammenfassung & Checkliste

Hier ist deine Checkliste — jeder Punkt sollte abgehakt sein, bevor du deinen Server als „abgesichert“ betrachtest:

✅ System vollständig aktualisiert (apt update && apt upgrade)
✅ Neuer Benutzer mit sudo-Rechten angelegt
✅ SSH-Schlüssel generiert und auf Server kopiert
✅ SSH-Port geändert (z.B. auf 2222)
PermitRootLogin no gesetzt
PasswordAuthentication no gesetzt
✅ Firewall (UFW) aktiv mit nur nötigen Ports
✅ Fail2ban läuft und überwacht SSH
✅ Automatische Sicherheitsupdates eingerichtet
✅ Optional: 2FA für SSH aktiviert

Troubleshooting — Wenn etwas schiefgeht

„Ich bin ausgesperrt!“

Keine Panik. Die meisten Hoster bieten eine Web-Konsole (VNC/KVM) an, über die du dich direkt am Server anmelden kannst — unabhängig von SSH und Firewall.

  1. Logge dich in das Kundenpanel deines Hosters ein
  2. Öffne die VNC-/KVM-Konsole für deinen Server
  3. Melde dich mit deinem Benutzer an
  4. Repariere die SSH-Konfiguration oder Firewall-Regeln

SSH-Verbindung wird abgelehnt

Prüfe der Reihe nach:

# Läuft SSH überhaupt?
sudo systemctl status sshd

# Auf welchem Port lauscht SSH?
sudo ss -tlnp | grep ssh

# Ist der Port in der Firewall freigegeben?
sudo ufw status

# Gibt es Syntaxfehler in der SSH-Konfig?
sudo sshd -t

Fail2ban hat meine eigene IP gesperrt

# Prüfe, ob deine IP gesperrt ist
sudo fail2ban-client status sshd

# IP entsperren
sudo fail2ban-client set sshd unbanip DEINE_IP

UFW blockiert zu viel

Im Notfall kannst du UFW temporär deaktivieren:

sudo ufw disable

Dann in Ruhe die Regeln korrigieren und wieder aktivieren.

Nächste Schritte

Dein Server ist jetzt solide abgesichert — aber Sicherheit ist ein fortlaufender Prozess. Hier sind sinnvolle nächste Schritte:

  • Webserver einrichten: Nginx oder Apache installieren und mit Let’s Encrypt SSL-Zertifikate einrichten
  • Log-Monitoring: Mit Tools wie logwatch oder GoAccess deine Server-Logs im Blick behalten
  • Backups einrichten: Automatische Backups mit borgbackup oder dem Backup-Service deines Hosters
  • Intrusion Detection: rkhunter oder AIDE für Rootkit-Erkennung und Integritätsprüfung
  • Docker & Container: Dienste in Containern isolieren für zusätzliche Sicherheit

Bleib dran — dein Server dankt es dir. 🛡️