[HIGH] Agent→API-Auth: ed25519 Challenge-Response (Proof-of-Possession) statt Bearer-Token #185
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Teil von Epic #184 (Public-Readiness). Loest die Bearer-Token-Schwaeche der Agent→API-Auth.
Problem
Der Agent authentifiziert heute per Bearer-Token (
agent_ws.py): hoch-entropisch + at-rest gehasht (nicht faelschbar), ABER wiederverwendbar — wer ihn aus Install-Script/Logs/Leak abgreift, kann sich beliebig oft als der Node ausgeben; der Token laeuft nie ab.wss://(#113) schuetzt den Transport, aber nicht gegen einen geleakten Token.Loesung: ed25519 Proof-of-Possession (Challenge-Response) pro Agent
#182 hier eingefaltet — Enrollment-Token wird der einmalige Bootstrap
Datenmodell
Node.identity_pubkey(ed25519 public key, base64) — beim Enrollment gesetzt.token/token_hashentfaellt im Dauerbetrieb (Dev-Umgebung: alte Nodes neu enrollen, keine Kompat noetig).Backend (
agent_ws.py)Agent (Rust)
/etc/theprox-agent/identity_ed25519).Akzeptanz
Bezug
#184 (Epic), #182 (eingefaltet), #181 (Rate-Limit on top), #115 (Pflicht-Begleiter: cmd-Owner-Binding), #113 (wss + ed25519 bereits im Agent).
Branch
feat/agent-challenge-response-auth#185 umgesetzt (faltet #182 ein) · Commit
53fdcfe. Issue bleibt offen.Agent (2.15.0→2.16.0)
identity.rs: persistentes ed25519-Keypair, Seed root-only 0600 unter/etc/theprox-agent/identity_ed25519(verlaesst die Maschine nie).POST /enroll/{token}registriert (single-use). Enroll-Fehler → Key geloescht + Abbruch → systemd-Retry.auth.rs: Handshake jetzt Challenge-Response — Server-Nonce signieren,pubkey+signaturesenden statttoken.Backend
Node.identity_pubkey(base64, unique) +enroll_expires_at/enroll_used_at(TTL 60min + single-use). Migration0024_node_identity.POST /enroll/{token}: registriert Pubkey, verbrennt Token (generische Ablehnung, kein Oracle).agent_ws.py: per-Verbindung-Nonce (single-use, nicht replaybar) →verify_signature(cryptography) gegenidentity_pubkey; Token-Hash-Lookup entfaellt. Konstante Antwortzeit bei Fehlschlag.admin_router: create/regenerate setzen Enroll-TTL;regenerate-tokenresettetidentity_pubkey(= Re-Enrollment).Akzeptanz: kein wiederverwendbares Secret im Dauerbetrieb ✅ · Handshake nicht replaybar (Nonce pro Verbindung) ✅ · Node sperren = Pubkey loeschen ✅ · Enrollment single-use+kurzlebig ✅
#182: hierueber miterledigt (single-use + kurzlebiger Enrollment-Token mit
enroll_expires_at/enroll_used_at).⚠️ Setup/Deploy (Sebastian) — koordiniert noetig, bricht alte Nodes
cd server && docker compose up -d --build→ Migration0024+ neue Depcryptography==44.0.0.POST /api/admin/nodes/{name}/regenerate-token→ neuen Install/Enroll-Token nutzen. Alte token-basierte Agents brechen bewusst (Dev, keine Kompat).Backend wurde bewusst NOCH NICHT neu gebaut, um die 6 Live-Agents nicht ungeplant offline zu nehmen — Deploy zusammen mit dem neuen Agent-Binary.
Verifiziert @
53fdcfe→ erfüllt, wird geschlossen.identity.rs: ed25519-Keypair, Seed root-only/etc/theprox-agent/identity_ed25519✓agent_ws.py: Nonce-Challenge-Response (per-Connection, single-use), Signatur gegenNode.identity_pubkey; alter Bearer-Token-Pfad komplett entfernt ✓auth/agent_identity.py verify_signature: ed25519 via cryptography, fail-closed (False bei jedem Fehler) ✓/enroll/{token}(main.py:338): single-use (enroll_used_at) + TTL (enroll_expires_at) ✓regenerate-token(admin_router:639): setzt identity_pubkey/enroll_used_at zurück → Re-Enrollment ✓cryptography==44.0.0gepinnt ✓