Jump Hosts & Bastion Servers: Secure Access (Artikel 305)
Architektur und Implementierung von Jump-Hosts zur Absicherung interner Netzwerke. Erfahren Sie den Umgang mit SSH-Proxying, ProxyJump und dem Härten von Bastion-Servern.
# Jump Hosts: Das sichere Tor zum Rechenzentrum
TL;DR / Management Summary Interne Server sollten niemals direkt aus dem Internet erreichbar sein. Wir nutzen einen Bastion Host (oder Jump Host) als einzige Brücke. Ein Senior Admin greift nicht per “Doppel-SSH” auf Backends zu, sondern nutzt das moderne ProxyJump Feature. Dies ermöglicht einen transparenten Zugriff auf interne Ressourcen, während der private SSH-Key sicher auf dem Admin-Laptop bleibt. Der Bastion Host selbst muss dabei als gehärtete “Ein-Zweck-Maschine” (Artikel 240) betrieben werden.
# 1. Einführung & Architektur
Die Trennung der Netze.
Ein Bastion Host steht in der DMZ und hat zwei Beine: eines im Internet (via Firewall) und eines im Management-Netz.
# Die Zugriffs-Logik (Mermaid)
graph LR
A[Admin Laptop] -->|SSH Port 2222| B[Bastion Host: 1.2.3.4]
subgraph "Internal Management Network"
B --> C[DB Server: 10.0.0.5]
B --> D[App Server: 10.0.0.6]
B --> E[Backup Host: 10.0.0.7]
end
subgraph "The Tunnel"
A -.->|ProxyJump -J| C
end
# 2. ProxyJump: Der elegante Weg
Kein Agent-Forwarding nötig.
Anstatt sich erst auf dem Jump-Host einzuloggen und von dort den nächsten Befehl zu tippen, tunneln wir die Verbindung.
# Nutzung via CLI
ssh -J user@bastion.company.com:2222 internal-user@10.0.0.5
# Nutzung via SSH Config (~/.ssh/config)
Dies ist der professionelle Standard für Admins.
Host bastion
HostName bastion.company.com
Port 2222
User admin
Host 10.0.0.*
User root
ProxyJump bastion
Jetzt reicht ein einfaches ssh 10.0.0.5 – den Rest erledigt SSH im Hintergrund.
# 3. Härtung des Bastion Hosts
Die Festung sichern.
Der Jump-Host ist das attraktivste Ziel für Angreifer.
- Minimales OS: Nutzen Sie Alpine (Artikel 193) oder RHEL Minimal.
- MFA (Multi-Faktor): Aktivieren Sie Google Authenticator oder Duo.
- Audit: Loggen Sie jede Session mit
auditdoder nutzen Sie Teleport, um SSH-Sitzungen als Video aufzuzeichnen. - No Shell: Für reine Tunneling-Zwecke können Sie Usern die Shell entziehen (
ForceCommand /sbin/nologin).
# 4. Day-2 Operations: SSH Tunneling
Interne Web-UIs erreichen.
Oft müssen Sie auf Web-Interfaces (z.B. Proxmox oder Grafana) zugreifen, die nur intern erreichbar sind.
# Local Port Forwarding
ssh -L 8080:10.0.0.5:8006 bastion
Jetzt ist das interne Proxmox-GUI unter https://localhost:8080 auf Ihrem Laptop erreichbar.
# 5. Troubleshooting & “War Stories”
Wenn die Brücke bricht.
# Story 1: “Der hängende Jump-Connect”
Symptom: ssh -J bricht mit kex_exchange_identification: Connection closed by remote host ab.
Ursache: Der Jump-Host blockiert die ausgehende Verbindung zum Backend oder der DNS-Lookup auf dem Jump-Host für die interne IP schlägt fehl.
Lösung: Prüfen Sie die firewalld Regeln auf dem Bastion Host. Erlauben Sie Outbound-Traffic zu Port 22 im internen Netz.
# Story 2: “Das Agent-Hijacking”
Symptom: Ein Angreifer konnte sich vom Bastion Host aus auf alle Backend-Server verteilen.
Ursache: Ein Admin hat ForwardAgent yes genutzt (Artikel 303). Der Angreifer hatte Root auf dem Bastion Host und hat den Socket geklaut.
Lösung: Nutzen Sie ProxyJump statt Agent Forwarding. Bei ProxyJump werden keine Schlüssel oder Sockets auf dem Bastion Host hinterlegt.
# 6. Fazit & Empfehlung
- Pflicht: Nutzen Sie einen Bastion Host für jeden Zugriff auf Server in der Cloud oder im RZ.
- Wahl: Nutzen Sie ProxyJump in der SSH-Config für maximalen Komfort.
- Sicherheit: Deaktivieren Sie Port-Forwarding (
AllowTcpForwarding no) auf dem Bastion Host für alle User, die es nicht explizit für Web-UIs brauchen.
# Anhang: Cheatsheet
| Aufgabe | Befehl |
|---|---|
| Jump via CLI | ssh -J <jump> <target> |
| Tunnel (Local) | ssh -L <local_port>:<target_ip>:<target_port> <jump> |
| Tunnel (Dynamic/SOCKS) | ssh -D 1080 <jump> |
| SSH Config Pfad | ~/.ssh/config |
| Logs am Bastion | /var/log/secure oder journalctl -u ssh |
| Session aufzeichnen | script /var/log/ssh_sessions/session.log (via ForceCommand) |