Kryptografische OpenSSH-Architektur: Bastions, ProxyJump & Verschlüsseltes Port-Forwarding
Erstellt: 08.11.2026 · Zuletzt aktualisiert: 08.11.2026 · Nejat Hakan
Management Summary: OpenSSH ist das primäre administrative Zugangstor zu jedem produktiven Linux-Server. Wer auf veraltete RSA-Schlüssel, ungehärtete Standard-Verschlüsselungsverfahren oder Passwort-Authentifizierung setzt, setzt geschäftskritische Infrastrukturen automatisierten Brute-Force-Angriffen und Credential-Stuffing aus. Professionelles Systems Engineering verlangt
Ed25519-Schlüsselpaare über elliptische Kurven, post-quanten-resistenten Schlüsselaustausch, präzisesshd_config-Härtung, TCP-Verbindungs-Multiplexing viaControlMaster, sichere Bastion-Hosts mitProxyJumpsowie verschlüsseltes Port-Forwarding (Local, Remote und Dynamic SOCKS5).
-
Ed25519 & Kryptografie
Moderne
Ed25519-Schlüssel mit hohen KDF-Runden (-a 100) generieren, Post-Quanten-KEX konfigurieren und alte RSA/DSA-Schlüssel verbannen. -
Produktionsnahe
sshd-Härtung
Passwörter und Root-Login sperren, Cipher-Suites auf
ChaCha20-Poly1305undAES-GCMbeschränken und strenge Authentifizierungs-Limits setzen. -
Bastions &
ProxyJump
Isolierte DMZ- und LAN-Netzwerkzonen sicher über
ProxyJump(-J) traversieren, ohne die fatalen Sicherheitsrisiken von altem Agent-Forwarding (-A) einzugehen. -
Port-Forwarding (
-L,-R,-D)
Lokale Datenbank-Clients verschlüsselt an Server-Loopbacks binden (
-L), lokale Entwicklungsserver freigeben (-R) und SOCKS5-Proxies starten (-D).
1. Kryptografisches Schlüsselmanagement: Das Ende von RSA
Veraltete RSA-2048- und RSA-4096-Schlüssel leiden unter langsamer Schlüsselerzeugung, Anfälligkeit für Seitenkanalangriffe und unnötig großen Schlüssellängen. Der moderne Standard im Linux-Umfeld ist Ed25519 (Edwards-curve Digital Signature Algorithm über Curve25519):
- Deterministische Signaturen: Verhindert das Auslesen privater Schlüssel durch fehlerhafte Zufallszahlengeneratoren.
- Kompakter Footprint: Öffentliche Schlüssel sind nur 68 Zeichen lang, was die Überprüfung in
authorized_keysmassiv erleichtert. - Widerstandsfähige Key Derivation Function (KDF): Nutzt bcrypt PBKDF, um private Schlüssel auf lokalen Datenträgern gegen Offline-Brute-Force-Angriffe abzusichern.
Gehärtete Ed25519-Schlüsselpaare erzeugen
Erstelle ein Ed25519-Schlüsselpaar mit 100 bcrypt-KDF-Runden und einer aussagekräftigen Beschreibung:
# Ed25519-Schlüsselpaar mit hoher KDF-Rundenzahl generieren
ssh-keygen -t ed25519 -a 100 -C "nejat@infra-workstation" -f ~/.ssh/id_ed25519_infra
# Strikte Dateisystemberechtigungen setzen
chmod 700 ~/.ssh
chmod 600 ~/.ssh/id_ed25519_infra
chmod 644 ~/.ssh/id_ed25519_infra.pub
Den öffentlichen Schlüssel sicher auf den Ziel-Debian-Server übertragen:
2. Serverhärtung in der Praxis (sshd_config.d)
In Debian 11/12+ wird niemals die Datei /etc/ssh/sshd_config direkt editiert. Lege stattdessen eine gehärtete Konfigurationsdatei in /etc/ssh/sshd_config.d/99-hardening.conf an:
# Datei: /etc/ssh/sshd_config.d/99-hardening.conf
# 1. Authentifizierungs-Einschränkungen
PermitRootLogin no
PasswordAuthentication no
KbdInteractiveAuthentication no
PubkeyAuthentication yes
AuthenticationMethods publickey
# Zugriff strikt auf definierte Administrationsbenutzer beschränken
AllowUsers nejat
# 2. Gehärtete kryptografische Algorithmen
# Post-Quanten-Hybrid-KEX (sntrup761) + klassisches Curve25519
KexAlgorithms sntrup761x25519-sha512@openssh.com,curve25519-sha256,curve25519-sha256@libssh.org
# Nur moderne AEAD-Verschlüsselungsverfahren (Authenticated Encryption)
Ciphers chacha20-poly1305@openssh.com,aes256-gcm@openssh.com,aes128-gcm@openssh.com
# Encrypt-then-MAC (ETM) Algorithmen
MACs hmac-sha2-512-etm@openssh.com,hmac-sha2-256-etm@openssh.com
# 3. Verbindungs-Limits & Brute-Force-Schutz
MaxAuthTries 3
LoginGraceTime 20
MaxSessions 2
ClientAliveInterval 300
ClientAliveCountMax 2
# 4. Ungenutzte Subsysteme deaktivieren
X11Forwarding no
AllowAgentForwarding no
Prüfe die Syntax vor jedem Dienst-Reload, um versehentliche Aussperrungen zu verhindern:
# Syntax überprüfen (bleibt bei Erfolg stumm)
sudo sshd -t
# Konfiguration ohne Unterbrechung bestehender Sessions aktivieren
sudo systemctl reload ssh
3. Bastion-Hosts & Multi-Hop-Zugriff: ProxyJump vs. Agent-Forwarding
Um interne Datenbank-Cluster oder Hypervisoren in isolierten Netzwerkzonen zu erreichen, führt der Weg über einen Bastion-Host (Jump Server) in der DMZ:
%%{init: {'flowchart': {'wrappingWidth': 350}}}%%
flowchart TB
WORK["Workstation<br/>Lokaler privater Key"]
BAST["Bastion-Host (DMZ)<br/>203.0.113.10:22<br/>Öffentliche WAN-IP"]
INT["Interner DB-Server<br/>10.10.20.11:22<br/>Privates Subnetz"]
WORK ==>|"1. SSH ProxyJump (-J)"| BAST
BAST ==>|"2. Reines TCP stdio"| INT
Das fatale Sicherheitsrisiko von Agent-Forwarding (ssh -A)
In alten Anleitungen wird oft empfohlen, den SSH-Agenten weiterzuleiten (ssh -A bastion). Tue dies niemals auf geteilten Servern. Wird der Bastion-Host kompromittiert, kann ein Angreifer über deinen weitergeleiteten Unix-Domain-Socket ($SSH_AUTH_SOCK) in deinem Namen auf alle Server zugreifen, für die dein Schlüssel autorisiert ist!
Die moderne Lösung: ProxyJump (-J)
ProxyJump baut eine direkte Ende-zu-Ende-Verschlüsselung zwischen deiner Workstation und dem internen Zielhost auf. Der Bastion-Host fungiert lediglich als reiner TCP-Datenstrom-Vermittler (stdio) und sieht weder entschlüsselte Daten noch deinen privaten Schlüssel oder Agent-Socket.
4. Client-Automatisierung: ~/.ssh/config
Konfiguriere Multiplexing, Keepalives und automatische Jump-Hosts in deiner lokalen ~/.ssh/config:
# Datei: ~/.ssh/config
# Globale Einstellungen für alle Hosts
Host *
# Verbindungs-Multiplexing (Bestehende TCP/SSH-Verbindung für neue Shells wiederverwenden)
ControlMaster auto
ControlPath ~/.ssh/cm-%r@%h:%p
ControlPersist 10m
# Keepalives gegen Verbindungsabbrüche durch Stateful NAT-Firewalls
ServerAliveInterval 30
ServerAliveCountMax 3
# Strikte Schlüsselprüfung
StrictHostKeyChecking ask
IdentitiesOnly yes
# 1. Bastion-Host in der DMZ
Host bastion
HostName 203.0.113.10
User nejat
Port 22
IdentityFile ~/.ssh/id_ed25519_infra
# 2. Interner Datenbankserver (Wird automatisch durch den Bastion getunnelt)
Host db-primary
HostName 10.10.20.11
User nejat
ProxyJump bastion
IdentityFile ~/.ssh/id_ed25519_infra
# Lokalen Port 15432 automatisch an entferntes 127.0.0.1:5432 weiterleiten
LocalForward 127.0.0.1:15432 127.0.0.1:5432
Verbindung mit einem einzigen Befehl herstellen:
5. Die drei Portweiterleitungs-Modi: Local, Remote & Dynamic
%%{init: {'flowchart': {'wrappingWidth': 350}}}%%
flowchart TB
subgraph L["1. Local Forwarding (-L)"]
direction TB
L_SRC["Lokal :15432"] -->|"SSH Tunnel"| L_DST["Remote DB :5432"]
end
subgraph R["2. Remote Forwarding (-R)"]
direction TB
R_SRC["Remote :8080"] -->|"SSH Tunnel"| R_DST["Lokale App :3000"]
end
subgraph D["3. Dynamic SOCKS5 (-D)"]
direction TB
D_SRC["Browser :1080"] -->|"SSH Tunnel"| D_DST["Internet via Remote"]
end
L --> R --> D
1. Lokale Portweiterleitung (-L)
Bindet einen Port auf deiner lokalen Maschine und leitet alle eingehenden Anfragen durch den SSH-Tunnel an einen Zielport auf dem entfernten Server:
# Syntax: ssh -L [bind_adresse:]lokaler_port:ziel_host:ziel_port server
# Lokalen Client (DBeaver/psql) mit der entfernten PostgreSQL-DB verbinden
ssh -N -L 127.0.0.1:15432:127.0.0.1:5432 nejat@db-primary
Lokal verbinden: psql -h 127.0.0.1 -p 15432 -U postgres
2. Entfernte Portweiterleitung (-R)
Bindet einen Port auf dem entfernten Server und leitet Anfragen zurück an einen Port auf deiner lokalen Maschine. Ideal, um lokale Webhook-Receiver oder Testumgebungen bereitzustellen:
# Syntax: ssh -R [bind_adresse:]remote_port:ziel_host:lokaler_port server
# Lokale Webanwendung (:3000) auf Port :8080 des Bastion-Servers bereitstellen
ssh -N -R 127.0.0.1:8080:127.0.0.1:3000 nejat@bastion
3. Dynamischer SOCKS5-Proxy (-D)
Verwandelt die SSH-Verbindung in einen verschlüsselten SOCKS5-Proxy. Browser oder curl können über 127.0.0.1:1080 den gesamten Internetverkehr über den entfernten Server tunneln:
# Lokalen SOCKS5-Proxy auf Port 1080 starten
ssh -N -D 127.0.0.1:1080 nejat@bastion
# Beliebige HTTP-Anfragen über den entfernten Server tunneln
curl --socks5-hostname 127.0.0.1:1080 https://icanhazip.com
(Der Parameter -N weist OpenSSH an, keine interaktive Shell zu öffnen, sondern die Verbindung rein für das Port-Forwarding zu reservieren).
6. Nächste Schritte
Nachdem der administrative Fernzugriff gehärtet und verschlüsselte Tunnel etabliert sind, folgt die Absicherung des Betriebssystems über Stateful-Paketfilter im Linux-Kernel:
-
Stateful Packet Filtering mit nftables & ufw
Netfilter-Kernel-Hooks, Dual-Stack
inet-Tabellen, Connection Tracking (conntrack) und UFW-Profilmanagement.