[MEDIUM] Enrollment-Token kurzlebig + single-use (Rotation zu Node-Secret) statt langlebigem Bearer #182

Closed
opened 2026-06-26 11:26:47 +00:00 by chinux · 4 comments
Owner

Teil des Public-Readiness-Epics. MEDIUM-HIGH fuer public Onboarding.
Der Node-Token (models/node.py) ist ein langlebiger Bearer (hoch-entropisch, at-rest gehasht — gut), aber ohne Ablauf/Single-Use. Das Install-Script traegt ihn im Klartext. Leakt ein Install-Script (Mail/History/Copy-Paste), bleibt der Token dauerhaft gueltig fuer einen Root-Agent-Connect.

Fix

  • Kurzlebiger, single-use Enrollment-Token fuer den Bootstrap: beim ersten erfolgreichen Agent-Connect tauscht der Agent den Enrollment-Token gegen ein langlebiges Node-Secret (rotiert), Enrollment-Token wird invalidiert.
  • Enrollment-Token mit TTL (z. B. 30-60 min) + used_at (einmalig). Felder am Node-Model (enroll_token_hash, enroll_expires_at, enroll_used_at) oder separate Tabelle.
  • Bestehende Tokens weiter gueltig (Migration: alte Nodes = enrolled, kein Bruch).
  • Install-Script kommuniziert die kurze Gueltigkeit ("innerhalb X min ausfuehren").

Akzeptanz

  • Neuer Node: Enrollment-Token ist nach erstem Connect bzw. nach TTL ungueltig.
  • Laufender Betrieb nutzt das rotierte Node-Secret (nicht den Enrollment-Token).
  • Bestandsknoten brechen nicht.

Branch

feat/short-lived-enrollment-token

Teil des Public-Readiness-Epics. **MEDIUM-HIGH fuer public Onboarding.** Der Node-Token (`models/node.py`) ist ein **langlebiger** Bearer (hoch-entropisch, at-rest gehasht — gut), aber **ohne Ablauf/Single-Use**. Das Install-Script traegt ihn im Klartext. Leakt ein Install-Script (Mail/History/Copy-Paste), bleibt der Token **dauerhaft** gueltig fuer einen Root-Agent-Connect. ## Fix - **Kurzlebiger, single-use Enrollment-Token** fuer den Bootstrap: beim ersten erfolgreichen Agent-Connect tauscht der Agent den Enrollment-Token gegen ein **langlebiges Node-Secret** (rotiert), Enrollment-Token wird invalidiert. - Enrollment-Token mit **TTL** (z. B. 30-60 min) + `used_at` (einmalig). Felder am Node-Model (`enroll_token_hash`, `enroll_expires_at`, `enroll_used_at`) oder separate Tabelle. - Bestehende Tokens weiter gueltig (Migration: alte Nodes = enrolled, kein Bruch). - Install-Script kommuniziert die kurze Gueltigkeit ("innerhalb X min ausfuehren"). ## Akzeptanz - Neuer Node: Enrollment-Token ist nach erstem Connect bzw. nach TTL ungueltig. - Laufender Betrieb nutzt das rotierte Node-Secret (nicht den Enrollment-Token). - Bestandsknoten brechen nicht. ## Branch `feat/short-lived-enrollment-token`
Author
Owner

Scope-Klarstellung: DEV-Umgebung — Bestandsschutz entfaellt

Da reine Dev-Umgebung und Verbindungsverlust akzeptiert: Der Punkt "Bestehende Tokens weiter gueltig / Bestandsknoten brechen nicht" aus der Beschreibung entfaellt. Alte Tokens duerfen invalidiert werden, Nodes werden neu enrolled. Das vereinfacht die Umsetzung — keine Migration fuer Altbestand noetig, einfach das neue kurzlebige/single-use Enrollment-Schema einziehen.

## Scope-Klarstellung: DEV-Umgebung — Bestandsschutz entfaellt Da reine Dev-Umgebung und Verbindungsverlust akzeptiert: Der Punkt "Bestehende Tokens weiter gueltig / Bestandsknoten brechen nicht" aus der Beschreibung **entfaellt**. Alte Tokens duerfen **invalidiert** werden, Nodes werden **neu enrolled**. Das vereinfacht die Umsetzung — keine Migration fuer Altbestand noetig, einfach das neue kurzlebige/single-use Enrollment-Schema einziehen.
Author
Owner

Wird in #185 eingefaltet. Der kurzlebige single-use Enrollment-Token ist dort der einmalige Bootstrap fuer die Pubkey-Registrierung des Challenge-Response-Verfahrens. Umsetzung/Schliessung gemeinsam mit #185.

**Wird in #185 eingefaltet.** Der kurzlebige single-use Enrollment-Token ist dort der einmalige Bootstrap fuer die Pubkey-Registrierung des Challenge-Response-Verfahrens. Umsetzung/Schliessung gemeinsam mit #185.
Author
Owner

#182 ist in #185 eingefaltet · Commit 53fdcfe.

Der Enrollment-Token ist jetzt single-use + kurzlebig: Node.enroll_expires_at (TTL 60min, gesetzt bei create/regenerate) + Node.enroll_used_at (einmalig). POST /enroll/{token} prueft beides und verbrennt den Token (enroll_used_at), registriert dabei den ed25519-Identity-Pubkey. Danach laeuft die Auth ueber Challenge-Response (#185), nicht mehr ueber den Token. Migration 0024_node_identity. Issue bleibt offen (mit #185 abnehmen).

**#182 ist in #185 eingefaltet** · Commit `53fdcfe`. Der Enrollment-Token ist jetzt single-use + kurzlebig: `Node.enroll_expires_at` (TTL 60min, gesetzt bei create/regenerate) + `Node.enroll_used_at` (einmalig). `POST /enroll/{token}` prueft beides und verbrennt den Token (`enroll_used_at`), registriert dabei den ed25519-Identity-Pubkey. Danach laeuft die Auth ueber Challenge-Response (#185), nicht mehr ueber den Token. Migration `0024_node_identity`. Issue bleibt offen (mit #185 abnehmen).
Author
Owner

Erfüllt über #185 (Commit 53fdcfe) → wird geschlossen. Der kurzlebige, single-use Enrollment-Token ist der Bootstrap der Pubkey-Registrierung: TTL via enroll_expires_at, Einmaligkeit via enroll_used_at, Re-Enroll via regenerate-token.

**Erfüllt über #185 (Commit 53fdcfe) → wird geschlossen.** Der kurzlebige, single-use Enrollment-Token ist der Bootstrap der Pubkey-Registrierung: TTL via `enroll_expires_at`, Einmaligkeit via `enroll_used_at`, Re-Enroll via `regenerate-token`.
Sign in to join this conversation.
No milestone
No project
No assignees
1 participant
Notifications
Due date
The due date is invalid or out of range. Please use the format "yyyy-mm-dd".

No due date set.

Dependencies

No dependencies set.

Reference
chinux/theProx#182
No description provided.