1 Security
Claude edited this page 2026-06-29 21:37:15 +00:00

Security — Agent-Kanal (Epic #184)

Agent-WS-Authentifizierung (#185)

Der Node-Agent authentifiziert sich per ed25519 Challenge-Response, nicht mehr mit einem wiederverwendbaren Bearer-Token:

  1. Erstinbetriebnahme: Agent erzeugt ein ed25519-Keypair (privater Schlüssel root-only unter /etc/theprox-agent/identity_ed25519, verlässt die Maschine nie).
  2. Enrollment (#182): einmaliger, kurzlebiger Token registriert den Public Key (POST /enroll/{token}) → Node.identity_pubkey. Token danach verbrannt.
  3. Handshake: Server schickt pro Verbindung eine zufällige Nonce → Agent signiert → Server verifiziert gegen identity_pubkey. Kein Secret über die Leitung, nicht replaybar.

Einen Node sperren = identity_pubkey löschen (oder Node löschen). Re-Enrollment via POST /api/admin/nodes/{name}/regenerate-token (setzt identity_pubkey zurück + frischen Single-Use-Token mit TTL).

Auth-Rate-Limit / Lockout (#181)

Der Auth-Schritt ist pro Quell-IP gedrosselt (websocket/auth_ratelimit.py):

  • Sliding-Window: 5 Fehlversuche / 60 s → Block.
  • Exponentielles Backoff: 30 s → 60 s → 120 s … (Cap 1 h).
  • Erfolgreiche Auth setzt den Zähler der IP zurück.
  • Konstante Antwortzeit bei Fehlschlag (kein Timing-Orakel).

Log-Format (fail2ban-parsebar)

Fehlversuche und Blocks werden einzeilig und stabil geloggt:

agent-auth-fail ip=<IP> reason=<grund>
agent-auth-block ip=<IP> retry_in=<n>s

reasontimeout_or_bad_json | no_auth_frame | unknown_identity | bad_signature.

Beispiel-fail2ban-Filter

/etc/fail2ban/filter.d/theprox-agent-auth.conf:

[Definition]
failregex = ^.*agent-auth-fail ip=<HOST> reason=.*$
ignoreregex =

/etc/fail2ban/jail.d/theprox-agent-auth.conf (Backend-Log als Quelle — Pfad/Backend an euer Logging anpassen, z. B. journald oder Docker-Log-Datei):

[theprox-agent-auth]
enabled  = true
filter   = theprox-agent-auth
backend  = systemd
maxretry = 5
findtime = 60
bantime  = 3600

Die in-process-Drossel (#181) und fail2ban ergänzen sich: die Drossel wirkt sofort prozessintern (auch ohne fail2ban), fail2ban kann zusätzlich auf Firewall-Ebene (iptables/nftables) blocken.