Ubuntu · Debian · VPS

SSH Setup

Vom ersten Zugriff über die Browser-VNC-Konsole bis zum abgesicherten SSH-Login ausschließlich per Public Key.

1. Vorbereitung und Grundprinzip

Wichtiger Sicherheitshinweis Das Schlüsselpaar sollte idealerweise auf dem eigenen Rechner erzeugt werden – der private Schlüssel bleibt dann immer lokal. Die Erzeugung direkt auf dem Server ist nur eine Übergangslösung, falls lokal keine geeignete Umgebung verfügbar ist.

Empfohlener Ablauf:

  1. Über die STRATO-VNC-Konsole auf den Server zugreifen.
  2. Temporär den SSH-Login per Benutzername und Passwort erlauben.
  3. Einen normalen Benutzer mit sudo-Rechten anlegen.
  4. SSH-Schlüssel erzeugen und den Public Key in authorized_keys hinterlegen.
  5. Den Public-Key-Login in einer zweiten Sitzung testen.
  6. Passwort- und Root-Login deaktivieren.
System aktualisieren
sudo apt update
System aktualisieren
sudo apt full-upgrade -y
System aktualisieren
sudo apt install -y openssh-server sudo nano vim

2. Zugriff über die STRATO-VNC-Konsole

Die VNC-Konsole im STRATO-Kundenbereich funktioniert unabhängig von einer fehlerhaften SSH-Konfiguration und ist deshalb der wichtigste Notfallzugang.

Hinweis zur Browser-Konsole Copy & Paste funktioniert in der Browser-VNC oft nicht zuverlässig. Lange Befehle, Schlüssel und Konfigurationsblöcke müssen ggf. Zeichen für Zeichen eingegeben werden – ein guter Grund, die grundlegende Bedienung von vim zu kennen (siehe Abschnitt 3).

Die aktuelle SSH-Konfiguration vor Änderungen sichern:

Backup anlegen
sudo cp -a /etc/ssh/sshd_config /etc/ssh/sshd_config.backup

3. Editor-Grundlagen: nano und vim

nano zeigt die wichtigsten Tastenkombinationen permanent am unteren Bildschirmrand an und eignet sich für schnelle, kleine Änderungen. vim ist auf praktisch jedem Linux-System vorinstalliert (auch wenn eine SSH-Verbindung mal nicht klappt und nur die VNC-Konsole bleibt) und lohnt sich, weil er auch ohne Maus und Copy & Paste zuverlässig funktioniert.

Die drei Modi von vim

Anders als nano arbeitet vim modal – Tasten haben je nach Modus unterschiedliche Bedeutung:

  • Normalmodus – Startzustand nach dem Öffnen. Hier navigiert man und ruft Befehle auf, es wird nichts eingegeben.
  • Einfügemodus (Insert) – wird über i, a oder o aus dem Normalmodus gestartet, hier wird wie gewohnt Text getippt.
  • Kommandozeilenmodus – über : aus dem Normalmodus erreichbar, für Speichern, Suchen/Ersetzen und Beenden.
Taste / BefehlModusWirkung
iNormal → InsertEinfügen vor der Cursorposition
aNormal → InsertEinfügen nach der Cursorposition
oNormal → InsertNeue Zeile unterhalb öffnen und einfügen
Esc→ NormalZurück in den Normalmodus (immer zuerst drücken)
:wKommandozeileSpeichern, Datei bleibt geöffnet
:wq oder ZZKommandozeile / NormalSpeichern und beenden
:q!KommandozeileBeenden ohne zu speichern (Änderungen verwerfen)
ddNormalAktuelle Zeile löschen (und in die Zwischenablage legen)
yy / pNormalZeile kopieren / danach einfügen
u / Strg+rNormalRückgängig / Wiederherstellen
/suchbegriffNormalVorwärts suchen, mit n/N zum nächsten/vorherigen Treffer
gg / GNormalZum Dateianfang / -ende springen
:set numberKommandozeileZeilennummern einblenden (hilfreich bei Diagnosen)
:%s/alt/neu/gKommandozeileAlle Vorkommen von „alt“ in der ganzen Datei durch „neu“ ersetzen
Beispiel: PasswordAuthentication in vim umschalten
sudo vim /etc/ssh/sshd_config
# Im Normalmodus:
#   /PasswordAuthentication   Enter   → springt zur Zeile
#   :s/PasswordAuthentication yes/PasswordAuthentication no/   Enter   → ersetzt nur in dieser Zeile
#   :wq   Enter   → speichern und beenden
vim-tiny auf minimalen Debian-Images Manche Basisinstallationen enthalten nur vim.tiny ohne Syntax-Highlighting und Suchhistorie. Mit sudo apt install vim lässt sich der vollständige Editor nachinstallieren.

