Gateway
Geheimnisverwaltung
OpenClaw unterstützt additive SecretRefs, sodass unterstützte Zugangsdaten nicht als Klartext in der Konfiguration gespeichert werden müssen.
Ziele und Laufzeitmodell
Secrets werden in einen In-Memory-Laufzeit-Snapshot aufgelöst.
- Die Auflösung erfolgt während der Aktivierung eifrig, nicht lazy auf Anfragepfaden.
- Der Start schlägt schnell fehl, wenn ein effektiv aktiver SecretRef nicht aufgelöst werden kann.
- Reload verwendet atomaren Austausch: vollständiger Erfolg oder Beibehaltung des zuletzt als gut bekannten Snapshots.
- SecretRef-Policy-Verstöße (zum Beispiel Auth-Profile im OAuth-Modus in Kombination mit SecretRef-Eingabe) lassen die Aktivierung vor dem Laufzeitaustausch fehlschlagen.
- Laufzeitanfragen lesen ausschließlich aus dem aktiven In-Memory-Snapshot.
- Nach der ersten erfolgreichen Konfigurationsaktivierung bzw. dem ersten erfolgreichen Laden lesen Laufzeit-Codepfade weiter aus diesem aktiven In-Memory-Snapshot, bis ein erfolgreicher Reload ihn austauscht.
- Ausgehende Zustellpfade lesen ebenfalls aus diesem aktiven Snapshot (zum Beispiel Discord-Antwort-/Thread-Zustellung und Telegram-Aktionssendungen); sie lösen SecretRefs nicht bei jedem Senden erneut auf.
Dadurch bleiben Ausfälle von Secret-Providern von heißen Anfragepfaden fern.
Agent-Zugriffsgrenze
SecretRefs schützen Zugangsdaten davor, in unterstützter Konfiguration und generierten Modelloberflächen persistiert zu werden, sie sind jedoch keine Prozessisolationsgrenze. Wenn ein Klartext-Zugangsdatenwert auf der Festplatte in einem Pfad verbleibt, den der Agent lesen kann, kann der Agent Redaktion auf API-Ebene umgehen, indem er Datei- oder Shell-Tools verwendet, um diese Datei einzusehen.
Behandeln Sie bei Produktionsbereitstellungen, bei denen für Agents zugängliche Dateien im Geltungsbereich liegen, die SecretRef-Migration nur dann als abgeschlossen, wenn all dies zutrifft:
- unterstützte Zugangsdaten verwenden SecretRefs statt Klartextwerten
- veraltete Klartextreste wurden aus
openclaw.json,auth-profiles.json,.envund generiertenmodels.json-Dateien entfernt openclaw secrets audit --checkist nach der Migration sauber- alle verbleibenden nicht unterstützten oder rotierenden Zugangsdaten sind durch Betriebssystemisolation, Container-Isolation oder einen externen Zugangsdaten-Proxy geschützt
Deshalb ist der Audit-/Configure-/Apply-Workflow ein Sicherheitsmigrations-Gate und nicht nur ein Komfort-Helper.
Filterung aktiver Oberflächen
SecretRefs werden nur auf effektiv aktiven Oberflächen validiert.
- Aktivierte Oberflächen: nicht aufgelöste Referenzen blockieren Start/Reload.
- Inaktive Oberflächen: nicht aufgelöste Referenzen blockieren Start/Reload nicht.
- Inaktive Referenzen geben nicht-fatale Diagnosen mit dem Code
SECRETS_REF_IGNORED_INACTIVE_SURFACEaus.
Beispiele für inaktive Oberflächen
- Deaktivierte Channel-/Konto-Einträge.
- Top-Level-Channel-Zugangsdaten, die kein aktiviertes Konto erbt.
- Deaktivierte Tool-/Feature-Oberflächen.
- Websuche-Provider-spezifische Schlüssel, die nicht durch
tools.web.search.providerausgewählt sind. Im Automodus (Provider nicht gesetzt) werden Schlüssel entsprechend ihrer Priorität für die automatische Provider-Erkennung herangezogen, bis einer aufgelöst wird. Nach der Auswahl werden nicht ausgewählte Provider-Schlüssel als inaktiv behandelt, bis sie ausgewählt werden. - Sandbox-SSH-Auth-Material (
agents.defaults.sandbox.ssh.identityData,certificateData,knownHostsDataplus agentenspezifische Überschreibungen) ist nur aktiv, wenn das effektive Sandbox-Backend für den Standard-Agent oder einen aktivierten Agentsshist. gateway.remote.token- /gateway.remote.password-SecretRefs sind aktiv, wenn eine dieser Bedingungen zutrifft:gateway.mode=remotegateway.remote.urlist konfiguriertgateway.tailscale.modeistserveoderfunnel- Im lokalen Modus ohne diese Remote-Oberflächen:
gateway.remote.tokenist aktiv, wenn Token-Auth gewinnen kann und kein Env-/Auth-Token konfiguriert ist.gateway.remote.passwordist nur aktiv, wenn Passwort-Auth gewinnen kann und kein Env-/Auth-Passwort konfiguriert ist.
gateway.auth.token-SecretRef ist für die Auth-Auflösung beim Start inaktiv, wennOPENCLAW_GATEWAY_TOKENgesetzt ist, weil Env-Token-Eingabe für diese Laufzeit Vorrang hat.
Diagnosen der Gateway-Auth-Oberfläche
Wenn ein SecretRef auf gateway.auth.token, gateway.auth.password, gateway.remote.token oder gateway.remote.password konfiguriert ist, protokolliert Gateway-Start/Reload den Oberflächenzustand explizit:
active: Der SecretRef ist Teil der effektiven Auth-Oberfläche und muss aufgelöst werden.inactive: Der SecretRef wird für diese Laufzeit ignoriert, weil eine andere Auth-Oberfläche Vorrang hat oder weil Remote-Auth deaktiviert/nicht aktiv ist.
Diese Einträge werden mit SECRETS_GATEWAY_AUTH_SURFACE protokolliert und enthalten den Grund, den die Policy für aktive Oberflächen verwendet. So können Sie sehen, warum ein Zugangsdatenwert als aktiv oder inaktiv behandelt wurde.
Onboarding-Referenz-Preflight
Wenn Onboarding im interaktiven Modus läuft und Sie SecretRef-Speicherung auswählen, führt OpenClaw vor dem Speichern eine Preflight-Validierung aus:
- Env-Referenzen: validiert den Namen der Env-Variable und bestätigt, dass während der Einrichtung ein nicht leerer Wert sichtbar ist.
- Provider-Referenzen (
fileoderexec): validiert die Provider-Auswahl, löstidauf und prüft den Typ des aufgelösten Werts. - Quickstart-Wiederverwendungspfad: Wenn
gateway.auth.tokenbereits ein SecretRef ist, löst Onboarding ihn vor Probe-/Dashboard-Bootstrap (fürenv-,file- undexec-Referenzen) mit demselben Fail-Fast-Gate auf.
Wenn die Validierung fehlschlägt, zeigt Onboarding den Fehler an und lässt Sie es erneut versuchen.
SecretRef-Vertrag
Verwenden Sie überall dieselbe Objektform:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }env
{ source: "env", provider: "default", id: "OPENAI_API_KEY" }Unterstützte SecretInput-Felder akzeptieren außerdem exakte String-Kurzformen:
"${OPENAI_API_KEY}""$OPENAI_API_KEY"Validierung:
providermuss^[a-z][a-z0-9_-]{0,63}$entsprechenidmuss^[A-Z][A-Z0-9_]{0,127}$entsprechen
file
{ source: "file", provider: "filemain", id: "/providers/openai/apiKey" }Validierung:
providermuss^[a-z][a-z0-9_-]{0,63}$entsprechenidmuss ein absoluter JSON-Pointer sein (/...)- RFC6901-Escaping in Segmenten:
~=>~0,/=>~1
exec
{ source: "exec", provider: "vault", id: "providers/openai/apiKey#value" }Validierung:
providermuss^[a-z][a-z0-9_-]{0,63}$entsprechenidmuss^[A-Za-z0-9][A-Za-z0-9._:/#-]{0,255}$entsprechen (unterstützt Selektoren wiesecret#json_key)iddarf.oder..nicht als durch Schrägstriche getrennte Pfadsegmente enthalten (zum Beispiel wirda/../babgelehnt)
Provider-Konfiguration
Definieren Sie Provider unter secrets.providers:
{ secrets: { providers: { default: { source: "env" }, filemain: { source: "file", path: "~/.openclaw/secrets.json", mode: "json", // or "singleValue" }, vault: { source: "exec", command: "/usr/local/bin/openclaw-vault-resolver", args: ["--profile", "prod"], passEnv: ["PATH", "VAULT_ADDR"], jsonOnly: true, }, "team-secrets": { source: "exec", pluginIntegration: { pluginId: "acme-secrets", integrationId: "secret-store", }, }, }, defaults: { env: "default", file: "filemain", exec: "vault", }, resolution: { maxProviderConcurrency: 4, maxRefsPerProvider: 512, maxBatchBytes: 262144, }, },}Env-Provider
- Optionale Allowlist über
allowlist. - Fehlende/leere Env-Werte lassen die Auflösung fehlschlagen.
Datei-Provider
- Liest lokale Datei aus
path. mode: "json"erwartet eine JSON-Objekt-Payload und löstidals Pointer auf.mode: "singleValue"erwartet die Referenz-ID"value"und gibt Dateiinhalte zurück.- Der Pfad muss Eigentümer-/Berechtigungsprüfungen bestehen.
- Windows-Fail-Closed-Hinweis: Wenn ACL-Verifizierung für einen Pfad nicht verfügbar ist, schlägt die Auflösung fehl. Setzen Sie nur für vertrauenswürdige Pfade
allowInsecurePath: trueauf diesem Provider, um Pfadsicherheitsprüfungen zu umgehen.
Exec-Provider
- Führt den konfigurierten absoluten Binärpfad ohne Shell aus.
- Standardmäßig muss
commandauf eine reguläre Datei zeigen (kein Symlink). - Setzen Sie
allowSymlinkCommand: true, um Symlink-Befehlspfade zuzulassen (zum Beispiel Homebrew-Shims). OpenClaw validiert den aufgelösten Zielpfad. - Kombinieren Sie
allowSymlinkCommandmittrustedDirsfür Paketmanager-Pfade (zum Beispiel["/opt/homebrew"]). - Unterstützt Timeout, Timeout bei fehlender Ausgabe, Ausgabebyte-Limits, Env-Allowlist und vertrauenswürdige Verzeichnisse.
- Windows-Fail-Closed-Hinweis: Wenn ACL-Verifizierung für den Befehlspfad nicht verfügbar ist, schlägt die Auflösung fehl. Setzen Sie nur für vertrauenswürdige Pfade
allowInsecurePath: trueauf diesem Provider, um Pfadsicherheitsprüfungen zu umgehen. - Plugin-verwaltete Exec-Provider können
pluginIntegrationstatt kopiertemcommand/argsverwenden. OpenClaw löst die aktuellen Befehlsdetails während Start/Reload aus dem installierten Plugin-Manifest auf. Wenn das Plugin deaktiviert, entfernt, nicht vertrauenswürdig ist oder die Integration nicht mehr deklariert, schlagen aktive SecretRefs, die diesen Provider verwenden, geschlossen fehl.
Anfrage-Payload (stdin):
{ "protocolVersion": 1, "provider": "vault", "ids": ["providers/openai/apiKey"] }Antwort-Payload (stdout):
{ "protocolVersion": 1, "values": { "providers/openai/apiKey": "<openai-api-key>" } } // pragma: allowlist secretOptionale Fehler pro ID:
{ "protocolVersion": 1, "values": {}, "errors": { "providers/openai/apiKey": { "message": "not found" } }}Dateibasierte API-Schlüssel
Legen Sie keine file:...-Strings in den env-Block der Konfiguration. Der env-Block ist
literal und nicht überschreibend, daher wird file:... nicht aufgelöst.
Verwenden Sie stattdessen einen Datei-SecretRef auf einem unterstützten Zugangsdatenfeld:
{ secrets: { providers: { xai_key_file: { source: "file", path: "~/.openclaw/secrets/xai-api-key.txt", mode: "singleValue", }, }, }, models: { providers: { xai: { apiKey: { source: "file", provider: "xai_key_file", id: "value" }, }, }, },}Für mode: "singleValue" ist die SecretRef-id "value". Für
mode: "json" verwenden Sie einen absoluten JSON-Pointer wie
"/providers/xai/apiKey".
Siehe SecretRef-Zugangsdatenoberfläche für die Konfigurationsfelder, die SecretRefs akzeptieren.
Exec-Integrationsbeispiele
1Password CLI
{ secrets: { providers: { onepassword_openai: { source: "exec", command: "/opt/homebrew/bin/op", allowSymlinkCommand: true, // required for Homebrew symlinked binaries trustedDirs: ["/opt/homebrew"], args: ["read", "op://Personal/OpenClaw QA API Key/password"], passEnv: ["HOME"], jsonOnly: false, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "onepassword_openai", id: "value" }, }, }, },}Bitwarden Secrets Manager (`bws`)
Verwenden Sie einen Resolver-Wrapper, wenn SecretRef-IDs Bitwarden
Secrets Manager-Elementschlüsseln zugeordnet werden sollen. Das Repository enthält
scripts/secrets/openclaw-bws-resolver.mjs; installieren oder kopieren Sie es in einen absoluten,
vertrauenswürdigen Pfad auf dem Host, auf dem der Gateway ausgeführt wird.
Anforderungen:
- Bitwarden Secrets Manager CLI (
bws) ist auf dem Gateway-Host installiert. BWS_ACCESS_TOKENist für den Gateway-Dienst verfügbar.PATHwird an den Resolver übergeben, oderBWS_BINist auf den absoluten Binärpfad vonbwsgesetzt.BWS_SERVER_URLmuss in der Umgebung gesetzt sein, wenn eine selbst gehostete Bitwarden-Instanz verwendet wird.
{ secrets: { providers: { bws: { source: "exec", command: "/usr/local/bin/openclaw-bws-resolver.mjs", passEnv: ["BWS_ACCESS_TOKEN", "BWS_SERVER_URL", "PATH", "BWS_BIN"], jsonOnly: true, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "bws", id: "openclaw/providers/openai/apiKey", }, }, }, },}Der Resolver bündelt angeforderte IDs, führt bws secret list aus und gibt
Werte für passende geheime key-Felder zurück. Verwenden Sie Schlüssel, die den exec
SecretRef-ID-Vertrag erfüllen, etwa openclaw/providers/openai/apiKey; Env-Var-
Schlüssel im Stil mit Unterstrichen werden abgelehnt, bevor der Resolver ausgeführt wird. Wenn mehr
als ein sichtbares Bitwarden-Geheimnis denselben angeforderten Schlüssel hat, lässt der Resolver
diese ID wegen Mehrdeutigkeit fehlschlagen, statt eines auszuwählen. Prüfen Sie nach der Aktualisierung der Konfiguration
den Resolver-Pfad:
openclaw secrets audit --allow-execHashiCorp Vault CLI
{ secrets: { providers: { vault_openai: { source: "exec", command: "/opt/homebrew/bin/vault", allowSymlinkCommand: true, // required for Homebrew symlinked binaries trustedDirs: ["/opt/homebrew"], args: ["kv", "get", "-field=OPENAI_API_KEY", "secret/openclaw"], passEnv: ["VAULT_ADDR", "VAULT_TOKEN"], jsonOnly: false, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "vault_openai", id: "value" }, }, }, },}password-store (`pass`)
Verwenden Sie einen kleinen Resolver-Wrapper, wenn SecretRef-IDs direkt
pass-Einträgen zugeordnet werden sollen. Speichern Sie dies als ausführbare Datei in einem absoluten Pfad, der
Ihre exec-Provider-Pfadprüfungen besteht, zum Beispiel
/usr/local/bin/openclaw-pass-resolver. Der #!/usr/bin/env node-Shebang
löst node aus dem PATH des Resolver-Prozesses auf, nehmen Sie daher PATH in
passEnv auf. Wenn pass nicht in diesem PATH liegt, setzen Sie PASS_BIN in der übergeordneten
Umgebung und nehmen Sie es ebenfalls in passEnv auf:
#!/usr/bin/env nodeconst { spawnSync } = require("node:child_process"); let stdin = "";process.stdin.setEncoding("utf8");process.stdin.on("data", (chunk) => { stdin += chunk;});process.stdin.on("error", (err) => { process.stderr.write(`${err.message}\n`); process.exit(1);});process.stdin.on("end", () => { let request; try { request = JSON.parse(stdin || "{}"); } catch (err) { process.stderr.write(`Failed to parse request: ${err.message}\n`); process.exit(1); } const passBin = process.env.PASS_BIN || "pass"; const values = {}; const errors = {}; for (const id of request.ids ?? []) { const result = spawnSync(passBin, ["show", id], { encoding: "utf8" }); if (result.status === 0) { values[id] = result.stdout.split(/\r?\n/, 1)[0] ?? ""; } else { errors[id] = { message: (result.stderr || `pass exited ${result.status}`).trim() }; } } process.stdout.write(JSON.stringify({ protocolVersion: 1, values, errors }));});Konfigurieren Sie anschließend den exec-Provider und richten Sie apiKey auf den pass-Eintragspfad:
{ secrets: { providers: { pass_store: { source: "exec", command: "/usr/local/bin/openclaw-pass-resolver", passEnv: ["PATH", "HOME", "GNUPGHOME", "GPG_TTY", "PASSWORD_STORE_DIR", "PASS_BIN"], jsonOnly: true, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "pass_store", id: "openclaw/providers/openai/apiKey", }, }, }, },}Bewahren Sie das Geheimnis in der ersten Zeile des pass-Eintrags auf, oder passen Sie den
Wrapper an, wenn Sie stattdessen die vollständige Ausgabe von pass show zurückgeben möchten. Prüfen Sie nach
der Aktualisierung der Konfiguration sowohl das statische Audit als auch den exec-Resolver-Pfad:
openclaw secrets audit --checkopenclaw secrets audit --allow-execsops
{ secrets: { providers: { sops_openai: { source: "exec", command: "/opt/homebrew/bin/sops", allowSymlinkCommand: true, // required for Homebrew symlinked binaries trustedDirs: ["/opt/homebrew"], args: ["-d", "--extract", '["providers"]["openai"]["apiKey"]', "/path/to/secrets.enc.json"], passEnv: ["SOPS_AGE_KEY_FILE"], jsonOnly: false, }, }, }, models: { providers: { openai: { baseUrl: "https://api.openai.com/v1", models: [{ id: "gpt-5", name: "gpt-5" }], apiKey: { source: "exec", provider: "sops_openai", id: "value" }, }, }, },}MCP-Server-Umgebungsvariablen
MCP-Server-Env-Vars, die über plugins.entries.acpx.config.mcpServers konfiguriert sind, unterstützen SecretInput. Dadurch bleiben API-Schlüssel und Tokens außerhalb der Klartextkonfiguration:
{ plugins: { entries: { acpx: { enabled: true, config: { mcpServers: { github: { command: "npx", args: ["-y", "@modelcontextprotocol/server-github"], env: { GITHUB_PERSONAL_ACCESS_TOKEN: { source: "env", provider: "default", id: "MCP_GITHUB_PAT", }, }, }, }, }, }, }, },}Klartext-String-Werte funktionieren weiterhin. Env-Template-Refs wie ${MCP_SERVER_API_KEY} und SecretRef-Objekte werden während der Gateway-Aktivierung aufgelöst, bevor der MCP-Server-Prozess gestartet wird. Wie bei anderen SecretRef-Oberflächen blockieren nicht aufgelöste Refs die Aktivierung nur, wenn das acpx-Plugin effektiv aktiv ist.
SSH-Auth-Material für Sandbox
Das zentrale ssh-Sandbox-Backend unterstützt ebenfalls SecretRefs für SSH-Auth-Material:
{ agents: { defaults: { sandbox: { mode: "all", backend: "ssh", ssh: { target: "user@gateway-host:22", identityData: { source: "env", provider: "default", id: "SSH_IDENTITY" }, certificateData: { source: "env", provider: "default", id: "SSH_CERTIFICATE" }, knownHostsData: { source: "env", provider: "default", id: "SSH_KNOWN_HOSTS" }, }, }, }, },}Laufzeitverhalten:
- OpenClaw löst diese Refs während der Sandbox-Aktivierung auf, nicht verzögert bei jedem SSH-Aufruf.
- Aufgelöste Werte werden in temporäre Dateien mit restriktiven Berechtigungen geschrieben und in der generierten SSH-Konfiguration verwendet.
- Wenn das effektive Sandbox-Backend nicht
sshist, bleiben diese Refs inaktiv und blockieren den Start nicht.
Unterstützte Anmeldeinformationsoberfläche
Kanonisch unterstützte und nicht unterstützte Anmeldeinformationen sind hier aufgeführt:
Erforderliches Verhalten und Vorrang
- Feld ohne Ref: unverändert.
- Feld mit Ref: auf aktiven Oberflächen während der Aktivierung erforderlich.
- Wenn sowohl Klartext als auch Ref vorhanden sind, hat Ref auf unterstützten Vorrangpfaden Vorrang.
- Der Redaktions-Sentinel
__OPENCLAW_REDACTED__ist für interne Konfigurationsredaktion/-wiederherstellung reserviert und wird als wörtlich übermittelte Konfigurationsdaten abgelehnt.
Warn- und Audit-Signale:
SECRETS_REF_OVERRIDES_PLAINTEXT(Laufzeitwarnung)REF_SHADOWED(Audit-Befund, wennauth-profiles.json-Anmeldeinformationen Vorrang voropenclaw.json-Refs haben)
Google Chat-Kompatibilitätsverhalten:
serviceAccountRefhat Vorrang vor Klartext-serviceAccount.- Der Klartextwert wird ignoriert, wenn eine benachbarte Ref gesetzt ist.
Aktivierungsauslöser
Die Geheimnisaktivierung wird ausgeführt bei:
- Start (Preflight plus abschließende Aktivierung)
- Hot-Apply-Pfad beim Neuladen der Konfiguration
- Restart-Check-Pfad beim Neuladen der Konfiguration
- Manuellem Neuladen über
secrets.reload - Gateway-Konfigurationsschreib-RPC-Preflight (
config.set/config.apply/config.patch) für die Auflösbarkeit von SecretRefs auf aktiven Oberflächen innerhalb der übermittelten Konfigurationsnutzlast vor dem Persistieren von Änderungen
Aktivierungsvertrag:
- Erfolg tauscht den Snapshot atomar aus.
- Ein Startfehler bricht den Gateway-Start ab.
- Ein Laufzeit-Neuladefehler behält den zuletzt bekannten funktionsfähigen Snapshot bei.
- Ein Write-RPC-Preflight-Fehler lehnt die übermittelte Konfiguration ab und lässt sowohl die Datenträgerkonfiguration als auch den aktiven Laufzeit-Snapshot unverändert.
- Das Bereitstellen eines expliziten Kanal-Tokens pro Aufruf für einen ausgehenden Helper-/Tool-Aufruf löst keine SecretRef-Aktivierung aus; Aktivierungspunkte bleiben Start, Neuladen und explizites
secrets.reload.
Signale für beeinträchtigten und wiederhergestellten Zustand
Wenn die Aktivierung beim Neuladen nach einem fehlerfreien Zustand fehlschlägt, wechselt OpenClaw in einen beeinträchtigten Geheimniszustand.
Einmalige Systemereignis- und Protokollcodes:
SECRETS_RELOADER_DEGRADEDSECRETS_RELOADER_RECOVERED
Verhalten:
- Beeinträchtigt: Die Laufzeit behält den zuletzt bekannten funktionsfähigen Snapshot bei.
- Wiederhergestellt: Wird einmal nach der nächsten erfolgreichen Aktivierung ausgegeben.
- Wiederholte Fehler, während der Zustand bereits beeinträchtigt ist, protokollieren Warnungen, erzeugen aber keine Ereignisflut.
- Start-Fail-Fast gibt keine Ereignisse für beeinträchtigten Zustand aus, weil die Laufzeit nie aktiv wurde.
Befehlspfadauflösung
Befehlspfade können sich über Gateway-Snapshot-RPC für unterstützte SecretRef-Auflösung entscheiden.
Es gibt zwei allgemeine Verhaltensweisen:
Strikte Befehlspfade
Zum Beispiel openclaw memory-Remote-Memory-Pfade und openclaw qr --remote, wenn Remote-Shared-Secret-Refs benötigt werden. Sie lesen aus dem aktiven Snapshot und schlagen schnell fehl, wenn eine erforderliche SecretRef nicht verfügbar ist.
Schreibgeschützte Befehlspfade
Zum Beispiel openclaw status, openclaw status --all, openclaw channels status, openclaw channels resolve, openclaw security audit und schreibgeschützte Doctor-/Konfigurationsreparatur-Flows. Sie bevorzugen ebenfalls den aktiven Snapshot, werden aber eingeschränkt fortgesetzt, statt abzubrechen, wenn eine gezielte SecretRef in diesem Befehlspfad nicht verfügbar ist.
Schreibgeschütztes Verhalten:
- Wenn der Gateway läuft, lesen diese Befehle zuerst aus dem aktiven Snapshot.
- Wenn die Gateway-Auflösung unvollständig ist oder der Gateway nicht verfügbar ist, versuchen sie einen gezielten lokalen Fallback für die spezifische Befehlsoberfläche.
- Wenn eine gezielte SecretRef weiterhin nicht verfügbar ist, wird der Befehl mit eingeschränkter schreibgeschützter Ausgabe und ausdrücklicher Diagnose wie „konfiguriert, aber in diesem Befehlspfad nicht verfügbar“ fortgesetzt.
- Dieses eingeschränkte Verhalten ist nur befehlslokal. Es schwächt keine Laufzeit-Start-, Reload- oder Sende-/Authentifizierungspfade ab.
Weitere Hinweise:
- Die Snapshot-Aktualisierung nach einer Secret-Rotation im Backend wird von
openclaw secrets reloadbehandelt. - Von diesen Befehlspfaden verwendete Gateway-RPC-Methode:
secrets.resolve.
Audit- und Konfigurationsworkflow
Standardmäßiger Operator-Flow:
Aktuellen Zustand auditieren
openclaw secrets audit --checkSecretRefs konfigurieren und anwenden
openclaw secrets configure --applyErneut auditieren
openclaw secrets audit --checkBetrachten Sie die Migration erst als abgeschlossen, wenn der erneute Audit sauber ist. Wenn der Audit weiterhin Klartextwerte im Ruhezustand meldet, besteht das Risiko des Agent-Zugriffs weiterhin, auch wenn Laufzeit-APIs redigierte Werte zurückgeben.
Wenn Sie während configure einen Plan speichern, statt ihn anzuwenden, wenden Sie diesen gespeicherten Plan
vor dem erneuten Audit mit openclaw secrets apply --from <plan-path> an.
secrets audit
Befunde umfassen:
- Klartextwerte im Ruhezustand (
openclaw.json,auth-profiles.json,.envund generierteagents/*/agent/models.json) - Klartextreste sensibler Provider-Header in generierten
models.json-Einträgen - nicht aufgelöste Refs
- Prioritätsverschattung (
auth-profiles.jsonhat Vorrang voropenclaw.json-Refs) - Legacy-Reste (
auth.json, OAuth-Erinnerungen)
Exec-Hinweis:
- Standardmäßig überspringt der Audit Auflösbarkeitsprüfungen für exec-SecretRefs, um Nebenwirkungen von Befehlen zu vermeiden.
- Verwenden Sie
openclaw secrets audit --allow-exec, um exec-Provider während des Audits auszuführen.
Hinweis zu Header-Resten:
- Die Erkennung sensibler Provider-Header basiert auf Namensheuristiken (gängige Authentifizierungs-/Zugangsdaten-Headernamen und Fragmente wie
authorization,x-api-key,token,secret,passwordundcredential).
secrets configure
Interaktiver Helfer, der:
- zuerst
secrets.providerskonfiguriert (env/file/exec, hinzufügen/bearbeiten/entfernen) - Sie unterstützte Felder mit Secrets in
openclaw.jsonplusauth-profiles.jsonfür einen Agent-Scope auswählen lässt - direkt in der Zielauswahl eine neue
auth-profiles.json-Zuordnung erstellen kann - SecretRef-Details erfasst (
source,provider,id) - Preflight-Auflösung ausführt
- sofort anwenden kann
Exec-Hinweis:
- Preflight überspringt exec-SecretRef-Prüfungen, sofern
--allow-execnicht gesetzt ist. - Wenn Sie direkt aus
configure --applyanwenden und der Plan exec-Refs/-Provider enthält, lassen Sie--allow-execauch für den Anwendungsschritt gesetzt.
Hilfreiche Modi:
openclaw secrets configure --providers-onlyopenclaw secrets configure --skip-provider-setupopenclaw secrets configure --agent <id>
configure-Anwendungsstandards:
- passende statische Zugangsdaten aus
auth-profiles.jsonfür gezielte Provider bereinigen - statische Legacy-
api_key-Einträge ausauth.jsonbereinigen - passende bekannte Secret-Zeilen aus
<config-dir>/.envbereinigen
secrets apply
Einen gespeicherten Plan anwenden:
openclaw secrets apply --from /tmp/openclaw-secrets-plan.jsonopenclaw secrets apply --from /tmp/openclaw-secrets-plan.json --allow-execopenclaw secrets apply --from /tmp/openclaw-secrets-plan.json --dry-runopenclaw secrets apply --from /tmp/openclaw-secrets-plan.json --dry-run --allow-execExec-Hinweis:
- dry-run überspringt exec-Prüfungen, sofern
--allow-execnicht gesetzt ist. - Der Schreibmodus weist Pläne zurück, die exec-SecretRefs/-Provider enthalten, sofern
--allow-execnicht gesetzt ist.
Details zum strikten Ziel-/Pfadvertrag und genaue Zurückweisungsregeln finden Sie unter Secrets Apply Plan-Vertrag.
Einweg-Sicherheitsrichtlinie
Sicherheitsmodell:
- Preflight muss erfolgreich sein, bevor der Schreibmodus verwendet wird
- Laufzeitaktivierung wird vor dem Commit validiert
- Apply aktualisiert Dateien mit atomarer Dateiersetzung und Best-Effort-Wiederherstellung bei Fehlern
Hinweise zur Legacy-Auth-Kompatibilität
Für statische Zugangsdaten hängt die Laufzeit nicht mehr von Klartext-Legacy-Auth-Speicher ab.
- Die Quelle für Laufzeit-Zugangsdaten ist der aufgelöste In-Memory-Snapshot.
- Statische Legacy-
api_key-Einträge werden bereinigt, wenn sie entdeckt werden. - OAuth-bezogenes Kompatibilitätsverhalten bleibt getrennt.
Hinweis zur Web-UI
Einige SecretInput-Unions lassen sich im Roh-Editor-Modus leichter konfigurieren als im Formularmodus.
Verwandte Themen
- Authentifizierung — Auth-Einrichtung
- CLI: secrets — CLI-Befehle
- Umgebungsvariablen — Umgebungspriorität
- SecretRef-Zugangsdatenoberfläche — Zugangsdatenoberfläche
- Secrets Apply Plan-Vertrag — Details zum Planvertrag
- Sicherheit — Sicherheitsstatus