Skip to content
L Luka Piplica
linux security sysadmin devops hardening

VPS Hardening: Ein praktischer Leitfaden zur Absicherung eines Linux-Servers

Ein Sicherheits-Blueprint für Linux-Server: Konfiguration von Public-Key-Kryptografie, Einsatz von UFW-Firewalls und die Einrichtung proaktiver Bedrohungsabwehr.

L

Luka Piplica

8 Min. Lesezeit
Retro-Grünbildschirm-Anzeige mit einer Sicherheitswarnmeldung 'Access Denied'

In dem Moment, in dem ein neuer virtueller privater Server (VPS) oder eine Cloud-Instanz mit einer öffentlichen IP-Adresse bereitgestellt wird, wird er zum Ziel. Automatisierte Botnets scannen ständig globale IPv4-Bereiche und versuchen, Standard-Ports auszunutzen, schwache Anmeldedaten per Brute-Force zu knacken und ungepatchte Systemdienste zu identifizieren. Einen Server mit Standardkonfigurationen laufen zu lassen, ist eine offene Einladung für Angreifer.

Die Einrichtung einer soliden, gehärteten Sicherheitsbasis ist eine unverzichtbare Voraussetzung für jede Produktionsumgebung – unabhängig davon, ob einfache Webanwendungen, Datenbankserver oder komplexe API-Netzwerke gehostet werden.

Dieser praktische Leitfaden bietet einen schrittweisen Sicherheits-Blueprint zur Härtung einer sauberen Linux-Installation (speziell ausgerichtet auf Debian- und Ubuntu-Distributionen), zur Konfiguration des sicheren kryptografischen Zugriffs, zum Einsatz von Stateful Firewalls und zur Implementierung proaktiver Workflows zur Bedrohungsabwehr.


Spezifikation der Härtungsarchitektur

Anstatt komplexe Tools von Drittanbietern zu installieren, nutzt eine effektive Serverhärtung stabile, integrierte Linux-Subsystem-Utilities. Die in diesem Leitfaden implementierten Kern-Verteidigungsspezifikationen sind unten aufgeführt:

SicherheitsvektorSoftware / ProtokollTechnisches Ziel
BetriebssystemDebian / UbuntuSaubere Linux-Serverumgebung auf der Basisschicht
Paket-Lebenszyklusunattended-upgradesAutomatisierte Planung und Ausführung kritischer Sicherheits-Patches
ZugriffsautorisierungEd25519 Kryptografische SchlüsselSchnelle, gegen Seitenkanalangriffe immune asymmetrische Schlüsselpaar-Autorisierung
NetzwerkverteidigungUFW (Uncomplicated Firewall)Strikte zustandsorientierte Paketfilterung (Default-Deny-Richtlinie)
Host-VerbergenICMP-Filter (before.rules)Verwirft eingehende Echo-Anfragen, um die aktive Serverpräsenz vor Scannern zu verbergen

Phase 1: Paketsynchronisation und Patch-Automatisierung

Die Pflege aktueller Softwarepakete ist die effektivste Verteidigung gegen bekannte CVEs (Common Vulnerabilities and Exposures).

1. Manuelle Systemsynchronisation

Beginnen Sie mit einer manuellen Aktualisierung und einem Paket-Upgrade, um eine saubere Ausgangsbasis zu gewährleisten:

sudo apt update
sudo apt upgrade -y

2. Automatisierung kritischer Sicherheits-Patches

In Produktionsumgebungen ist es unpraktisch, System-Updates täglich manuell auszuführen. Wir konfigurieren das System so, dass Sicherheitsupdates mithilfe des Utilities unattended-upgrades automatisch angewendet werden.

Installieren Sie das erforderliche Paket:

sudo apt install -y unattended-upgrades

Um Hintergrund-Updates zu aktivieren und die Häufigkeit der Paketbereitstellung zu konfigurieren, konfigurieren Sie die Paketprioritätsregeln neu:

sudo dpkg-reconfigure --priority=low unattended-upgrades

(Wählen Sie Yes (Ja), wenn Sie aufgefordert werden, das automatische Herunterladen und Installieren von sicherheitskritischen Paketen im Hintergrund zu aktivieren).

Systemhinweis: Abhängig von Ihren Verfügbarkeitsgarantien (Uptime) sollten Sie automatische Upgrades sorgfältig überwachen. Obwohl Sicherheits-Patches von kritischer Bedeutung sind, können geringfügige Paketkonflikte gelegentlich spezialisierte, laufende Daemons beeinträchtigen.


Phase 2: Absicherung des Remote-Shell-Zugriffs (SSH)

Die Absicherung des Secure Shell (SSH) Daemons ist ein zentraler Schritt bei der Serverhärtung. Standardmäßig läuft SSH auf Port 22 und erlaubt häufig die passwortbasierte Authentifizierung, was das System anfällig für automatisierte Brute-Force-Angriffe macht.

1. Verzeichnisvorbereitung und Sicherheitsbeschränkungen