4. Passwort-Login vorübergehend erlauben

Öffne die Hauptkonfiguration mit dem Editor deiner Wahl:

sshd_config bearbeiten
sudo nano /etc/ssh/sshd_config
sshd_config bearbeiten
# oder:
sudo vim /etc/ssh/sshd_config

Für die Übergangsphase sollten mindestens diese Werte gelten:

Temporäre SSH-Einstellungen
PasswordAuthentication yes
PubkeyAuthentication yes
PermitRootLogin no
KbdInteractiveAuthentication no
UsePAM yes

Was diese und weitere Direktiven bedeuten: siehe sshd_config-Referenz.

Ubuntu-/Cloud-Image beachten Einstellungen unter /etc/ssh/sshd_config.d/*.conf können Werte aus der Hauptdatei überschreiben. Prüfe deshalb immer die tatsächlich wirksame Konfiguration.
Zusatzkonfigurationen und wirksame Werte prüfen
sudo grep -RniE '^(PasswordAuthentication|PubkeyAuthentication|PermitRootLogin|KbdInteractiveAuthentication)' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ 2>/dev/null
Zusatzkonfigurationen und wirksame Werte prüfen
sudo sshd -T | grep -E 'passwordauthentication|pubkeyauthentication|permitrootlogin|kbdinteractiveauthentication'

Vor dem Neustart immer die Syntax testen:

Konfiguration prüfen und neu laden
sudo sshd -t
Konfiguration prüfen und neu laden
sudo systemctl reload ssh
Konfiguration prüfen und neu laden
# Falls reload nicht funktioniert:
sudo systemctl restart ssh
Bestehende Sitzung offen lassen Schließe die VNC- oder bereits funktionierende SSH-Sitzung erst, wenn ein neuer Login erfolgreich getestet wurde.

5. Normalen Benutzer anlegen

Beispielbenutzer „USERNAME“
sudo adduser USERNAME
Beispielbenutzer „USERNAME“
sudo usermod -aG sudo USERNAME
Beispielbenutzer „USERNAME“
id USERNAME

Ein direktes Arbeiten als root sollte vermieden werden – der Benutzer kann administrative Befehle später bei Bedarf mit sudo ausführen.

6. SSH-Schlüssel erzeugen

Empfohlen: Schlüssel lokal erzeugen

Auf Linux, macOS oder Windows PowerShell
ssh-keygen -t ed25519 -a 100 -C "USERNAME@strato-vps"

Falls RSA zwingend erforderlich ist, mindestens 3072 Bit verwenden:

RSA-Alternative
ssh-keygen -t rsa -b 4096 -o -a 100 -C "USERNAME@strato-vps"

ed25519 oder RSA – worin liegt der Unterschied?

Beide Verfahren erzeugen ein asymmetrisches Schlüsselpaar, unterscheiden sich aber im zugrunde liegenden mathematischen Verfahren – und dadurch in Schlüssellänge, Geschwindigkeit und Sicherheitsniveau:

Kriteriumed25519RSA
Verfahren Elliptische-Kurven-Kryptografie (EdDSA auf Curve25519) Faktorisierung großer Primzahlen (klassisches RSA)
Schlüsselgröße Fest 256 Bit – Länge ist nicht wählbar Wählbar, Sicherheit hängt direkt von der Bitlänge ab (mind. 3072, besser 4096 Bit)
Sicherheitsniveau Entspricht bei 256 Bit etwa RSA mit ~3000+ Bit, bei deutlich kürzerem Schlüssel Abhängig von der Bitlänge – 1024/2048 Bit gelten inzwischen als zu schwach
Geschwindigkeit Schnelleres Signieren/Verifizieren, geringere CPU-Last Spürbar langsamer, besonders beim Erzeugen des Schlüsselpaars
Kompatibilität Ab OpenSSH 6.5 (2014); nicht unterstützt von sehr alten Systemen, manchen Netzwerkgeräten oder Legacy-Tools Von praktisch jedem SSH-Client/-Server seit den 1990ern unterstützt
Angriffsfläche Konstante Laufzeit der Operationen, dadurch weniger anfällig für Timing-Angriffe Anfälliger für Implementierungsfehler bei schwacher Zufallszahlengenerierung
Empfehlung ed25519 ist für neue Schlüssel der Standard: kürzer, schneller und mindestens so sicher wie RSA. RSA nur dann wählen, wenn ein Zielsystem (z. B. ein sehr altes Gerät oder eine Firmen-Policy) zwingend RSA-Schlüssel verlangt – dann mit mindestens 3072, besser 4096 Bit.

Übergangslösung: Schlüssel auf dem VPS erzeugen

Als Zielbenutzer ausführen
sudo -iu USERNAME
Als Zielbenutzer ausführen
mkdir -p ~/.ssh
Als Zielbenutzer ausführen
chmod 700 ~/.ssh
Als Zielbenutzer ausführen
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519
Privaten Schlüssel schützen Die Datei ohne Endung (z. B. id_ed25519 oder id_rsa) ist privat und darf niemals veröffentlicht, per Chat versendet oder in authorized_keys eingetragen werden. Nach sicherer Übertragung auf den eigenen Rechner sollte die Kopie auf dem Server gelöscht werden, falls dort nicht benötigt.

7. Public Key hinterlegen

USERNAME ist ein Platzhalter USERNAME steht in diesem Dokument durchgängig für den in Abschnitt 5 angelegten Benutzer (im Beispiel dort deploy) – genau wie SERVER-IP für die tatsächliche IP-Adresse oder den Hostnamen des VPS steht. Beide Platzhalter vor dem Ausführen durch die eigenen Werte ersetzen.

Der Inhalt der Datei mit der Endung .pub gehört in ~/.ssh/authorized_keys des Zielbenutzers.

Public Key auf dem Server eintragen
sudo -iu USERNAME
Public Key auf dem Server eintragen
mkdir -p ~/.ssh
Public Key auf dem Server eintragen
chmod 700 ~/.ssh
Public Key auf dem Server eintragen
nano ~/.ssh/authorized_keys
# oder: vim ~/.ssh/authorized_keys
Public Key auf dem Server eintragen
chmod 600 ~/.ssh/authorized_keys
Public Key auf dem Server eintragen
chown -R USERNAME:USERNAME ~/.ssh

Bei lokal erzeugtem Schlüssel ist alternativ ssh-copy-id bequem:

Vom lokalen Rechner aus
ssh-copy-id -i ~/.ssh/id_ed25519.pub USERNAME@SERVER-IP

Dateien per scp übertragen

ssh-copy-id ist praktisch für genau einen Public Key. Für alle anderen Dateien – z. B. wenn ssh-copy-id lokal nicht verfügbar ist (etwa unter Windows) oder wenn Konfigurationen, Backups oder Projektdateien übertragen werden sollen – eignet sich scp. Es nutzt dieselbe Authentifizierung wie ssh, also ebenfalls den hinterlegten Public Key.

Lokal → Server (Upload)
# Einzelne Datei hochladen:
scp -i ~/.ssh/id_ed25519 ./lokale-datei.txt USERNAME@SERVER-IP:/home/USERNAME/
Lokal → Server (Upload)
# Ganzen Ordner hochladen (rekursiv, -r):
scp -r -i ~/.ssh/id_ed25519 ./lokaler-ordner USERNAME@SERVER-IP:/home/USERNAME/
Server → Lokal (Download)
# Einzelne Datei herunterladen:
scp -i ~/.ssh/id_ed25519 USERNAME@SERVER-IP:/home/USERNAME/entfernte-datei.txt ./
Server → Lokal (Download)
# Ganzen Ordner herunterladen (rekursiv, -r):
scp -r -i ~/.ssh/id_ed25519 USERNAME@SERVER-IP:/home/USERNAME/entfernter-ordner ./

Läuft sshd nicht auf Port 22, muss der Port bei scp mit großem -P angegeben werden (bei ssh dagegen kleines -p):

Abweichenden Port angeben
scp -P 2222 -i ~/.ssh/id_ed25519 ./lokale-datei.txt USERNAME@SERVER-IP:~/
Alternativen zu scp Für viele kleine Dateien oder wiederholte Synchronisation ist rsync -avz -e "ssh -i ~/.ssh/id_ed25519" ./ordner/ USERNAME@SERVER-IP:/ziel/ effizienter, da nur geänderte Inhalte übertragen werden. Für eine grafische Dateiverwaltung eignet sich ein SFTP-fähiger Client (z. B. FileZilla oder WinSCP) mit demselben Schlüssel.

8. Public-Key-Login testen

Den Test in einem neuen Terminal durchführen:

Standardtest
ssh -i ~/.ssh/id_ed25519 USERNAME@SERVER-IP

Für eine ausführliche Fehlerausgabe:

Debug-Modus
ssh -vvv -i ~/.ssh/id_ed25519 USERNAME@SERVER-IP
Erst danach absichern Deaktiviere den Passwort-Login nur, wenn dieser neue Login zuverlässig funktioniert und sudo für den Benutzer erfolgreich getestet wurde.

9. SSH wieder auf Public Key absichern

In /etc/ssh/sshd_config beziehungsweise einer eigenen Datei unter /etc/ssh/sshd_config.d/ setzen:

Sichere Grundeinstellungen
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
PermitEmptyPasswords no
MaxAuthTries 3
X11Forwarding no

Optional kann der SSH-Zugriff auf bestimmte Benutzer begrenzt werden:

Optional: Benutzer beschränken
AllowUsers USERNAME

Danach erneut prüfen und neu laden:

Abschlussprüfung
sudo sshd -t
Abschlussprüfung
sudo sshd -T | grep -E 'passwordauthentication|pubkeyauthentication|permitrootlogin|kbdinteractiveauthentication'
Abschlussprüfung
sudo systemctl reload ssh
Abschlussprüfung
sudo systemctl status ssh --no-pager
Eigene Drop-in-Datei Eine Datei wie /etc/ssh/sshd_config.d/99-local-hardening.conf hält eigene Einstellungen übersichtlich. Trotzdem gilt: mit sshd -T prüfen, welche Werte am Ende tatsächlich aktiv sind – spätere Dateien überschreiben frühere.

10. sshd_config-Referenz: die wichtigsten Direktiven

Übersicht der praxisrelevanten Direktiven aus /etc/ssh/sshd_config über die bereits gesetzten Werte hinaus. Nicht gesetzte Direktiven verwenden den in sshd einkompilierten Standardwert – maßgeblich ist immer sudo sshd -T.

DirektiveEmpfehlungBedeutung
Port 22 oder individuell TCP-Port des SSH-Diensts. Ein abweichender Port reduziert Log-Rauschen durch automatisierte Scans, ersetzt aber keine echte Authentifizierung.
AddressFamily any Beschränkt sshd auf inet (nur IPv4), inet6 (nur IPv6) oder any (beides).
ListenAddress Standard: alle Interfaces Bindet sshd an bestimmte IP-Adressen statt an alle Netzwerkschnittstellen des Servers.
PermitRootLogin no Verbietet den direkten Root-Login. Alternative prohibit-password erlaubt Root nur per Key, nie per Passwort.
PasswordAuthentication no Deaktiviert Passwort-Logins vollständig – nur Public-Key-Logins werden akzeptiert.
PubkeyAuthentication yes Aktiviert den Login per Schlüsselpaar. Sollte nie deaktiviert werden, sonst ist kein Login mehr möglich.
KbdInteractiveAuthentication no Deaktiviert interaktive Challenge-Response-Logins (früher ChallengeResponseAuthentication). Verhindert, dass PAM ein Passwort-Login durch die Hintertür erlaubt.
PermitEmptyPasswords no Verbietet Logins mit leerem Passwort.
MaxAuthTries 3 Maximale Anzahl an Authentifizierungsversuchen pro Verbindung, danach wird die Verbindung getrennt.
MaxSessions 4 (Standard) oder niedriger Maximale Anzahl gleichzeitiger Shell-/Befehls-Sitzungen pro Netzwerkverbindung.
LoginGraceTime 30 (Standard 120) Zeit in Sekunden, die für einen erfolgreichen Login bleibt, bevor die unauthentifizierte Verbindung getrennt wird.
ClientAliveInterval 300 Intervall in Sekunden, in dem der Server ein Keepalive-Signal an inaktive Clients sendet.
ClientAliveCountMax 2 Anzahl ausbleibender Keepalive-Antworten, bevor die Verbindung getrennt wird. Trennung nach etwa Interval × CountMax Sekunden Inaktivität.
AllowUsers / AllowGroups z. B. USERNAME Whitelist einzelner Benutzer bzw. Gruppen, die sich per SSH anmelden dürfen. Alle nicht gelisteten Konten werden abgelehnt.
DenyUsers / DenyGroups optional Blacklist bestimmter Benutzer/Gruppen. Wird vor Allow*-Direktiven ausgewertet.
X11Forwarding no Deaktiviert die Weiterleitung grafischer Anwendungen – auf Servern ohne GUI-Bedarf nicht erforderlich.
AllowTcpForwarding no oder local Schränkt SSH-Port-Forwarding/Tunneling ein, sofern es nicht benötigt wird.
UseDNS no Verzichtet auf Reverse-DNS-Lookups des Client beim Verbindungsaufbau und beschleunigt so den Login spürbar.
LogLevel VERBOSE Erweiterte Protokollierung inkl. Fingerprints fehlgeschlagener Logins – hilfreich für Diagnose und Tools wie Fail2ban.
Banner z. B. /etc/issue.net Zeigt vor dem Login einen Hinweistext an, etwa aus rechtlichen Gründen bei nicht-öffentlichen Systemen.
Reihenfolge zählt sshd verarbeitet Include-Dateien und die Hauptdatei der Reihe nach; die erste passende Direktive gewinnt bei den meisten Optionen. Änderungen in sshd_config.d/ daher immer mit sudo sshd -T gegenprüfen.

11. Public und Private Key per Fingerprint vergleichen

Aus einem privaten Schlüssel lässt sich der zugehörige Public Key ableiten – so lassen sich beide Dateien vergleichen, ohne den privaten Schlüssel offenzulegen.

Fingerprint des Public Keys
ssh-keygen -lf ~/.ssh/id_ed25519.pub
Fingerprint aus dem Private Key ableiten
ssh-keygen -y -f ~/.ssh/id_ed25519 | ssh-keygen -lf -

Für RSA entsprechend:

RSA-Beispiel
ssh-keygen -lf ~/.ssh/id_rsa.pub
RSA-Beispiel
ssh-keygen -y -f ~/.ssh/id_rsa | ssh-keygen -lf -
Erwartetes Ergebnis Algorithmus, Schlüssellänge und SHA256-Fingerprint müssen übereinstimmen. Der Kommentar am Zeilenende darf unterschiedlich sein.

Fingerprint eines Eintrags in authorized_keys prüfen

Alle hinterlegten Schlüssel anzeigen
ssh-keygen -lf ~/.ssh/authorized_keys

12. Häufige Fehler und Diagnose

Dateirechte prüfen

Serverseitige Rechte
namei -l /home/USERNAME/.ssh/authorized_keys
Serverseitige Rechte
sudo chmod 700 /home/USERNAME/.ssh
Serverseitige Rechte
sudo chmod 600 /home/USERNAME/.ssh/authorized_keys
Serverseitige Rechte
sudo chown -R USERNAME:USERNAME /home/USERNAME/.ssh

SSH-Protokoll ansehen

Ubuntu / Debian mit systemd
sudo journalctl -u ssh -n 100 --no-pager
Ubuntu / Debian mit systemd
sudo journalctl -u ssh -f

Port und Dienst prüfen

Lauschenden SSH-Port anzeigen
sudo ss -tulpn | grep ssh
Lauschenden SSH-Port anzeigen
sudo systemctl status ssh --no-pager

Host-Key-Warnung nach Neuinstallation

Wurde der VPS neu installiert und behält dieselbe IP-Adresse, kann der lokal gespeicherte Host-Key veraltet sein. Den Eintrag nur nach bewusster Prüfung entfernen:

Alten bekannten Host-Key entfernen
ssh-keygen -R SERVER-IP

Serverseitige Host-Key-Fingerprints anzeigen:

Über die VNC-Konsole ausführen
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
Über die VNC-Konsole ausführen
sudo ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
Firewall nicht vergessen Wird eine Firewall aktiviert, muss der SSH-Port vorher erlaubt sein. Bei UFW: sudo ufw allow OpenSSH und erst danach sudo ufw enable.

13. Abschluss-Checkliste

  • Systempakete aktualisiert
  • Normaler Benutzer mit sudo angelegt
  • Public-Key-Login getestet
  • Privater Schlüssel sicher gespeichert
  • PasswordAuthentication no
  • PermitRootLogin no
  • sshd -t ohne Fehler
  • VNC-Notfallzugang bekannt
  • SSH-Port in Firewall freigegeben
  • Backup der ursprünglichen Konfiguration vorhanden
Zusätzliche Härtung Regelmäßige Updates, eine Firewall, Fail2ban (oder vergleichbar) und ein externes Backup ergänzen die SSH-Konfiguration sinnvoll. Ein geänderter SSH-Port reduziert vor allem Log-Rauschen, ersetzt aber keine echte Authentifizierungs- oder Firewall-Sicherheit.
↑ Nach oben