Zum Inhalt

Static-Token-Bootstrap-Gate auf Agent Runtime CT 259

Fester Scope

agent_runtime_static_token_bootstrap.py provisioniert ausschließlich zwei fehlende Gates des bereits deployten Static-Token-Admin:

  • einen kryptografisch erzeugten HMAC-Key mit mindestens 32 Byte im LXC unter /opt/agent-runtime/controlled-execution/mcp-static-token-admin/hmac.key;
  • genau ein RBAC-Mapping im LXC unter /opt/agent-runtime/controlled-execution/mcp-static-token-admin/rbac-token-map.json.

Docker bindet /opt/agent-runtime/controlled-execution in beide Runtime- Container als /var/lib/lanstyle-agent/controlled-execution. Deshalb bleiben die festen Runtime-Pfade der Leser getrennt gebunden:

  • HMAC: /var/lib/lanstyle-agent/controlled-execution/mcp-static-token-admin/hmac.key
  • RBAC: /var/lib/lanstyle-agent/controlled-execution/mcp-static-token-admin/rbac-token-map.json

CT-Preflight, Create-if-absent, CAS und Rollback verwenden ausschließlich den LXC-Hostpfad unter /opt. Die aktive Verifikation läuft im Container und prüft die bind-mounted Sicht unter /var/lib; ein Schreiben in einen gleichnamigen nicht gemounteten LXC-Pfad ist damit ausgeschlossen.

Der Provider ist an root@10.0.0.220, CT 259, die zwei festen Host-/Runtime- Pfadpaare und die Rolle credential_rotator gebunden. Er akzeptiert keinen Host, keine VMID, keinen Pfad, keine Rolle, keinen Tokenwert und kein Remote-Kommando vom Aufrufer. Der bestehende Legacy-operator wird nicht geändert.

credential_rotator besitzt ausschließlich read_only und credential_management; nur Medium Risk ist erlaubt. Insbesondere besitzt die Rolle weder scoped_write noch High-Risk-Rechte.

Dateiverträge und Priorität

Beide Dateien müssen root:root, Modus 0600, regulär, ohne Symlink und ohne Hardlink sein. Der HMAC-Key wird ausschließlich im CT über os.urandom(32) erzeugt und erscheint niemals in Ausgabe, Receipt oder Audit.

Die Runtime liest in definierter Reihenfolge:

  1. HMAC: LANSTYLE_STATIC_MCP_TOKEN_ADMIN_HMAC_KEY, sonst die feste Keydatei.
  2. RBAC: LANSTYLE_TOOLS_API_RBAC_JSON, sonst die feste Mappingdatei.

Eine gesetzte Environment-Quelle hat Vorrang. Ein ungültiger gesetzter Environment-Wert fällt nicht still auf die Datei zurück. Enthält die bereits vorhandene Mappingdatei nicht exakt den einen manifestierten Fingerprint, stoppt der Provider ohne Überschreiben.

Exakter CLI-Vertrag

Der 16-stellige Fingerprint wird außerhalb dieser Capability aus dem autorisierten Tokenbestand ermittelt. Der Provider ermittelt ihn ausdrücklich nicht selbst.

private_dir="$(mktemp -d)"
chmod 0700 "$private_dir"

python3 agent-runtime/tools/agent_runtime_static_token_bootstrap.py \
  build-manifest \
  --token-fingerprint '<16-lowercase-hex>' \
  --output "$private_dir/static-token-bootstrap.json"

python3 agent-runtime/tools/agent_runtime_static_token_bootstrap.py \
  preflight \
  --manifest "$private_dir/static-token-bootstrap.json"

python3 agent-runtime/tools/agent_runtime_static_token_bootstrap.py \
  apply \
  --manifest "$private_dir/static-token-bootstrap.json" \
  --run-id 'run-bootstrap-YYYYMMDDHHMM'

python3 agent-runtime/tools/agent_runtime_static_token_bootstrap.py \
  rollback \
  --manifest "$private_dir/static-token-bootstrap.json" \
  --run-id 'run-bootstrap-YYYYMMDDHHMM'

Gates und Rückweg

Der Ablauf ist Preflight → Prestate → Host- und CT-flock → Create-if-absent/CAS → Read-after-write → aktive Runtime-Verifikation → Audit. Run-IDs sind auf Host und CT replay-geschützt. Vorhandene Dateien werden nie ersetzt. Automatischer und expliziter Rollback entfernen ausschließlich durch denselben Lauf neu erstellte Dateien und nur, wenn Mapping-Digest bzw. root-only Dateidentität noch exakt zum Poststate passen. Fremddrift führt zu Quarantäne statt Überschreiben.

Die aktive Prüfung bestätigt secretfrei:

  • effektives Mapping des manifestierten Fingerprints auf credential_rotator;
  • Medium-credential_management erlaubt;
  • High Risk und scoped_write blockiert;
  • bestehender Legacy-Token bleibt operator und hat einen anderen Fingerprint;
  • HMAC ist über Environment oder root-only Datei verfügbar.

Fehler der aktiven Container-Prüfung werden stufengenau, aber ohne Exception-Text, Pfade oder Werte ausgegeben. Zulässige Stufen sind import, mapping_load, legacy_context, hmac_load und assertions. Der interne Verifier liefert bei einem Fehler ausschließlich:

{
  "status": "error",
  "error_step": "hmac_load",
  "error_type": "StaticTokenAdminRejected",
  "secret_values_returned": false
}

Der Remote-Provider validiert diesen engen Vertrag und speichert nur einen stabilen Code wie verify_hmac_load_statictokenadminrejected im root-only Receipt. Die Exception-Nachricht wird weder übernommen noch ausgegeben; der guarded Rollback bleibt unverändert aktiv.

Lokale Abnahme

python3 -m unittest -v agent-runtime.tests.test_static_token_bootstrap
python3 -m unittest -v agent-runtime.tests.test_static_mcp_token_admin
python3 -m py_compile \
  agent-runtime/tools/agent_runtime_static_token_bootstrap.py \
  agent-runtime/tools/agent_runtime_static_token_bootstrap_remote.py \
  agent-runtime/tools/static_mcp_token_admin.py \
  agent-runtime/tools/rbac_governance.py