SSH Agent & Forwarding: Safety First (Artikel 303)
Beherrschung des SSH-Agents zur effizienten Schlüsselverwaltung. Erfahren Sie alles über das Agent-Forwarding, die damit verbundenen Sicherheitsrisiken und wie Sie Keys sicher durch das Netzwerk tunneln.
# SSH Agent & Forwarding: Komfort ohne Sicherheitsverlust
TL;DR / Management Summary Wer viele Server mit passwortgeschützten SSH-Keys verwaltet, will nicht bei jeder Verbindung die Passphrase tippen. Der SSH-Agent speichert entschlüsselte Schlüssel sicher im Arbeitsspeicher. Ein Senior Admin nutzt zudem Agent Forwarding, um seine Identität über Jump-Hosts hinweg mitzunehmen. Aber Vorsicht: Agent Forwarding hat eine dunkle Seite – wer Root-Zugriff auf einen Zwischen-Host hat, kann Ihren Agenten missbrauchen. Wir lernen, wie man dies durch ProxyJump sicher umgeht.
# 1. Einführung & Architektur
Der Identitäts-Speicher.
Der ssh-agent ist ein Hintergrundprozess, der Schlüssel für die Dauer der Sitzung vorhält. Das SSH-Client-Programm fragt den Agenten nach der Signatur, anstatt den Private-Key von der Platte zu lesen.
# Der Forwarding-Flow (Mermaid)
graph LR
A[Local Machine: Agent with Key] -->|SSH -A| B[Jump Host / Bastion]
B -->|Forwarded Identity| C[Production Server]
subgraph "The Danger Zone"
B --- D[Attacker with Root on B]
D -.->|Can access Socket| A
end
# 2. Den SSH-Agent nutzen
Einmal tippen, oft nutzen.
# Agent starten und Key laden
# Startet den Agenten in der aktuellen Shell
eval $(ssh-agent)
# Key hinzufügen (fragt nach Passphrase)
ssh-add ~/.ssh/id_ed25519
# Status prüfen
ssh-add -l
# Automatisch beim Login (Zsh/Bash)
Fügen Sie Plugins wie ssh-agent (in Oh-My-Zsh) hinzu oder nutzen Sie keychain, um den Agenten über Sitzungen hinweg persistent zu halten.
# 3. Agent Forwarding: Nutzen und Risiko
Der bequeme Tunnel.
Mit dem Flag -A wird Ihr lokaler Agent-Socket auf den Ziel-Server gespiegelt.
ssh -A user@jump-host
# Auf dem Jump-Host können Sie nun:
ssh user@production-server # (Kein Key auf Jump-Host nötig!)
Security-Warnung: Wenn ein Admin auf dem jump-host Root-Rechte hat, kann er Ihren gespiegelten Socket unter /tmp/ssh-XXXX/agent.XXXX abgreifen und sich als Sie gegenüber anderen Servern authentifizieren, solange Ihre Verbindung steht!
# 4. Die sichere Alternative: ProxyJump
Kein Forwarding nötig.
Ab OpenSSH 7.3 nutzen wir bevorzugt ProxyJump (-J). Dabei wird kein Agent-Socket auf dem Jump-Host erstellt. Der Traffic wird lediglich durchgereicht.
# Nutzung via CLI
ssh -J user@jump-host:22 user@production-server
# Nutzung via Config (~/.ssh/config)
Host prod
HostName 10.0.0.50
User admin
ProxyJump jump-host
# 5. Troubleshooting & “War Stories”
Wenn der Agent den Dienst verweigert.
# Story 1: “Der hängende Agent-Socket”
Symptom: Ein Admin hat 10 SSH-Instanzen offen, aber ssh-add -l meldet “Could not open a connection to your authentication agent”.
Ursache: Jede Shell-Instanz braucht die Umgebungsvariable $SSH_AUTH_SOCK. Diese geht oft verloren, wenn man su oder sudo -i nutzt.
Lösung: Nutzen Sie sudo -E um die Umgebung zu behalten, oder nutzen Sie Tools wie direnv, um den Socket-Pfad automatisch zu setzen.
# Story 2: “Too many authentication failures”
Symptom: Der Login bricht sofort ab, noch bevor nach dem Passwort gefragt wird.
Ursache: Der Agent hat 10 verschiedene Keys geladen. SSH probiert alle durch. Der Zielserver bricht nach 3-5 Versuchen ab.
Lösung: Nutzen Sie IdentitiesOnly yes in Ihrer ~/.ssh/config, damit SSH nur den Key nutzt, der explizit für diesen Host definiert wurde.
# 6. Fazit & Empfehlung
- Pflicht: Nutzen Sie einen Agenten, um Ihre Keys mit starken Passphrasen zu schützen.
- Wahl: Vermeiden Sie
-A(Forwarding) wo immer möglich. Nutzen Sie stattdessen ProxyJump. - Sicherheit: Nutzen Sie
ssh-add -t 1h, um die Gültigkeit von Schlüsseln im Agenten zeitlich zu begrenzen.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Agent starten | eval $(ssh-agent) |
| Key laden | ssh-add <file> |
| Alle Keys löschen | ssh-add -D |
| Keys mit Ablaufdatum | ssh-add -t 3600 <file> (1 Stunde) |
| Jump-Host CLI | ssh -J <jump> <target> |
| Agent Socket Pfad | echo $SSH_AUTH_SOCK |
| Agent Forwarding Test | ssh -T git@github.com (aus dem Tunnel) |