SSH Setup
Vom ersten Zugriff über die Browser-VNC-Konsole bis zum abgesicherten SSH-Login ausschließlich per Public Key.
1. Vorbereitung und Grundprinzip
Empfohlener Ablauf:
- Über die STRATO-VNC-Konsole auf den Server zugreifen.
- Temporär den SSH-Login per Benutzername und Passwort erlauben.
- Einen normalen Benutzer mit
sudo-Rechten anlegen. - SSH-Schlüssel erzeugen und den Public Key in
authorized_keyshinterlegen. - Den Public-Key-Login in einer zweiten Sitzung testen.
- Passwort- und Root-Login deaktivieren.
sudo apt update
sudo apt full-upgrade -y
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.
vim zu kennen (siehe Abschnitt 3).
Die aktuelle SSH-Konfiguration vor Änderungen sichern:
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,aoderoaus dem Normalmodus gestartet, hier wird wie gewohnt Text getippt. - Kommandozeilenmodus – über
:aus dem Normalmodus erreichbar, für Speichern, Suchen/Ersetzen und Beenden.
| Taste / Befehl | Modus | Wirkung |
|---|---|---|
i | Normal → Insert | Einfügen vor der Cursorposition |
a | Normal → Insert | Einfügen nach der Cursorposition |
o | Normal → Insert | Neue Zeile unterhalb öffnen und einfügen |
Esc | → Normal | Zurück in den Normalmodus (immer zuerst drücken) |
:w | Kommandozeile | Speichern, Datei bleibt geöffnet |
:wq oder ZZ | Kommandozeile / Normal | Speichern und beenden |
:q! | Kommandozeile | Beenden ohne zu speichern (Änderungen verwerfen) |
dd | Normal | Aktuelle Zeile löschen (und in die Zwischenablage legen) |
yy / p | Normal | Zeile kopieren / danach einfügen |
u / Strg+r | Normal | Rückgängig / Wiederherstellen |
/suchbegriff | Normal | Vorwärts suchen, mit n/N zum nächsten/vorherigen Treffer |
gg / G | Normal | Zum Dateianfang / -ende springen |
:set number | Kommandozeile | Zeilennummern einblenden (hilfreich bei Diagnosen) |
:%s/alt/neu/g | Kommandozeile | Alle Vorkommen von „alt“ in der ganzen Datei durch „neu“ ersetzen |
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 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:
sudo nano /etc/ssh/sshd_config
# oder:
sudo vim /etc/ssh/sshd_config
Für die Übergangsphase sollten mindestens diese Werte gelten:
PasswordAuthentication yes
PubkeyAuthentication yes
PermitRootLogin no
KbdInteractiveAuthentication no
UsePAM yes
Was diese und weitere Direktiven bedeuten: siehe sshd_config-Referenz.
/etc/ssh/sshd_config.d/*.conf können Werte aus
der Hauptdatei überschreiben. Prüfe deshalb immer die tatsächlich wirksame Konfiguration.
sudo grep -RniE '^(PasswordAuthentication|PubkeyAuthentication|PermitRootLogin|KbdInteractiveAuthentication)' /etc/ssh/sshd_config /etc/ssh/sshd_config.d/ 2>/dev/null
sudo sshd -T | grep -E 'passwordauthentication|pubkeyauthentication|permitrootlogin|kbdinteractiveauthentication'
Vor dem Neustart immer die Syntax testen:
sudo sshd -t
sudo systemctl reload ssh
# Falls reload nicht funktioniert:
sudo systemctl restart ssh
5. Normalen Benutzer anlegen
sudo adduser USERNAME
sudo usermod -aG sudo 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
ssh-keygen -t ed25519 -a 100 -C "USERNAME@strato-vps"
Falls RSA zwingend erforderlich ist, mindestens 3072 Bit verwenden:
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:
| Kriterium | ed25519 | RSA |
|---|---|---|
| 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 |
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
sudo -iu USERNAME
mkdir -p ~/.ssh
chmod 700 ~/.ssh
ssh-keygen -t ed25519 -a 100 -f ~/.ssh/id_ed25519
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.
8. Public-Key-Login testen
Den Test in einem neuen Terminal durchführen:
ssh -i ~/.ssh/id_ed25519 USERNAME@SERVER-IP
Für eine ausführliche Fehlerausgabe:
ssh -vvv -i ~/.ssh/id_ed25519 USERNAME@SERVER-IP
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:
PubkeyAuthentication yes
PasswordAuthentication no
KbdInteractiveAuthentication no
PermitRootLogin no
PermitEmptyPasswords no
MaxAuthTries 3
X11Forwarding no
Optional kann der SSH-Zugriff auf bestimmte Benutzer begrenzt werden:
AllowUsers USERNAME
Danach erneut prüfen und neu laden:
sudo sshd -t
sudo sshd -T | grep -E 'passwordauthentication|pubkeyauthentication|permitrootlogin|kbdinteractiveauthentication'
sudo systemctl reload ssh
sudo systemctl status ssh --no-pager
/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.
| Direktive | Empfehlung | Bedeutung |
|---|---|---|
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. |
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.
ssh-keygen -lf ~/.ssh/id_ed25519.pub
ssh-keygen -y -f ~/.ssh/id_ed25519 | ssh-keygen -lf -
Für RSA entsprechend:
ssh-keygen -lf ~/.ssh/id_rsa.pub
ssh-keygen -y -f ~/.ssh/id_rsa | ssh-keygen -lf -
Fingerprint eines Eintrags in authorized_keys prüfen
ssh-keygen -lf ~/.ssh/authorized_keys
12. Häufige Fehler und Diagnose
Dateirechte prüfen
namei -l /home/USERNAME/.ssh/authorized_keys
sudo chmod 700 /home/USERNAME/.ssh
sudo chmod 600 /home/USERNAME/.ssh/authorized_keys
sudo chown -R USERNAME:USERNAME /home/USERNAME/.ssh
SSH-Protokoll ansehen
sudo journalctl -u ssh -n 100 --no-pager
sudo journalctl -u ssh -f
Port und Dienst prüfen
sudo ss -tulpn | grep ssh
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:
ssh-keygen -R SERVER-IP
Serverseitige Host-Key-Fingerprints anzeigen:
sudo ssh-keygen -lf /etc/ssh/ssh_host_ed25519_key.pub
sudo ssh-keygen -lf /etc/ssh/ssh_host_rsa_key.pub
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 noPermitRootLogin nosshd -tohne Fehler- VNC-Notfallzugang bekannt
- SSH-Port in Firewall freigegeben
- Backup der ursprünglichen Konfiguration vorhanden