linux-security ssh jump-host bastion networking remote-access security

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.

  1. Minimales OS: Nutzen Sie Alpine (Artikel 193) oder RHEL Minimal.
  2. MFA (Multi-Faktor): Aktivieren Sie Google Authenticator oder Duo.
  3. Audit: Loggen Sie jede Session mit auditd oder nutzen Sie Teleport, um SSH-Sitzungen als Video aufzuzeichnen.
  4. 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)