Einen neuen VPS absichern: die Checkliste
Zuletzt aktualisiert:
Ein neuer VPS hängt ab dem ersten Start im Internet, und Scanner finden ihn innerhalb von Minuten. Diese zehn Schritte sind die erste Arbeitsstunde auf einem frischen Server mit Debian, Ubuntu oder aus der RHEL-Familie (RHEL, Rocky Linux, AlmaLinux, Oracle Linux, CentOS Stream, Fedora), in einer Reihenfolge, bei der du dich nicht selbst aussperrst.
Führe sie als Benutzer mit sudo aus, halte eine SSH-Sitzung offen, während du SSH oder die Firewall änderst, und finde vorher heraus, wo die Webkonsole deines Providers ist; sie funktioniert auch dann, wenn SSH nicht mehr geht.
1. Alle Updates installieren
Cloud-Images sind oft Wochen alt. Bring alles auf den neuesten Stand, bevor du irgendetwas anderes installierst, und starte neu, wenn sich der Kernel oder zentrale Bibliotheken geändert haben.
sudo apt update && sudo apt full-upgrade -y
[ -f /var/run/reboot-required ] && echo "reboot needed"sudo dnf upgrade --refresh -y
sudo dnf needs-restarting -rIn der RHEL-Familie sagt needs-restarting -r, ob ein Neustart nötig ist. Starte mit sudo reboot neu und melde dich wieder an.
2. Einen eigenen Benutzer mit sudo anlegen
Arbeite als namentlicher Benutzer mit sudo, nicht als root: Aktionen werden unter einem Namen protokolliert, und der root-Login lässt sich im nächsten Schritt abschalten.
sudo adduser deploy
sudo usermod -aG sudo deploysudo useradd -m deploy
sudo passwd deploy
sudo usermod -aG wheel deployKopiere deinen SSH-Schlüssel zum Benutzer (ssh-copy-id deploy@SERVER_IP von deinem Rechner aus), melde dich aus einem zweiten Terminal als dieser Benutzer an und prüfe sudo -v. Stell dann sicher, dass nur root die Benutzer-ID 0 hat und kein Konto ein leeres Passwort: Der erste Befehl darf nur root ausgeben, der zweite gar nichts.
awk -F: '$3 == 0 {print $1}' /etc/passwd
sudo awk -F: '$2 == "" {print $1}' /etc/shadow3. SSH absichern
Nur Schlüssel, kein root-Login, wenige Versuche pro Verbindung. Die vollständige Anleitung mit allen Prüfungen und dem Portwechsel steht unter So stoppst du SSH-Brute-Force-Angriffe. Die Kurzfassung, sobald dein Schlüssel-Login funktioniert:
sudo tee /etc/ssh/sshd_config.d/00-hardening.conf > /dev/null <<'EOF'
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
MaxAuthTries 4
EOF
sudo sshd -t && echo "config OK"sudo systemctl reload sshsudo systemctl reload sshdAchtung: Teste aus einem zweiten Terminal einen neuen Login mit Schlüssel, bevor du die aktuelle Sitzung schließt. Gibt grep -i '^Include' /etc/ssh/sshd_config nichts aus (RHEL 8 und seine Rebuilds), gehören diese Zeilen stattdessen in /etc/ssh/sshd_config.
4. Die Firewall einschalten
Alles Eingehende verbieten, dann nur öffnen, was der Server anbietet. Hier SSH auf 22 und ein Webserver auf 80 und 443; lass weg, was bei dir nicht läuft.
sudo apt install -y ufw
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 80,443/tcp
sudo ufw enable
sudo ufw status verbosesudo dnf install -y firewalld
sudo systemctl enable --now firewalld
sudo firewall-cmd --permanent --add-service=ssh
sudo firewall-cmd --permanent --add-service=http --add-service=https
sudo firewall-cmd --reload
sudo firewall-cmd --list-allAchtung: Erlaube deinen SSH-Port vor ufw enable bzw. vor dem Reload, sonst werden neue SSH-Verbindungen abgewiesen. Hast du SSH auf einen anderen Port gelegt, öffne diesen.
- Unter RHEL 9 und seinen Rebuilds erlaubt die Standardzone auch
cockpit: Entferne es mitsudo firewall-cmd --permanent --remove-service=cockpit, wenn du es nicht nutzt, und lade dann neu. - Docker veröffentlicht Container-Ports mit eigenen iptables-Regeln, die ufw nicht sieht: Ein mit
-p 8080:80veröffentlichter Port ist offen, auch wenn ufw etwas anderes anzeigt. Veröffentliche auf127.0.0.1:8080:80, wenn nur der lokale Proxy ihn braucht. - Die meisten Provider haben zusätzlich eine Cloud-Firewall oder Security Group. Nutze sie als zweite Schicht mit denselben Regeln.
5. Automatische Sicherheitsupdates einschalten
Auf den meisten kompromittierten Servern läuft Software, für die es seit Wochen ein Update gab. Lass den Server Sicherheitsupdates selbst installieren.
sudo apt install -y unattended-upgrades
sudo tee /etc/apt/apt.conf.d/20auto-upgrades > /dev/null <<'EOF'
APT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";
EOF
sudo unattended-upgrade --dry-run --debug 2>&1 | tail -n 20Welche Updates installiert werden, steht in /etc/apt/apt.conf.d/50unattended-upgrades (unter Ubuntu die Sicherheitsupdates, unter Debian die Sicherheits- und Point-Release-Updates). Automatische Neustarts sind aus, solange du dort nicht Unattended-Upgrade::Automatic-Reboot "true"; setzt.
sudo dnf install -y dnf-automatic
sudo sed -i -e 's/^upgrade_type.*/upgrade_type = security/' \
-e 's/^apply_updates.*/apply_updates = yes/' /etc/dnf/automatic.conf
sudo systemctl enable --now dnf-automatic.timer
systemctl list-timers dnf-automatic.timer- CentOS Stream veröffentlicht keine Security Advisories, deshalb installiert
upgrade_type = securitydort nichts: Nimmupgrade_type = default. - Fedora 41 und neuer nutzen dnf5: Installiere
dnf5-plugin-automaticund setze dieselben Optionen in/etc/dnf/automatic.conf(sieheman dnf5-automatic). - Keines der beiden Werkzeuge startet standardmäßig neu. Plane einen Neustart ein, wenn der Kernel aktualisiert wurde.
6. Backups einrichten, die den Server verlassen
Ein Backup auf demselben Server oder nur im selben Provider-Konto ist weg, wenn der Server oder das Konto weg ist. Bewahre mindestens eine Kopie woanders auf, verschlüsselt, und teste eine Wiederherstellung. Snapshots des Providers sind eine gute Ergänzung, kein Ersatz.
restic ist eine einfache Möglichkeit: verschlüsselt, dedupliziert, auf SFTP, S3 und andere Ziele. Es ist für Debian und Ubuntu paketiert und für die RHEL-Familie in EPEL. Ersetze BACKUP_HOST durch deinen Backup-Server; restic fragt nach einem Repository-Passwort, das du außerhalb dieses Servers aufbewahren musst.
sudo apt install -y resticsudo dnf install -y epel-release
sudo dnf install -y resticsudo restic -r sftp:backup@BACKUP_HOST:/srv/restic/$(hostname) init
sudo restic -r sftp:backup@BACKUP_HOST:/srv/restic/$(hostname) backup /etc /home /root /var/www
sudo restic -r sftp:backup@BACKUP_HOST:/srv/restic/$(hostname) snapshotsExportiere Datenbanken vor dem Backup in eine Datei (mysqldump --single-transaction, pg_dump), statt ihre Datenverzeichnisse im laufenden Betrieb zu kopieren. Beweise dann, dass eine Wiederherstellung funktioniert:
sudo restic -r sftp:backup@BACKUP_HOST:/srv/restic/$(hostname) restore latest --target /tmp/restore-test --include /etc/hostname
cat /tmp/restore-test/etc/hostnameHinweis: Plane das Backup mit einem systemd-Timer oder cron und prüfe das Ergebnis: Ein Backup-Job, der seit Monaten unbemerkt fehlschlägt, ist der Normalfall.
7. Monitoring und Alarme einrichten
Ohne dich anzumelden, musst du erfahren, wann der Server ausfällt, wann die Platte vollläuft und wann sich jemand anmeldet oder ihn angreift. Mindestens:
- Eine externe Uptime-Prüfung der Website oder des Dienstes, von außerhalb deines Providers.
- Einen Alarm bei knappem Speicherplatz und bei fehlgeschlagenen Diensten.
- Eine Aufzeichnung, wer sich angemeldet hat, und einen Alarm bei Angriffen und bei Änderungen an Systemdateien.
Bis ein Werkzeug das für dich übernimmt, zeigen diese Befehle die letzten Anmeldungen, die Fehler seit dem Start und den freien Speicherplatz:
last -n 20
sudo journalctl -p err -b --no-pager | tail -n 30
df -h /8. Nicht benötigte Ports schließen
Liste auf, was lauscht. Eine Adresse 0.0.0.0 oder [::] bedeutet alle Schnittstellen, also das Internet, sofern die Firewall es nicht aufhält.
sudo ss -tulpn- Stoppe und deaktiviere die Dienste, die du nicht nutzt.
- Datenbanken und Caches, die nur derselbe Server nutzt, lauschen auf localhost:
bind-address = 127.0.0.1für MySQL und MariaDB,listen_addresses = 'localhost'für PostgreSQL,bind 127.0.0.1 -::1für Redis. - Stell die Docker-API (2375, 2376) oder Redis ohne Passwort nie ins Internet: Beides sind gängige Einfallstore für Krypto-Miner.
sudo systemctl disable --now SERVICE_NAMEPrüfe dann von außen, von einem anderen Rechner mit installiertem nmap. Antworten dürfen nur die Ports, die du in Schritt 4 geöffnet hast.
nmap -Pn SERVER_IP9. Die Uhr synchron halten
Logs verschiedener Server passen nur zusammen, wenn ihre Uhren übereinstimmen, und TLS, Zwei-Faktor-Codes und die Zeitleiste eines Vorfalls hängen alle von der Uhrzeit ab. Prüfe sie:
timedatectlDu willst System clock synchronized: yes sehen. Wenn nicht:
sudo apt install -y systemd-timesyncd
sudo timedatectl set-ntp truesudo dnf install -y chrony
sudo systemctl enable --now chronyd
chronyc trackingHinweis: Manche Images bringen chrony statt systemd-timesyncd mit. Nimm, was vorhanden ist: Wenn du das eine installierst, wird das andere entfernt oder ersetzt.
10. Logs lange genug aufbewahren
Wenn etwas passiert, lautet die erste Frage, was vorher passiert ist. Mach das System-Journal dauerhaft, mit einer Größengrenze und einer Aufbewahrungsdauer deiner Wahl:
sudo mkdir -p /etc/systemd/journald.conf.d
sudo tee /etc/systemd/journald.conf.d/retention.conf > /dev/null <<'EOF'
[Journal]
Storage=persistent
SystemMaxUse=1G
MaxRetentionSec=1year
EOF
sudo systemctl restart systemd-journald
journalctl --disk-usage- Richte die Grenze nach der Platte: 1 GB reicht für einen kleinen Server völlig.
- Wie lange du Logs aufbewahren musst, hängt von deinen Verträgen und Pflichten ab (zum Beispiel den Meldepflichten bei Vorfällen nach NIS2). Leg es fest, schreib es auf und stell es hier ein.
- Logs, die nur auf dem Server liegen, kann jeder löschen, der eingebrochen ist. Schick zusätzlich eine Kopie an einen anderen Rechner oder einen Log-Dienst.
- Dateien in
/var/log(Webserver, auth.log unter Debian und Ubuntu) rotiert logrotate: Der Wertrotatein/etc/logrotate.d/legt fest, wie viele alte Dateien erhalten bleiben.
Was InfraFence auf einem neuen Server prüft und überwacht
Nach der Installation prüft InfraFence den Server täglich oder auf Wunsch und überwacht ihn laufend in Echtzeit. Das deckt mehrere Schritte dieser Liste ab, nicht alle:
- 40 bis 50 Härtungsprüfungen, je nach Server: SSH-Einstellungen, Konten mit Benutzer-ID 0 oder leerem Passwort, aus dem Internet erreichbare Datenbanken, ausstehende Sicherheitsupdates, ein Betriebssystem nach seinem Supportende, Berechtigungen sensibler Dateien, Webserver-Einstellungen, offengelegte Geheimnisse.
- Bekannte Schwachstellen (CVE) der installierten Pakete, aus den Security-Trackern von Debian, Ubuntu, AlmaLinux und Rocky Linux, gewichtet danach, ob sie tatsächlich ausgenutzt werden.
- Ein Sicherheitswert von 0 bis 100, der zeigt, was ihn senkt. Die sicheren Korrekturen werden mit einem Klick angewendet und lassen sich rückgängig machen; die, die dich aussperren könnten, wie SSH-Login und Port, werden stattdessen Schritt für Schritt erklärt.
- Erkennung und Abwehr in Echtzeit: Brute Force auf SSH und andere Dienste, Web-Angriffe, Bots, Malware, ausgehende und DNS-Bedrohungen sowie Änderungen an kritischen Dateien.
- Alarme per E-Mail, Slack, Discord, Telegram oder Webhook sowie Metriken zu CPU, Arbeitsspeicher, Platte und Netzwerk.
Backups, die Zeitsynchronisation und die Aufbewahrung deiner Logs übernimmt es nicht: Diese Schritte bleiben bei dir.
Fragen
- Reicht die Firewall des Providers, oder brauche ich zusätzlich ufw oder firewalld?
- Nutze beide, wenn du kannst. Die Firewall des Providers hält Verkehr auf, bevor er den Server erreicht; die auf dem Server schützt ihn weiter, wenn die Cloud-Regeln versehentlich geändert werden oder der Server umzieht.
- Sind automatische Updates auf einem Produktivserver sicher?
- Sicherheitsupdates für die stabilen Releases dieser Distributionen sind klein und getestet und deutlich weniger riskant, als bekannte Lücken offen zu lassen. Lass automatische Neustarts aus und plane sie, und halte ein getestetes Backup bereit.
- Wie lange sollte ich Logs aufbewahren?
- Eine allgemeingültige Zahl gibt es nicht. Es hängt von deinen Verträgen und von Regeln wie NIS2 für die Unternehmen ab, die darunter fallen. Leg einen Zeitraum fest, bewahre eine Kopie außerhalb des Servers auf und sorg dafür, dass der Server mindestens genug behält, um die letzten Wochen nachzuvollziehen.
Kostenlos auf 1 Server testen
Starter ist für einen Server kostenlos, mit vollem Schutz und automatischen Sperren. Ohne Kreditkarte.
Installiere den Agenten als root, mit deinem Token anstelle von <TOKEN>:
curl -fsSL https://github.com/infrafence/infrafence-agent/releases/latest/download/install.sh | sudo bash -s -- --token <TOKEN>Das Token erstellst du im Dashboard unter Server › Server hinzufügen.