Erstellen Sie einen sicheren .ssh-Ordner in Ihrem Benutzerverzeichnis und legen Sie strenge Dateiberechtigungen fest:

mkdir -p ~/.ssh
chmod 700 ~/.ssh

(Ein Berechtigungsstatus von 700 stellt sicher, dass nur der Verzeichniseigentümer Lese-, Schreib- und Ausführungsrechte besitzt, was verhindert, dass andere lokale Benutzer Ihre Anmeldedaten einsehen oder ändern).

2. Generierung von kryptografischen Ed25519-Schlüsselpaaren

Wir ersetzen die Passwort-Authentifizierung vollständig durch die asymmetrische Schlüsselpaar-Authentifizierung. Wir wählen den modernen Ed25519-Kurvenalgorithmus, da er erheblich schneller als das ältere RSA-Verfahren ist, kürzere Schlüssellängen aufweist und strukturell immun gegen Seitenkanalangriffe ist.

Führen Sie den Generator-Befehl auf Ihrem lokalen Client-Rechner (Windows PowerShell, macOS oder Linux-Terminal) aus:

ssh-keygen -t ed25519

Tipp: Sichern Sie Ihr Schlüsselpaar immer mit einer starken Passphrase ab. Dies stellt sicher, dass Ihr privater Schlüssel selbst dann nicht entschlüsselt werden kann, wenn die Datei kompromittiert wird.

3. Bereitstellung des öffentlichen Schlüssels auf dem Remote-Host

Kopieren Sie als Nächstes Ihren neu generierten öffentlichen Schlüssel (id_ed25519.pub) in die Datei authorized_keys des Zielservers.

  • Linux / macOS Client:
    ssh-copy-id -i ~/.ssh/id_ed25519.pub SERVER_USER@SERVER_IP
  • Windows PowerShell Client:
    scp $env:USERPROFILE/.ssh/id_ed25519.pub SERVER_USER@SERVER_IP:~/.ssh/authorized_keys

Verifizieren Sie nach dem Kopieren, dass Sie sich aus der Ferne authentifizieren können, ohne Ihr Account-Passwort einzugeben.

4. Einschränkung der SSH-Daemon-Konfiguration

Nachdem die Schlüssel hinterlegt sind, melden Sie sich auf Ihrem Server an und bearbeiten Sie die Konfigurationsdatei des SSH-Server-Daemons, um Passwort-Logins zu deaktivieren und das Netzwerkverhalten anzupassen:

sudo nano /etc/ssh/sshd_config

Integrieren oder ändern Sie die folgenden Direktiven:

  1. Benutzerdefinierte Port-Zuweisung: Ändern Sie den Standard-SSH-Port auf einen benutzerdefinierten hohen Port (z. B. 4723), um zu verhindern, dass automatisierte Brute-Force-Bot-Scanner gezielt Port 22 angreifen:
    Port 4723
  2. Einschränkung der IP-Familie: Beschränken Sie den Daemon so, dass er ausschließlich auf IPv4 lauscht (wodurch die standardmäßige any-Direktive ersetzt wird):
    AddressFamily inet
  3. Direkten Root-Login deaktivieren: Verhindern Sie die direkte administrative Root-Authentifizierung. Dies zwingt Benutzer dazu, sich über Standard-Accounts zu verbinden und die Rechte nachträglich über sudo zu eskalieren:
    PermitRootLogin no
  4. Schlüsselbasierte Logins erzwingen: Deaktivieren Sie schwache, passwortbasierte Logins vollständig:
    PasswordAuthentication no

Speichern Sie die Datei und starten Sie den SSH-Systemdienst neu, um die Konfiguration anzuwenden:

sudo systemctl restart sshd

Warnung: Schließen Sie Ihre aktive Terminal-Sitzung nach dem Neustart des SSH-Daemons nicht. Öffnen Sie ein neues Terminal-Fenster und überprüfen Sie, ob Sie sich über Ihren benutzerdefinierten Port und Ihren privaten Schlüssel erfolgreich verbinden können. Dies verhindert, dass Sie sich selbst aussperren, falls Ihnen in der Konfigurationsdatei ein Tippfehler unterlaufen ist.


Phase 3: Einsatz einer Stateful Firewall (UFW)

Eine Stateful Firewall (zustandsorientierte Firewall) überwacht aktive Verbindungen und blockiert unautorisierten Netzwerkverkehr, bevor er Ihre Anwendungen erreicht.

1. Überprüfung aktiver Netzwerksockets

Bevor Sie Datenverkehr blockieren, überprüfen Sie, welche Netzwerksockets aktiv auf Ihrem Host lauschen:

sudo ss -tupln

(Analysieren Sie die Ausgabe, um sicherzustellen, dass Sie keine Ports blockieren, die von kritischen aktiven Diensten wie Datenbanken, Webservern oder Key-Value-Caches verwendet werden).

2. Durchsetzung von Firewall-Regeln

Installieren Sie das Utility UFW (Uncomplicated Firewall):

sudo apt install -y ufw

