SSH & Keys – Vollständiger Guide
1. SSH-Key erstellen
Section titled “1. SSH-Key erstellen”🔐 Empfohlener Key-Typ: ed25519
Section titled “🔐 Empfohlener Key-Typ: ed25519”Warum?
- ✅ Moderner, sicherer als RSA
- ✅ Kleiner (nur ~68 Zeichen Public Key vs. 544 bei RSA)
- ✅ Schneller
Schritt 1: Key generieren
Ausgabe:
Generating public/private ed25519 key pair.Enter file in which to save the key (/home/user/.ssh/id_ed25519):→ Enter drücken (Standard-Pfad nutzen)
Schritt 2: Passphrase setzen (WICHTIG!)
Enter passphrase (empty for no passphrase):→ Sicheres Passwort eingeben (mind. 12 Zeichen)
Schritt 3: Key-Dateien checken
ls -l ~/.ssh/Du solltest sehen:
id_ed25519→ Private Key (GEHEIM! Nie teilen!)id_ed25519.pub→ Public Key (kannst du überall hinzufügen)
📋 Public Key anzeigen
Section titled “📋 Public Key anzeigen”cat ~/.ssh/id_ed25519.pubAusgabe:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGq... [email protected]→ Diesen Key kopierst du zu GitHub/GitLab/Servern!
2. SSH-Config einrichten
Section titled “2. SSH-Config einrichten”Die ~/.ssh/config macht dein Leben einfacher: Shortcuts statt IP-Adressen!
📝 Basis-Config
Section titled “📝 Basis-Config”# ~/.ssh/config erstellen/bearbeitenvim ~/.ssh/configBeispiel:
# K.I.T. Main ServerHost gideon HostName 10.0.10.2 User joshua IdentityFile ~/.ssh/id_ed25519 Port 22 ServerAliveInterval 60 ServerAliveCountMax 3
# GitHubHost github.com HostName github.com User git IdentityFile ~/.ssh/id_ed25519 AddKeysToAgent yes
# Catch-All für K.I.T.-ServerHost 10.0.10.* User joshua IdentityFile ~/.ssh/id_ed25519 StrictHostKeyChecking no UserKnownHostsFile=/dev/nullJetzt kannst du einfach schreiben:
🎯 Nützliche Config-Optionen
Section titled “🎯 Nützliche Config-Optionen”| Option | Zweck | Beispiel |
|---|---|---|
HostName | Echte IP/Domain | 10.0.10.2 |
User | Username auf Remote-Host | joshua |
Port | SSH-Port (Standard: 22) | 2222 |
IdentityFile | Welcher Private Key? | ~/.ssh/id_work |
ServerAliveInterval | Keep-Alive (Verbindung stirbt nicht) | 60 |
AddKeysToAgent | Key automatisch zu Agent hinzufügen | yes |
ForwardAgent | SSH-Agent forwarden (für Multi-Hop) | yes |
ProxyJump | Über anderen Host springen (Bastion) | bastion |
LocalForward | Port-Forwarding (lokal → remote) | 8080 localhost:80 |
🪜 ProxyJump (für Bastion Hosts)
Section titled “🪜 ProxyJump (für Bastion Hosts)”Wenn du über einen Jump-Host musst:
Host bastion HostName bastion.kit-it-koblenz.de User jumpuser IdentityFile ~/.ssh/id_bastion
Host internal-server HostName 192.168.1.100 User admin ProxyJump bastion IdentityFile ~/.ssh/id_ed25519Jetzt: ssh internal-server → Springt automatisch über Bastion! 🎯
3. SSH-Agent nutzen
Section titled “3. SSH-Agent nutzen”Der SSH-Agent speichert deine entschlüsselte Keys im RAM → Passphrase nur 1x eingeben!
🚀 Agent starten & Key hinzufügen
Section titled “🚀 Agent starten & Key hinzufügen”# Agent starten (falls noch nicht läuft)eval "$(ssh-agent -s)"
# Key hinzufügenssh-add ~/.ssh/id_ed25519Ausgabe:
Enter passphrase for /home/user/.ssh/id_ed25519:Identity added: /home/user/.ssh/id_ed25519 ([email protected])→ Ab jetzt: Kein Passwort mehr bis zum Neustart!
🔍 Agent-Status checken
Section titled “🔍 Agent-Status checken”# Geladene Keys anzeigenssh-add -l
# Alle Keys aus Agent entfernenssh-add -D⚙️ Agent automatisch starten (Bash/Zsh)
Section titled “⚙️ Agent automatisch starten (Bash/Zsh)”Füge das zu ~/.bashrc oder ~/.zshrc hinzu:
# SSH-Agent Auto-Startif [ -z "$SSH_AUTH_SOCK" ]; then eval "$(ssh-agent -s)" > /dev/null ssh-add ~/.ssh/id_ed25519 2>/dev/nullfi→ Agent startet beim Terminal-Öffnen automatisch!
4. Authorized Keys (Server-Seite)
Section titled “4. Authorized Keys (Server-Seite)”So erlaubst du SSH-Zugriff für bestimmte Public Keys auf deinem Server.
📂 Public Key auf Server hinzufügen
Section titled “📂 Public Key auf Server hinzufügen”Schritt 1: Public Key vom Client kopieren
cat ~/.ssh/id_ed25519.pub# → Kopiere die AusgabeSchritt 2: Auf Server - Authorized Keys bearbeiten
# Auf Server einloggen (noch mit Passwort oder anderem Key)ssh user@server
# Authorized Keys öffnenmkdir -p ~/.sshchmod 700 ~/.sshvim ~/.ssh/authorized_keysSchritt 3: Public Key einfügen
→ Eine Zeile pro Key:
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGq... user1@laptopssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIDh... user2@desktopSchritt 4: Permissions setzen (WICHTIG!)
chmod 600 ~/.ssh/authorized_keysFalls Permissions falsch sind, wird SSH den Key ignorieren! 🚨
🎯 Quick-Method: ssh-copy-id
Section titled “🎯 Quick-Method: ssh-copy-id”Wenn du schon SSH-Zugriff hast (mit Passwort oder anderem Key):
ssh-copy-id -i ~/.ssh/id_ed25519.pub user@server→ Fügt Public Key automatisch zu authorized_keys hinzu! ✨
5. Port-Forwarding (Tunnel)
Section titled “5. Port-Forwarding (Tunnel)”🔀 Local Port Forwarding
Section titled “🔀 Local Port Forwarding”Use-Case: Server hat Webinterface auf Port 80, aber nur für localhost → Tunnel zu deinem PC!
ssh -L 8080:localhost:80 user@server→ Jetzt: http://localhost:8080 in deinem Browser zeigt den Remote-Server!
Erklärung:
-L= Local Forward8080= Dein lokaler Portlocalhost:80= Ziel auf dem Remote-Server
🔁 Remote Port Forwarding
Section titled “🔁 Remote Port Forwarding”Use-Case: Du entwickelst lokal (Port 3000), willst aber Remote-Kollegen Zugriff geben.
ssh -R 8080:localhost:3000 user@server→ Kollegen können jetzt http://server:8080 aufrufen → Landet bei dir auf Port 3000!
🌐 SOCKS-Proxy (Dynamic Port Forwarding)
Section titled “🌐 SOCKS-Proxy (Dynamic Port Forwarding)”Use-Case: Gesamten Traffic durch SSH-Tunnel leiten (VPN-like).
ssh -D 9050 user@server→ Browser-Proxy auf localhost:9050 setzen → Alle Requests laufen über Server!
6. Troubleshooting
Section titled “6. Troubleshooting”🐛 Problem: „Permission denied (publickey)”
Section titled “🐛 Problem: „Permission denied (publickey)””Ursachen & Fixes:
# 1) Key nicht im SSH-Agent?ssh-add ~/.ssh/id_ed25519ssh-add -l # Check ob Key geladen ist
# 2) Falscher Key in Config?ssh -i ~/.ssh/id_ed25519 user@host # Key explizit angeben
# 3) Public Key auf Server nicht richtig?# → Server-Login (mit Passwort/anderem Key) → Check:cat ~/.ssh/authorized_keys # Ist dein Key drin?ls -la ~/.ssh/ # Permissions korrekt?# authorized_keys muss 600 sein, .ssh muss 700 sein!
# 4) GitHub/GitLab: Key hinterlegt?# Sollte sagen: "Hi <username>! You've successfully authenticated..."🐛 Problem: „Connection timed out” / „No route to host”
Section titled “🐛 Problem: „Connection timed out” / „No route to host””# 1) Host erreichbar?ping <host>
# 2) Port 22 offen?telnet <host> 22nc -zv <host> 22
# 3) Firewall blockiert?# → Server-Admin fragen, Port freischalten
# 4) VPN notwendig?# → Manche Hosts nur über VPN erreichbar🐛 Problem: „Host key verification failed”
Section titled “🐛 Problem: „Host key verification failed””Tritt auf wenn: Server-Key hat sich geändert (Neuinstallation, Security-Warnung!)
# Alten Key entfernenssh-keygen -R <hostname>
# Oder: Known Hosts komplett löschen (VORSICHT!)rm ~/.ssh/known_hostsSecurity-Check: Wenn du den Grund nicht kennst → Admin fragen (könnte MITM-Attack sein!)
🐛 Problem: „Too many authentication failures”
Section titled “🐛 Problem: „Too many authentication failures””Ursache: SSH-Agent hat zu viele Keys geladen, Server blockt nach 5 Versuchen.
Fix:
# Nur bestimmten Key nutzenssh -o IdentitiesOnly=yes -i ~/.ssh/id_ed25519 user@host
# Oder: In ~/.ssh/config hinzufügen:Host * IdentitiesOnly yes7. Best Practices & Security
Section titled “7. Best Practices & Security”✅ Do’s
Section titled “✅ Do’s”- ✅ Ed25519 Keys nutzen (modern, sicher, schnell)
- ✅ Passphrase setzen (mind. 12 Zeichen)
- ✅ SSH-Agent nutzen (Komfort + Sicherheit)
- ✅ Config nutzen (
~/.ssh/configspart Zeit) - ✅ Keys regelmäßig rotieren (alle 1-2 Jahre neu generieren)
- ✅ Authorized Keys aufräumen (alte/ungenutzte Keys entfernen)
- ✅ Verschiedene Keys pro Kontext (Work, Personal, GitHub, etc.)
❌ Dont’s
Section titled “❌ Dont’s”- ❌ Private Keys NIEMALS teilen (auch nicht per Mail/Slack!)
- ❌ Keys ohne Passphrase (außer für Automation mit eingeschränkten Rechten)
- ❌ Private Keys in Git committen (passiert öfter als du denkst!)
- ❌ Root-Login über SSH erlauben (Server-Config:
PermitRootLogin no) - ❌ Passwort-Auth erlauben (Server-Config:
PasswordAuthentication no) - ❌ Alte RSA-Keys mit < 2048 Bit nutzen (unsicher!)
🛡️ Server-Security Hardening
Section titled “🛡️ Server-Security Hardening”Wenn du einen SSH-Server betreibst (/etc/ssh/sshd_config):
# Nur Key-Auth, kein PasswortPasswordAuthentication noPubkeyAuthentication yes
# Kein Root-LoginPermitRootLogin no
# Port ändern (Security by Obscurity)Port 2222
# Nur bestimmte User erlaubenAllowUsers joshua admin
# Idle-TimeoutClientAliveInterval 300ClientAliveCountMax 2
# Nach Änderungen: Service neustartensudo systemctl restart sshd8. Cheat Sheet
Section titled “8. Cheat Sheet”# Key generieren
# Agent starten & Key hinzufügeneval "$(ssh-agent -s)"ssh-add ~/.ssh/id_ed25519
# Public Key anzeigencat ~/.ssh/id_ed25519.pub
# Public Key zu Server kopierenssh-copy-id -i ~/.ssh/id_ed25519.pub user@server
# SSH mit bestimmtem Keyssh -i ~/.ssh/id_custom user@host
# Port-Forwardingssh -L 8080:localhost:80 user@server # Localssh -R 8080:localhost:3000 user@server # Remotessh -D 9050 user@server # SOCKS-Proxy
# Troubleshootingssh -v user@host # Verbose (debug)ssh -vvv user@host # Very verbosessh-keygen -R hostname # Known Host entfernen