Ein frischer VPS kommt meistens mit root-Passwort-Login und komplett offenem SSH-Port an. Das reicht für die erste Verbindung – danach sollte beides weg sein. Hier ist was ich standardmäßig als erstes mache, noch bevor irgendein Service installiert wird.
SSH-Key einrichten
Auf dem lokalen Rechner einen ed25519-Key erstellen, falls noch keiner da ist:
ssh-keygen -t ed25519 -C "vps-name"
Den public Key auf den Server kopieren:
ssh-copy-id -i ~/.ssh/id_ed25519.pub root@server-ip
Danach einmal testen ob der Key-Login funktioniert – nicht ausloggen bevor das klar ist. Wer sich ausgesperrt hat und keinen Out-of-Band-Zugang (Web-Console im Hoster-Panel) hat, hat ein Problem.
sshd_config absichern
Ich lege eine eigene Datei in /etc/ssh/sshd_config.d/ an statt die Hauptkonfiguration zu editieren – das übersteht Updates sauberer:
# /etc/ssh/sshd_config.d/hardening.conf
PasswordAuthentication no
PermitRootLogin prohibit-password
MaxAuthTries 3
MaxStartups 10:30:30
LoginGraceTime 20
X11Forwarding no
AllowTcpForwarding no
Konfiguration prüfen und SSH neu laden:
sshd -t && systemctl reload ssh
Hinweis zu MaxStartups: Bei Servern mit wenig RAM (1 GB) und vielen eingehenden Bot-Verbindungen kann sshd ins Throttling rutschen. Das Symptom ist ein
Connection resetohne Banner – nicht auf Anhieb offensichtlich. Fail2Ban hilft dagegen mehr als ein hohes MaxStartups-Limit.
UFW Firewall
Auf einem frischen Ubuntu-Server ist UFW meistens installiert aber deaktiviert. Erst die Regeln setzen, dann aktivieren – in der falschen Reihenfolge sperrt man sich aus:
ufw default deny incoming
ufw default allow outgoing
ufw allow 22/tcp comment "SSH"
ufw allow 80/tcp comment "HTTP"
ufw allow 443/tcp comment "HTTPS"
ufw enable
Status prüfen:
ufw status verbose
Wer XMPP oder andere Dienste betreibt, fügt die nötigen Ports hinzu (5222/tcp für XMPP-Clients, 5269/tcp für Federation). Alles andere bleibt zu.
Automatische Sicherheitsupdates
Ungepatchte Pakete sind einer der häufigsten Angriffsvektoren. unattended-upgrades übernimmt das automatisch für Security-Updates:
apt install -y unattended-upgrades
dpkg-reconfigure --priority=low unattended-upgrades
In /etc/apt/apt.conf.d/50unattended-upgrades stelle ich automatische Reboots aus – ich will wissen wenn der Server neustartet:
Unattended-Upgrade::Automatic-Reboot "false";
Unattended-Upgrade::Remove-Unused-Dependencies "true";
Ob Updates tatsächlich ankommen lässt sich so prüfen:
unattended-upgrades --dry-run --debug 2>&1 | head -30
Fail2Ban
Das kommt als nächstes, hat aber einen eigenen Artikel – dort gehe ich auf Custom Jails für Nginx und Prosody ein.
Was danach kommt
Das hier ist das Minimum für einen öffentlichen Server. Je nach Use Case kommen noch dazu: AppArmor-Profile aktivieren, auditd für Kernel-Audit-Logging, oder bei sensiblen Diensten eine zweite Authentifizierungsschicht. Bei mir läuft auf dem VPS nur Nginx – die eigentliche Anwendungslogik liegt auf eigenem Hardware hinter einem WireGuard-Tunnel, der vom VPS aus nicht direkt erreichbar ist.