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:
- HMAC:
LANSTYLE_STATIC_MCP_TOKEN_ADMIN_HMAC_KEY, sonst die feste Keydatei. - 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_managementerlaubt; - High Risk und
scoped_writeblockiert; - bestehender Legacy-Token bleibt
operatorund 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