Sicher auf entfernte Rechner — SSH von Anfang an
Vom ersten Login mit Passwort über Schlüssel, ~/.ssh/config und Dateitransfer bis zu Tunneln, Sprungservern und dem gehärteten Server. Dein Fortschritt wird lokal gespeichert.
Worum geht's?
SSH („Secure Shell") ist die sichere Standard-Art, einen entfernten Rechner über die Kommandozeile zu bedienen — alles läuft verschlüsselt. Damit steuerst du Server fern, überträgst Dateien, tunnelst Verbindungen und sicherst deinen Git-Zugang.
Diese Schulung führt dich von null: erste Verbindung mit Passwort → Schlüssel statt Passwort → ~/.ssh/config → Dateien übertragen → Tunnel & Sprungserver → bis zum gehärteten Server.
Selbstlern-Kurs zum Durchklicken — dein Fortschritt wird lokal gespeichert.
? Für wen ist SSH wichtig?
Überall dort, wo du einen Rechner fernbedienen, absichern oder warten musst.
🗺️ Die 9 Stufen
Was ist SSH?
Das mentale Modell, wofür Du SSH brauchst und wie Du sofort loslegen kannst.
1 Das mentale Modell
SSH steht für Secure Shell: eine verschlüsselte Verbindung zwischen Deinem Rechner (Client) und einem entfernten Rechner (Server).
sshd) lauscht auf dem Server (Port 22), der SSH-Client auf Deinem Rechner baut die Verbindung auf.2 Wofür Du SSH brauchst
scp, sftp und rsync nutzen alle den SSH-Kanal.3 Wo läuft der SSH-Client?
ssh ist seit Windows 10 (Version 1809) vorinstalliert. Kein Extra-Download nötig.ssh-Befehl ist vorinstalliert.ssh ist mit dem Paket openssh-client vorinstalliert (bei den meisten Distributionen ab Werk).ssh -V zeigt Dir die installierte OpenSSH-Version.4 Einen Übungs-Server bekommen
- VPS (empfohlen): VPS bei Hostinger — ab wenigen Euro/Monat, in Minuten bereit.
- Raspberry Pi oder Heimserver: jeder Linux-Rechner im Netzwerk tut es.
- Lokale VM: VirtualBox oder WSL (Windows) für erste Versuche.
✓ Geschafft, wenn Du …
Versionsstand: OpenSSH 9.x · Stand Juni 2026
Die erste Verbindung
Einloggen, den Host-Key verstehen und typische Fehlerbilder kennen.
1 Verbinden
Der grundlegende SSH-Befehl ist denkbar einfach:
# Standard: Benutzername @ Hostname oder IP ssh user@203.0.113.10 # Anderen Port angeben (Standard ist 22) ssh -p 2222 user@203.0.113.10 # Abmelden: exit oder Strg-D exit
2 Der Host-Key — TOFU
Beim allerersten Verbindungsaufbau fragt SSH nach Deiner Bestätigung:
yes speichert SSH den Fingerprint des Servers in ~/.ssh/known_hosts. Bei jedem weiteren Login wird geprüft, ob der Fingerprint noch stimmt — so erkennst Du Man-in-the-Middle-Angriffe.3 Typische Fehlerbilder
-
Connection refused
Der SSH-Daemon (sshd) läuft nicht, oder Du verwendest den falschen Port, oder eine Firewall blockiert die Verbindung. -
Permission denied (publickey,password)
Falscher Benutzername, falsches Passwort oder Dein SSH-Key ist auf dem Server nicht eingetragen. -
WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!
Der Fingerprint weicht von dem in~/.ssh/known_hostsgespeicherten ab. Nach einer bewussten Server-Neuinstallation ist das normal — dann den alten Eintrag entfernen:!Alten Host-Key entfernenssh-keygen -R 203.0.113.10Achtung: Diesen Befehl nur ausführen, wenn Du sicher bist, dass der Server sich legitim geändert hat (z. B. neu aufgesetzt). Bei Zweifeln erst beim Hoster verifizieren.
✓ Geschafft, wenn Du …
Versionsstand: OpenSSH 9.x · Stand Juni 2026
Schlüssel statt Passwort
SSH-Schlüsselpaar erzeugen, übertragen und mit dem ssh-agent komfortabel nutzen.
1 Das Prinzip: Schloss und Schlüssel
2 Schlüsselpaar erzeugen
ssh-keygen -t ed25519 -C "max@laptop" # Ergebnis in ~/.ssh/: # id_ed25519 ← privater Key (NIEMALS weitergeben) # id_ed25519.pub ← öffentlicher Key (landet auf dem Server)
-C) hilft Dir, später zu erkennen, von welchem Gerät der Key stammt. Ed25519 ist modern und empfohlen — kompakter und sicherer als das ältere RSA.id_ed25519 (ohne .pub) ist Dein privater Schlüssel. Er verlässt Deinen Rechner nicht — nicht per Mail, nicht per Paste, nicht auf GitHub.3 Public Key auf den Server übertragen
# Einzeiliger Befehl — erledigt alles automatisch ssh-copy-id user@203.0.113.10
~/.ssh/authorized_keys auf dem Server an und setzt die richtigen Berechtigungen.ssh-copy-id fehlt manchmal. Alternative: Den Inhalt von ~/.ssh/id_ed25519.pub kopieren und auf dem Server manuell in ~/.ssh/authorized_keys einfügen:
# Auf dem Server ausführen (nach Passwort-Login): mkdir -p ~/.ssh echo "<Inhalt von id_ed25519.pub hier>" >> ~/.ssh/authorized_keys chmod 600 ~/.ssh/authorized_keys
4 Passphrase & ssh-agent
ssh-keygen eine Passphrase. Sie schützt den privaten Key, falls Dein Gerät in falsche Hände gerät. Der ssh-agent merkt sich die Passphrase für die aktuelle Sitzung — Du gibst sie nur einmal ein.eval "$(ssh-agent -s)" ssh-add ~/.ssh/id_ed25519 # Passphrase einmalig eingeben
eval "$(ssh-agent -s)" ssh-add --apple-use-keychain ~/.ssh/id_ed25519
--apple-use-keychain speichert die Passphrase zusätzlich im macOS-Schlüsselbund — nach jedem Neustart automatisch verfügbar.# Dienst einmalig auf automatischen Start setzen: Set-Service -Name ssh-agent -StartupType Automatic Start-Service ssh-agent # Key hinzufügen (normale PowerShell): ssh-add $env:USERPROFILE\.ssh\id_ed25519
✓ Geschafft, wenn Du …
Versionsstand: OpenSSH 9.x · Stand Juni 2026
~/.ssh/config
Host-Aliasse mit gespeicherten Einstellungen — kurze Befehle statt langer Optionslisten.
1 Wozu eine Config-Datei?
ssh -p 2222 -i ~/.ssh/id_ed25519 max@203.0.113.10Mit Config:
ssh meinserverDie Datei
~/.ssh/config speichert alle Verbindungsparameter pro Host als benannten Alias. scp, sftp und rsync nutzen dieselben Aliasse automatisch.2 Ein einfacher Host-Eintrag
Host meinserver HostName 203.0.113.10 User max Port 22 IdentityFile ~/.ssh/id_ed25519
ssh meinserver — alle Parameter werden aus der Config gelesen. Der Alias funktioniert auch für scp meinserver:/pfad/datei . und rsync.3 Mehrere Server & gemeinsame Defaults
# Zweiter Server Host staging HostName 203.0.113.20 User deploy IdentityFile ~/.ssh/id_deploy # Gemeinsame Defaults für alle Hosts (muss am Ende stehen) Host * ServerAliveInterval 60 ServerAliveCountMax 3 AddKeysToAgent yes
ServerAliveInterval 60 hält die Verbindung aktiv — verhindert Timeouts bei längerem Nichtstun. AddKeysToAgent yes lädt Keys automatisch in den ssh-agent.4 Berechtigungen nicht vergessen
chmod 600 ~/.ssh/configchmod 600 ~/.ssh/config✓ Geschafft, wenn Du …
Versionsstand: OpenSSH 9.x · Stand Juni 2026
Dateien übertragen
scp für schnelle Einzeldateien, sftp zum interaktiven Stöbern und rsync fürs wiederholte Deployen.
1 scp — schnelle Dateiübertragung
scp (Secure Copy) kopiert Dateien über SSH — die Syntax ist wie cp, aber mit Remote-Pfaden.
# Datei hochladen (lokal → Server) scp datei.txt meinserver:/home/max/ # Datei herunterladen (Server → lokal) scp meinserver:/home/max/datei.txt . # Ganzen Ordner hochladen (rekursiv mit -r) scp -r mein-ordner/ meinserver:/home/max/
alias:/absoluter/pfad. Der Punkt . als Ziel = aktueller lokaler Ordner. Mit Config-Alias entfällt die lange IP+Optionsliste.2 sftp — interaktiv stöbern
sftp öffnet eine interaktive FTP-ähnliche Sitzung über den SSH-Kanal.
ls / pwd / cd (Server-Seite) · lls / lpwd / lcd (lokal) · put (hochladen) · get (herunterladen) · bye (beenden).3 rsync — Ordner synchronisieren
rsync überträgt nur geänderte Dateien — ideal für wiederholtes Deployen.
# Ordner hochladen (nur Geändertes, verbose, komprimiert) rsync -avz mein-ordner/ meinserver:/var/www/html/ # Mit --delete: Zieldateien entfernen, die in der Quelle fehlen rsync -avz --delete mein-ordner/ meinserver:/var/www/html/
-a = Archiv-Modus (erhält Rechte/Timestamps) · -v = verbose · -z = komprimiert übertragen. Tipp: rsync nutzt automatisch Deinen SSH-Key aus ~/.ssh/config.--delete: Dateien, die im Quell-Ordner fehlen, werden auf dem Zielserver gelöscht. Erst ohne --delete testen — dann einsetzen, wenn Du sicher bist, dass Quelle und Ziel identisch sein sollen.4 Wann was?
- Einzelne Dateien schnell hoch-/runterladen
- Einfachste Syntax, kein extra Befehlssatz
- Kein Fortsetzen nach Abbruch
- Verzeichnis interaktiv durchsuchen
- Mehrere Dateien in einer Sitzung
- Komfortabel zum Erkunden unbekannter Server
✓ Geschafft, wenn Du …
Versionsstand: OpenSSH 9.x · Stand Juni 2026
Tunnel & Port-Forwarding
Ports durch den verschlüsselten SSH-Kanal leiten — Datenbanken, Web-UIs und Proxys sicher erreichbar machen.
1 Mentales Modell
Ein SSH-Tunnel verbindet einen Port auf einer Seite durch den verschlüsselten Kanal mit einem Port auf der anderen.
2 Lokal -L — Serverdienst lokal erreichbar machen
Du öffnest einen Port auf deinem Rechner, der auf einen Port des Servers tunnelt.
# Lokaler Port 8080 → Port 80 auf dem Server ssh -L 8080:localhost:80 meinserver # Use-Case: Remote-Datenbank lokal in der DB-GUI benutzen # (PostgreSQL nur auf Server-localhost gebunden) ssh -L 5432:localhost:5432 meinserver
-L LOKALER_PORT:ZIEL_HOST:ZIEL_PORT. Danach kannst du localhost:5432 auf deinem Rechner ansprechen — die Verbindung läuft verschlüsselt über SSH.3 Remote -R — Lokalen Dienst vom Server aus erreichbar machen
Umgekehrt: Du öffnest einen Port auf dem Server, der zu einem lokal laufenden Dienst tunnelt.
# Server-Port 9000 → lokaler Port 3000 (lokal laufende App) ssh -R 9000:localhost:3000 meinserver
-R SERVER_PORT:ZIEL_HOST:ZIEL_PORT. Nützlich zum Testen: Webhook-Dienste oder lokale Web-Apps vom Server aus erreichbar machen.4 Dynamisch -D — SOCKS-Proxy
Statt eines einzelnen Ports richtest du einen lokalen SOCKS-Proxy ein — z. B. um den Browser über den Server zu tunneln.
# Lokaler SOCKS5-Proxy auf Port 1080 ssh -D 1080 meinserver
SOCKS5 · localhost · 1080. Danach läuft der Browser-Traffic verschlüsselt über den Server. Praktisch für geografisch eingeschränkte Dienste oder sichere Verbindungen aus fremden Netzwerken.5 Tunnel im Hintergrund
-N öffnet keinen Shell-Befehl, nur den Tunnel. -f schickt den Prozess in den Hintergrund. Zusammen: dauerhafter Hintergrund-Tunnel ohne offenes Terminal-Fenster.# Tunnel im Hintergrund starten (kein Shell, kein offenes Fenster) ssh -fNL 8080:localhost:80 meinserver # Tunnel beenden: PID finden und killen pkill -f "ssh -fNL 8080"
✓ Geschafft, wenn du …
Versionsstand: OpenSSH 9.x · Stand Juni 2026
Sprungserver & Profi-Tricks
Über Zwischensysteme springen, den SSH-Agent weiterreichen und Verbindungen wiederverwenden.
1 ProxyJump — über einen Sprungserver
Wenn ein Zielrechner nicht direkt erreichbar ist, verbindest du dich über einen Sprungserver (Bastion Host) dazwischen.
# Eine Verbindung: lokal → jumphost → ziel ssh -J jumphost user@ziel
Host ziel HostName 10.0.0.5 User max ProxyJump jumphost
ssh ziel — SSH springt automatisch über jumphost. Mehrere Hops möglich: ProxyJump hop1,hop2.2 Agent-Forwarding
Der SSH-Agent auf deinem Rechner hält deinen entschlüsselten Schlüssel. Mit Forwarding kannst du ihn auf dem Sprungserver nutzen — ohne dort eine Kopie des privaten Schlüssels abzulegen.
# Einmalig mit -A ssh -A meinserver # Dauerhaft in ~/.ssh/config Host meinserver ForwardAgent yes
ForwardAgent yes für alle Hosts setzen.3 Multiplexing — schnellere Folge-Verbindungen
SSH kann mehrere Verbindungen über einen einzelnen Kanal laufen lassen. Folge-Verbindungen zu demselben Host öffnen sofort — ohne erneuten Handshake.
Host * ControlMaster auto ControlPath ~/.ssh/cm-%r@%h:%p ControlPersist 10m
ControlMaster auto: erste Verbindung öffnet den Master-Socket. Folge-Verbindungen nutzen ihn. ControlPersist 10m: Socket bleibt 10 Minuten nach dem letzten Close offen — perfekt für häufige rsync/scp-Aufrufe im Deployment.✓ Geschafft, wenn du …
Versionsstand: OpenSSH 9.x · Stand Juni 2026
SSH für Git
Schlüssel bei GitHub, GitLab & Co. hinterlegen, mehrere Konten verwalten und Deploy-Keys sicher einsetzen.
1 Öffentlichen Schlüssel hinterlegen
Einmal eingerichtet, entfällt das Passwort bei jedem git push und git clone.
- Öffentlichen Schlüssel anzeigen:
cat ~/.ssh/id_ed25519.pub— gesamten Inhalt kopieren. - Bei GitHub: Settings → SSH and GPG keys → New SSH key. Titel vergeben, Inhalt einfügen, speichern.
- Bei GitLab: Preferences → SSH Keys → Add new key. Gleicher Ablauf.
- Bei Forgejo / Gitea: User Settings → SSH / GPG Keys → Add Key.
2 Verbindung testen
ssh -T git@github.com
3 Klonen via SSH
# SSH-URL (beginnt mit git@, nicht https://) git clone git@github.com:user/repo.git
git@. HTTPS-Klons fragen jedes Mal nach Token/Passwort. SSH nutzt deinen Schlüssel automatisch.4 Mehrere Keys / Konten
Du hast ein privates und ein Firmen-GitHub-Konto? Für jeden Account einen eigenen Schlüssel anlegen und per Config zuweisen.
# Privates GitHub-Konto Host github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github # Firmen-Account via Alias Host github-firma HostName github.com User git IdentityFile ~/.ssh/id_ed25519_github_firma
git@github-firma:firma/repo.git verwenden — SSH wählt automatisch den richtigen Schlüssel.5 Deploy-Keys
✓ Geschafft, wenn du …
Versionsstand: OpenSSH 9.x · Stand Juni 2026
Server härten
Passwort-Auth abschalten, fail2ban aktivieren und die Firewall richtig einstellen — Schritt für Schritt, ohne sich auszusperren.
1 Zuerst: zweite Session offen lassen!
2 sshd_config anpassen
Die zentrale Konfigurationsdatei des SSH-Servers. Editiere sie mit Root-Rechten.
# Root-Login verbieten PermitRootLogin no # Public-Key-Auth sicherstellen PubkeyAuthentication yes # Passwort-Auth deaktivieren — NUR nachdem Key-Login funktioniert! PasswordAuthentication no
sudo systemctl reload ssh # Auf anderen Systemen (CentOS, RHEL, Fedora): sudo systemctl reload sshd
3 fail2ban — Schutz vor Brute-Force
fail2ban überwacht Log-Dateien und sperrt IPs automatisch, die zu viele fehlgeschlagene Login-Versuche machen.
sudo apt install fail2ban
sshd) ist nach der Installation standardmäßig aktiv — keine weitere Konfiguration nötig für den Basis-Schutz. Status prüfen: sudo fail2ban-client status sshd.4 Port ändern — pro und contra
~/.ssh/config den neuen Port eintragen (Port 2222).Port 2222
5 Firewall einrichten (ufw)
# SSH erlauben (Standard-Port 22) sudo ufw allow 22/tcp # Oder bei geändertem Port: sudo ufw allow 2222/tcp # Weitere Dienste nach Bedarf sudo ufw allow 80/tcp sudo ufw allow 443/tcp # Firewall aktivieren sudo ufw enable # Status prüfen sudo ufw status verbose
ufw enable — sonst sperrst du dich sofort aus.6 Härtungs-Checkliste
✓ Alles erledigt, wenn …
Versionsstand: OpenSSH-Server / sshd · Stand Juni 2026
SSH Cheat-Sheet
Die wichtigsten SSH-Befehle auf einen Blick. (Zählt nicht für den Fortschritt.)
▶ Verbinden
# Standard-Login ssh user@host # Bestimmter Port ssh -p 2222 user@host # Mit explizitem Key ssh -i ~/.ssh/id_ed25519 user@host
🔑 Keys
# Ed25519-Schlüsselpaar erzeugen (empfohlen) ssh-keygen -t ed25519 -C "kommentar" # Öffentlichen Schlüssel auf Server übertragen ssh-copy-id user@host # Öffentlichen Schlüssel anzeigen (für GitHub/GitLab) cat ~/.ssh/id_ed25519.pub
⚙ Config-Snippet
Host meinserver HostName 203.0.113.10 User user IdentityFile ~/.ssh/id_ed25519 Port 22
📂 Dateitransfer
# Datei hochladen (scp) scp datei.txt user@host:/ziel/ # Datei herunterladen (scp) scp user@host:/pfad/datei.txt . # Ordner synchronisieren (rsync) rsync -avz ordner/ user@host:/ziel/
🔀 Tunnel
# Lokal: Server-Port 80 als localhost:8080 erreichbar ssh -L 8080:localhost:80 meinserver # Remote: lokaler Port 3000 auf Server-Port 9000 legen ssh -R 9000:localhost:3000 meinserver # Dynamisch: lokaler SOCKS-Proxy auf Port 1080 ssh -D 1080 meinserver # Hintergrund-Tunnel (kein Shell, bleibt offen) ssh -fNL 8080:localhost:80 meinserver
🏃 Sprung & Git
# Über Sprungserver verbinden ssh -J jumphost user@ziel # SSH-Verbindung zu GitHub testen ssh -T git@github.com # Veralteten Host-Key entfernen (nach Server-Neuinstallation) ssh-keygen -R host
Quiz
7 Fragen quer durch die SSH-Stufen. Ab 6 richtigen Antworten schaltest du dein Zertifikat frei.
Dein Zertifikat
Glückwunsch! Trage deinen Namen ein und drucke das Zertifikat (oder speichere als PDF).