Legen Sie Ihre Autorisierungsregeln für die Ziel-Ports fest. Da wir unseren SSH-Port auf 4723 geändert haben, autorisieren wir eingehenden TCP-Datenverkehr auf diesem spezifischen, benutzerdefinierten Port:

sudo ufw allow 4723/tcp

Aktivieren Sie die Firewall und überprüfen Sie deren Status:

sudo ufw enable
sudo ufw status verbose

(Die Statusausgabe sollte eine Default-Deny-Richtlinie für eingehenden Datenverkehr bestätigen, wobei Port 4723 für TCP-Datenverkehr autorisiert ist).


Phase 4: Defensive Netzwerk-Abschirmung (ICMP-Dropping)

Standardmäßig antworten Linux-Server auf Echo-Anfragen des Internet Control Message Protocols (ICMP) – besser bekannt als Pings. Obwohl dies für die Diagnose der Netzwerkkonnektivität nützlich ist, nutzen Hacker und Botnets sogenannte Ping-Sweeps, um aktive Online-Hosts zu entdecken und Zielnetzwerkbereiche zu kartografieren.

Das Deaktivieren von Ping-Antworten lässt Ihren Server bei automatisierten Sweeps wie eine inaktive (tote) IP-Adresse erscheinen, was die Sichtbarkeit Ihres Zielprofils verringert.

  1. Öffnen Sie die zentrale UFW-Pre-Routing-Regeldatei:
    sudo nano /etc/ufw/before.rules
  2. Suchen Sie den Abschnitt mit der Kennzeichnung # ok icmp codes for INPUT.
  3. Fügen Sie direkt ganz oben in diesem Block (vor allen übereinstimmenden Accept-Regeln) die Drop-Direktive ein:
    -A ufw-before-input -p icmp --icmp-type echo-request -j DROP
  4. Speichern Sie die Änderungen und starten Sie den Server neu, um die Paketrouting-Regeln anzuwenden:
    sudo reboot now

Sobald das System den Neustart abgeschlossen hat, versuchen Sie, den Host von einem externen Rechner aus anzupingen. Die Anfrage läuft in ein Zeitlimit (Timeout), was zeigt, dass der Server seine Netzwerkpräsenz erfolgreich verbirgt.


Technical Glossary: Hardening Lexicon

Begriff / UtilityTechnischer ÜberblickVisueller & Sicherheits-Vorteil
unattended-upgradesAutomatischer Sicherheits-Patch-ManagerRuft im Hintergrund regelmäßig kritische CVE-Patches ab und wendet sie an, um Abhängigkeiten ohne manuelles Eingreifen des Admins abzusichern.
Ed25519 KeysAsymmetrischer Elliptic-Curve-AlgorithmusBietet hochsicheren Zugriff basierend auf elliptischer Kurvenkryptografie und liefert schnellere Geschwindigkeiten sowie einen kleineren Schlüssel-Fußabdruck als das ältere RSA-Verfahren.
sshd_configSystemkonfigurationsdatei des SSH-DaemonsDie zentrale Datei zur Einschränkung von Zugriffsrichtlinien, zur Anpassung von Ports, zur Erzwingung schlüsselbasierter Logins und zur Deaktivierung des direkten Root-Zugriffs.
ssSocket-Statistik-UtilityEin modernes Befehlszeilen-Tool zur Überprüfung aktiver TCP/UDP-Ports, lauschender Sockets und Prozess-IDs.
UFWUncomplicated Firewall WrapperEin Befehlszeilen-Frontend für iptables, das eine benutzerfreundliche Oberfläche zur Verwaltung von zustandsorientierten Paketfilterrichtlinien bietet.
ICMP Echo RequestInternet Control Message Protocol PaketEin Diagnosepaket, das gesendet wird, um die Netzwerkpräsenz eines Hosts zu überprüfen. Das Verwerfen (Dropping) dieser Pakete verbirgt Ihren Server vor automatisierten Scannern.

Conclusion & Architectural Retrospective

Die Härtung eines Linux-Servers ist ein fortlaufender Prozess der Bedrohungsanalyse (Threat Modeling) und der Reduzierung der Angriffsfläche Ihres Systems. Obwohl kein Server absolut unhackbar ist, erhöht der Einsatz dieser grundlegenden Defense-in-Depth-Prinzipien – die Erzwingung des rein schlüsselbasierten SSH-Zugriffs, die Automatisierung von Patches, die Konfiguration einer Stateful Firewall und das Verwerfen von Netzwerk-Ping-Anfragen – die Einstiegshürde erheblich. Dies schützt Ihren Host und Ihre Dienste vor automatisierten Bot-Sweeps und Brute-Force-Kampagnen.

Die Implementierung einer robusten Defense-in-Depth-Konfiguration auf öffentlich erreichbaren Servern zeigt, wie systematische Richtliniendurchsetzung und proaktive Bedrohungsanalyse den Grundstein für sicheres Cloud-Engineering und Infrastruktur-Zuverlässigkeit legen.

Zurück zum Blog
Teilen:

Bleib auf dem Laufenden

Verpasse nichts – neue Artikel, Gedanken und Updates.