Gateway
Verwaltung von Geheimnissen
OpenClaw unterstützt additive SecretRefs, sodass unterstützte Zugangsdaten nicht im Klartext in der Konfiguration gespeichert werden müssen.
Laufzeitmodell
- Geheimnisse werden während der Aktivierung vorab in einen speicherinternen Laufzeit-Snapshot aufgelöst, nicht erst bei Bedarf in Anfragepfaden.
- Der Start schlägt sofort fehl, wenn eine tatsächlich aktive SecretRef nicht aufgelöst werden kann.
- Ein Neuladen erfolgt als atomarer Austausch: entweder vollständig erfolgreich oder der letzte als funktionsfähig bekannte Snapshot bleibt erhalten.
- Richtlinienverstöße (beispielsweise ein Authentifizierungsprofil im OAuth-Modus in Kombination mit einer SecretRef-Eingabe) lassen die Aktivierung vor dem Austausch des Laufzeit-Snapshots fehlschlagen.
- Laufzeitanfragen lesen ausschließlich den aktiven speicherinternen Snapshot. SecretRef-Zugangsdaten für Modell-Provider werden bis zur ausgehenden Übertragung als prozesslokale Sentinel-Werte durch den Authentifizierungsspeicher und die Stream-Optionen weitergegeben. Ausgehende Zustellungspfade (Discord-Antwort-/Thread-Zustellung, das Senden von Telegram-Aktionen) lesen ebenfalls diesen Snapshot und lösen Referenzen nicht bei jedem Sendevorgang erneut auf.
Dadurch wirken sich Ausfälle von Geheimnis-Providern nicht auf häufig genutzte Anfragepfade aus.
Injektion bei der ausgehenden Übertragung (Sentinel-Werte)
Für Zugangsdaten von Modell-Providern, die auf SecretRefs basieren, erzeugt OpenClaw während der Auflösung der Modellauthentifizierung einen undurchsichtigen, prozesslokalen Sentinel-Wert. Authentifizierungsspeicher, Stream-Optionen, SDK-Konfiguration, Protokolle, Fehlerobjekte und die meisten Laufzeitinspektionen sehen daher einen Wert wie oc-sent-v1-... statt der Zugangsdaten des Providers. Der abgesicherte Modellabruf und verwaltete Zustandsprüfungen lokaler Provider ersetzen bekannte Sentinel-Werte in URL- und Header-Werten unmittelbar bevor die jeweilige Anfrage den Prozess verlässt.
Unbekannte Werte im Sentinel-Format führen vor jeglicher Netzwerkaktivität zu einem sicheren Abbruch. OpenClaw verweigert das Senden der Anfrage, statt einen nicht aufgelösten Sentinel-Wert an einen Provider weiterzuleiten. Aufgelöste Geheimniswerte werden außerdem zur exakten wertbasierten Schwärzung in Protokollen registriert, um eine zusätzliche Schutzebene zu schaffen.
Provider-Adapter verwenden den spätestmöglichen Injektionspunkt, den ihr SDK unterstützt:
- SDKs mit einer benutzerdefinierten Fetch-Option erhalten den abgesicherten Fetch von OpenClaw, sodass das SDK den Sentinel-Wert beibehält.
- SDKs ohne benutzerdefinierte Fetch-Option entpacken den Sentinel-Wert unmittelbar vor der Client-Erstellung. Plugin-eigene Provider-Streams und Agent-Harnesses entpacken ihn bei der letzten vom Kern verwalteten Übergabe, da diese Transporte den abgesicherten Fetch von OpenClaw nicht gemeinsam nutzen.
Sentinel-Werte verringern die Klartextexposition entlang der Modellaufrufkette, stellen jedoch keine Prozessisolierung dar. Der echte Wert ist weiterhin im Speicher desselben Prozesses vorhanden und erscheint an der abschließenden Adaptergrenze. Einfache Umgebungs-Zugangsdaten, die nicht über SecretRefs konfiguriert sind, bleiben im Klartext und fallen nicht unter diesen Mechanismus.
Setzen Sie OPENCLAW_SECRET_SENTINELS=off (akzeptiert ohne Berücksichtigung der Groß-/Kleinschreibung auch 0 oder false), um die Erzeugung von Sentinel-Werten bei der Reaktion auf Vorfälle oder bei der Behebung von Kompatibilitätsproblemen zu deaktivieren. Der Notausschalter deaktiviert nicht die Registrierung für die exakte wertbasierte Schwärzung.
Grenze des Agentenzugriffs
SecretRefs verhindern, dass Zugangsdaten in Konfigurationsdateien und generierten Modelldateien gespeichert werden, stellen jedoch keine Prozessisolierungsgrenze dar. Klartext-Zugangsdaten, die auf dem Datenträger in einem für den Agenten lesbaren Pfad verbleiben, können weiterhin über Datei- oder Shell-Werkzeuge gelesen werden, wodurch die Schwärzung auf API-Ebene umgangen wird.
Betrachten Sie bei Produktionsbereitstellungen, in denen für Agenten zugängliche Dateien relevant sind, die Migration erst dann als abgeschlossen, wenn alle folgenden Bedingungen erfüllt sind:
- Unterstützte Zugangsdaten verwenden SecretRefs anstelle von Klartextwerten.
- Veraltete Klartextreste wurden aus
openclaw.json,auth-profiles.json,.envund generiertenmodels.json-Dateien entfernt. openclaw secrets audit --checkmeldet nach der Migration keine Probleme.- Alle verbleibenden nicht unterstützten oder rotierenden Zugangsdaten werden durch Betriebssystemisolierung, Containerisolierung oder einen externen Zugangsdaten-Proxy geschützt.
Deshalb ist der Audit-/Konfigurations-/Anwendungs-Workflow ein Sicherheitstor für die Migration und nicht nur eine Komfortfunktion.
Filterung aktiver Oberflächen
SecretRefs werden nur auf tatsächlich aktiven Oberflächen validiert:
- Aktivierte Oberflächen: Nicht aufgelöste Referenzen blockieren den Start/das Neuladen.
- Inaktive Oberflächen: Nicht aufgelöste Referenzen blockieren den Start/das Neuladen nicht; sie erzeugen eine nicht schwerwiegende
SECRETS_REF_IGNORED_INACTIVE_SURFACE-Diagnose.
Beispiele für inaktive Oberflächen
- Deaktivierte Kanal-/Kontoeinträge.
- Zugangsdaten auf oberster Kanalebene, die von keinem aktivierten Konto übernommen werden.
- Deaktivierte Werkzeug-/Funktionsoberflächen.
- Providerspezifische Schlüssel für die Websuche, die nicht durch
tools.web.search.providerausgewählt wurden. Im automatischen Modus (Provider nicht festgelegt) werden die Schlüssel in ihrer Rangfolge zur automatischen Erkennung herangezogen, bis einer aufgelöst wird; nach der Auswahl sind die Schlüssel nicht ausgewählter Provider inaktiv. - SSH-Authentifizierungsmaterial für die Sandbox (
agents.defaults.sandbox.ssh.identityData,certificateData,knownHostsDatasowie agentenspezifische Überschreibungen) ist nur aktiv, wenn das tatsächlich verwendete Sandbox-Backendsshist und der Sandbox-Modus weder für den Standard-Agenten noch für einen aktivierten Agenten aufoffgesetzt ist. - SecretRefs für
gateway.remote.token/gateway.remote.passwordsind aktiv, wenn eine der folgenden Bedingungen erfüllt ist: gateway.mode=remotegateway.remote.urlist konfiguriertgateway.tailscale.modeistserveoderfunnel- Im lokalen Modus ohne diese Remote-Oberflächen:
gateway.remote.tokenist aktiv, wenn Token-Authentifizierung Vorrang haben kann und kein Umgebungs-/Authentifizierungstoken konfiguriert ist;gateway.remote.passwordist nur aktiv, wenn Passwortauthentifizierung Vorrang haben kann und kein Umgebungs-/Authentifizierungspasswort konfiguriert ist. - Die SecretRef
gateway.auth.tokenist für die Auflösung der Startauthentifizierung inaktiv, wennOPENCLAW_GATEWAY_TOKENgesetzt ist, da die Token-Eingabe aus der Umgebung für diese Laufzeit Vorrang hat.
Diagnose der Gateway-Authentifizierungsoberflächen
Wenn eine SecretRef für gateway.auth.token, gateway.auth.password, gateway.remote.token oder gateway.remote.password festgelegt ist, protokolliert der Gateway-Start bzw. das Neuladen den Oberflächenstatus unter dem Code SECRETS_GATEWAY_AUTH_SURFACE:
active: Die SecretRef ist Teil der tatsächlich verwendeten Authentifizierungsoberfläche und muss aufgelöst werden.inactive: Eine andere Authentifizierungsoberfläche hat Vorrang oder die Remote-Authentifizierung ist deaktiviert/nicht aktiv.
Der Protokolleintrag enthält den Grund, den die Richtlinie für aktive Oberflächen verwendet hat.
Vorabprüfung von Referenzen beim Onboarding
Wenn Sie beim interaktiven Onboarding die Speicherung als SecretRef auswählen, wird vor dem Speichern eine Vorabvalidierung ausgeführt:
- Umgebungsreferenzen: Der Name der Umgebungsvariable wird validiert und es wird bestätigt, dass während der Einrichtung ein nicht leerer Wert sichtbar ist.
- Provider-Referenzen (
fileoderexec): Die Provider-Auswahl wird validiert,idwird aufgelöst und der Typ des aufgelösten Werts wird geprüft. - Schnellstart-Workflow: Wenn
gateway.auth.tokenbereits eine SecretRef ist, löst das Onboarding sie vor der Initialisierung der Prüfung/des Dashboards mit derselben Sofortabbruchprüfung auf (fürenv-,file- undexec-Referenzen).
Bei einem Validierungsfehler wird der Fehler angezeigt und Sie können es erneut versuchen.
SecretRef-Vertrag
Überall dieselbe Objektstruktur:
{ source: "env" | "file" | "exec", provider: "default", id: "..." }env
{ source: "env", provider: "default", id: "OPENAI_API_KEY" }Kurzschreibweisen als Zeichenfolgen werden in SecretInput-Feldern ebenfalls akzeptiert:
"${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-Zeiger (/...) oder fürsingleValue-Provider das Literalvaluesein- RFC-6901-Escaping in Segmenten:
~wird zu~0,/wird zu~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 (beispielsweise wirda/../babgelehnt)
Provider-Konfiguration
Definieren Sie Provider unter secrets.providers:
{ secrets: { providers: { default: { source: "env" }, filemain: { source: "file", path: "~/.openclaw/secrets.json", mode: "json", // oder "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, }, },}Umgebungs-Provider
- Optionale Positivliste exakter Namen über
allowlist. - Fehlende oder leere Umgebungswerte lassen die Auflösung fehlschlagen.
Datei-Provider
- Liest die lokale Datei unter
path. mode: "json"(Standard) erwartet eine JSON-Objektnutzlast und löstidals JSON-Zeiger auf.mode: "singleValue"erwartet die Referenz-ID"value"und gibt den unverarbeiteten Dateiinhalt zurück (abschließender Zeilenumbruch wird entfernt).- Der Pfad muss Eigentums-/Berechtigungsprüfungen bestehen;
timeoutMs(Standard 5000) undmaxBytes(Standard 1 MiB) begrenzen den Lesevorgang. - Sicherer Abbruch unter Windows: Wenn die ACL-Prüfung für den Pfad nicht verfügbar ist, schlägt die Auflösung fehl. Legen Sie ausschließlich für vertrauenswürdige Pfade
allowInsecurePath: truefür diesen Provider fest, um die Prüfung zu umgehen.
Exec-Provider
- Führt den konfigurierten absoluten Binärpfad direkt und ohne Shell aus.
- Standardmäßig muss
commandeine reguläre Datei und darf kein symbolischer Link sein. Legen SieallowSymlinkCommand: truefest, um Befehlspfade über symbolische Links zuzulassen (beispielsweise Homebrew-Shims), und kombinieren Sie dies mittrustedDirs(beispielsweise["/opt/homebrew"]), sodass nur Pfade des Paketmanagers zulässig sind. - Unterstützt
timeoutMs(Standard 5000),noOutputTimeoutMs(standardmäßig gleichtimeoutMs),maxOutputBytes(Standard 1 MiB), eine Positivliste fürenv/passEnvsowietrustedDirs. jsonOnlyist standardmäßigtrue. BeijsonOnly: falseund genau einer angeforderten ID wird eine einfache Nicht-JSON-Standardausgabe als Wert dieser ID akzeptiert.- Sicherer Abbruch unter Windows: Wenn die ACL-Prüfung für den Befehlspfad nicht verfügbar ist, schlägt die Auflösung fehl. Legen Sie ausschließlich für vertrauenswürdige Pfade
allowInsecurePath: truefür diesen Provider fest, um die Prüfung zu umgehen. - Von Plugins verwaltete Exec-Provider können
pluginIntegrationanstelle eines kopiertencommand/argsverwenden. OpenClaw löst die aktuellen Befehlsdetails während des Starts/Neuladens aus dem Manifest des installierten Plugins auf. Wenn das Plugin deaktiviert, entfernt oder nicht vertrauenswürdig ist oder die Integration nicht mehr deklariert, führen aktive SecretRefs für diesen Provider zu einem sicheren Abbruch.
Anfragenutzlast (Standardeingabe):
{ "protocolVersion": 1, "provider": "vault", "ids": ["providers/openai/apiKey"] }Antwortnutzlast (Standardausgabe):
{ "protocolVersion": 1, "values": { "providers/openai/apiKey": "<openai-api-key>" } } // pragma: allowlist secretOptionale Fehler pro ID:
{"protocolVersion": 1,"values": {},"errors": { "providers/openai/apiKey": { "code": "NOT_FOUND" } }}code ist eine optionale maschinenlesbare Diagnose. OpenClaw zeigt die erkannten
Codes NOT_FOUND und AMBIGUOUS_DUPLICATE_KEY zusammen mit dem Provider und der Referenz-ID an. Andere
Codes und frei definierbare Felder wie message werden aus Gründen der Protokoll-v1-Kompatibilität akzeptiert,
aber nicht angezeigt, da die Resolver-Ausgabe Zugangsdaten enthalten kann.
Dateibasierte API-Schlüssel
Setzen Sie keine file:...-Zeichenfolgen in den Konfigurationsblock env. Dieser Block ist literal und überschreibt nichts, daher wird file:... dort niemals aufgelöst.
Verwenden Sie stattdessen eine Datei-SecretRef in einem unterstützten Anmeldedatenfeld:
{ 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" lautet die SecretRef-id "value". Verwenden Sie für mode: "json" einen absoluten JSON-Zeiger wie "/providers/xai/apiKey".
Die Felder, die SecretRefs akzeptieren, finden Sie unter SecretRef-Anmeldedatenoberfläche.
Beispiele für die Exec-Integration
1Password CLI
{ secrets: { providers: { onepassword_openai: { source: "exec", command: "/opt/homebrew/bin/op", allowSymlinkCommand: true, // erforderlich für über Homebrew verknüpfte Binärdateien 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, um SecretRef-IDs den Elementschlüsseln von Bitwarden Secrets Manager zuzuordnen. Das Repository enthält scripts/secrets/openclaw-bws-resolver.mjs; installieren oder kopieren Sie ihn in einen absoluten vertrauenswürdigen Pfad auf dem Host, auf dem der Gateway ausgeführt wird.
Voraussetzungen:
- Die Bitwarden Secrets Manager CLI (
bws) ist auf dem Gateway-Host installiert. BWS_ACCESS_TOKENsteht dem Gateway-Dienst zur Verfügung.PATHwird an den Resolver übergeben oderBWS_BINist auf den absoluten Pfad derbws-Binärdatei gesetzt.BWS_SERVER_URList bei Verwendung einer selbst gehosteten Bitwarden-Instanz in der Umgebung gesetzt.
{ 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 die angeforderten IDs, führt bws secret list aus und gibt Werte für übereinstimmende geheime key-Felder zurück. Verwenden Sie Schlüssel, die dem ID-Vertrag der Exec-SecretRef entsprechen, etwa openclaw/providers/openai/apiKey; Schlüssel im Stil von Umgebungsvariablen mit Unterstrichen werden abgelehnt, bevor der Resolver ausgeführt wird. Wenn mehrere sichtbare Bitwarden-Secrets denselben angeforderten Schlüssel verwenden, meldet der Resolver diese ID als mehrdeutig, anstatt zu raten. Überprü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, // erforderlich für über Homebrew verknüpfte Binärdateien 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, um SecretRef-IDs direkt pass-Einträgen zuzuordnen. Speichern Sie ihn als ausführbare Datei unter einem absoluten Pfad, der Ihre Pfadprüfungen für Exec-Provider besteht, beispielsweise /usr/local/bin/openclaw-pass-resolver. Die Shebang #!/usr/bin/env node löst node über den PATH des Resolver-Prozesses auf; nehmen Sie daher PATH in passEnv auf. Wenn pass nicht in diesem PATH enthalten ist, 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(`Anfrage konnte nicht geparst werden: ${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 wurde mit ${result.status} beendet`).trim() }; } } process.stdout.write(JSON.stringify({ protocolVersion: 1, values, errors }));});Konfigurieren Sie anschließend den Exec-Provider und verweisen Sie mit apiKey auf den Pfad des pass-Eintrags:
{ 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", }, }, }, },}Belassen Sie das Secret in der ersten Zeile des pass-Eintrags oder passen Sie den Wrapper so an, dass stattdessen die vollständige Ausgabe von pass show zurückgegeben wird. Überprüfen Sie nach der Aktualisierung der Konfiguration sowohl das statische Audit als auch den Pfad des Exec-Resolvers:
openclaw secrets audit --checkopenclaw secrets audit --allow-execsops
{ secrets: { providers: { sops_openai: { source: "exec", command: "/opt/homebrew/bin/sops", allowSymlinkCommand: true, // erforderlich für über Homebrew verknüpfte Binärdateien 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" }, }, }, },}Umgebungsvariablen für MCP-Server
Über plugins.entries.acpx.config.mcpServers konfigurierte Umgebungsvariablen für MCP-Server akzeptieren SecretInput, sodass API-Schlüssel und Token nicht im Klartext in der Konfiguration stehen:
{ 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", }, }, }, }, }, }, }, },}Zeichenfolgenwerte im Klartext funktionieren weiterhin. Referenzen aus Umgebungsvorlagen wie ${MCP_SERVER_API_KEY} und SecretRef-Objekte werden während der Gateway-Aktivierung aufgelöst, bevor der MCP-Serverprozess gestartet wird. Wie bei anderen SecretRef-Oberflächen blockieren nicht aufgelöste Referenzen die Aktivierung nur, wenn das acpx-Plugin tatsächlich aktiv ist.
SSH-Authentifizierungsmaterial für die Sandbox
Das zentrale ssh-Sandbox-Backend unterstützt auch SecretRefs für SSH-Authentifizierungsmaterial:
{ 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 Referenzen während der Sandbox-Aktivierung auf, nicht verzögert bei jedem SSH-Aufruf.
- Aufgelöste Werte werden mit restriktiven Dateiberechtigungen (
0o600) in ein temporäres Verzeichnis geschrieben und in der generierten SSH-Konfiguration verwendet. - Wenn das tatsächlich verwendete Sandbox-Backend nicht
sshist (oder der Sandbox-Modusofflautet), bleiben diese Referenzen inaktiv und blockieren den Start nicht.
Unterstützte Anmeldedatenoberfläche
Die kanonisch unterstützten und nicht unterstützten Anmeldedaten sind unter SecretRef-Anmeldedatenoberfläche aufgeführt.
Erforderliches Verhalten und Priorität
- Feld ohne Referenz: unverändert.
- Feld mit Referenz: auf aktiven Oberflächen während der Aktivierung erforderlich.
- Wenn sowohl Klartext als auch eine Referenz vorhanden sind, hat die Referenz auf unterstützten Prioritätspfaden Vorrang.
- Der Schwärzungs-Sentinel
__OPENCLAW_REDACTED__ist für die interne Schwärzung/Wiederherstellung der Konfiguration reserviert und wird als literal übermittelte Konfigurationsangabe abgelehnt.
Warn- und Auditsignale:
SECRETS_REF_OVERRIDES_PLAINTEXT(Laufzeitwarnung)REF_SHADOWED(Audit-Feststellung, wenn Anmeldedaten ausauth-profiles.jsonVorrang vor Referenzen ausopenclaw.jsonhaben)
Google-Chat-Kompatibilität: serviceAccountRef hat Vorrang vor serviceAccount im Klartext; der Klartextwert wird ignoriert, sobald die gleichgeordnete Referenz gesetzt ist.
Aktivierungsauslöser
Die Secret-Aktivierung wird ausgelöst bei:
- Start (Vorabprüfung und abschließende Aktivierung)
- Hot-Apply-Pfad beim Neuladen der Konfiguration
- Neustartprüfungspfad beim Neuladen der Konfiguration
- Manuellem Neuladen über
secrets.reload - Vorabprüfung des Gateway-RPC zum Schreiben der Konfiguration (
config.set/config.apply/config.patch), wobei vor dem Speichern von Änderungen geprüft wird, ob SecretRefs auf aktiven Oberflächen innerhalb der übermittelten Konfigurationsnutzlast aufgelöst werden können
Aktivierungsvertrag:
- Bei Erfolg wird der Snapshot atomar ausgetauscht.
- Ein Fehler beim Start bricht den Gateway-Start ab.
- Bei einem Fehler beim Neuladen zur Laufzeit bleibt der letzte bekanntermaßen funktionsfähige Snapshot erhalten.
- Schlägt die Vorabprüfung des Schreib-RPC fehl, wird die übermittelte Konfiguration abgelehnt; sowohl die Konfiguration auf dem Datenträger als auch der aktive Laufzeit-Snapshot bleiben unverändert.
- Die Angabe eines expliziten, aufrufsspezifischen Kanal-Tokens für einen ausgehenden Helfer-/Tool-Aufruf löst keine SecretRef-Aktivierung aus; die Aktivierungspunkte bleiben der Start, das Neuladen und der explizite Aufruf von
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 Secret-Zustand und gibt einmalige Systemereignisse und Protokollcodes aus:
SECRETS_RELOADER_DEGRADEDSECRETS_RELOADER_RECOVERED
Verhalten:
- Beeinträchtigt: Die Laufzeit behält den letzten bekanntermaßen funktionsfähigen Snapshot bei.
- Wiederhergestellt: Wird nach der nächsten erfolgreichen Aktivierung einmalig ausgegeben.
- Wiederholte Fehler, während bereits eine Beeinträchtigung besteht, werden als Warnungen protokolliert, lösen das Ereignis jedoch nicht erneut aus.
- Ein schneller Abbruch beim Start löst niemals ein Ereignis für eine Beeinträchtigung aus, da die Laufzeit nie aktiv wurde.
Auflösung von Befehlspfaden
Befehlspfade können sich über einen Gateway-Snapshot-RPC für die unterstützte SecretRef-Auflösung entscheiden. Dabei gelten zwei allgemeine Verhaltensweisen:
Strikte Befehlspfade
Dazu gehören beispielsweise Remote-Speicherpfade von openclaw memory und openclaw qr --remote, wenn der Befehl Verweise auf entfernte gemeinsame Geheimnisse benötigt. Sie lesen aus dem aktiven Snapshot und brechen sofort ab, wenn eine erforderliche SecretRef nicht verfügbar ist.
Schreibgeschützte Befehlspfade
Dazu gehören beispielsweise openclaw status, openclaw status --all, openclaw channels status, openclaw channels resolve, openclaw security audit sowie schreibgeschützte Doctor-/Konfigurationsreparaturabläufe. Sie bevorzugen ebenfalls den aktiven Snapshot, arbeiten jedoch mit eingeschränkter Funktionalität weiter, statt abzubrechen, wenn eine bestimmte SecretRef nicht verfügbar ist.
Schreibgeschütztes Verhalten:
- Wenn das Gateway ausgeführt wird, lesen diese Befehle zuerst aus dem aktiven Snapshot.
- Wenn die Gateway-Auflösung unvollständig oder das Gateway nicht verfügbar ist, versuchen sie einen gezielten lokalen Fallback für die jeweilige Befehlsoberfläche.
- Wenn eine bestimmte SecretRef weiterhin nicht verfügbar ist, wird der Befehl mit eingeschränkter schreibgeschützter Ausgabe und einer ausdrücklichen Diagnose fortgesetzt, dass der Verweis konfiguriert, in diesem Befehlspfad jedoch nicht verfügbar ist.
- Dieses eingeschränkte Verhalten gilt nur lokal für den jeweiligen Befehl; es schwächt weder den Laufzeitstart noch Neulade-, Sende- oder Authentifizierungspfade.
Weitere Hinweise:
- Die Aktualisierung des Snapshots nach der Rotation eines Geheimnisses im Backend erfolgt über
openclaw secrets reload. - Von diesen Befehlspfaden verwendete Gateway-RPC-Methode:
secrets.resolve.
Audit- und Konfigurationsablauf
Standardablauf für Betreiber:
Aktuellen Zustand prüfen
openclaw secrets audit --checkSecretRefs konfigurieren und anwenden
openclaw secrets configure --applyErneut prüfen
openclaw secrets audit --checkBetrachten Sie die Migration erst dann als abgeschlossen, wenn die erneute Prüfung keine Beanstandungen ergibt. Wenn das Audit weiterhin unverschlüsselte gespeicherte Werte meldet, besteht das Risiko des Agentenzugriffs fort, selbst wenn Laufzeit-APIs geschwärzte Werte zurückgeben.
Wenn Sie während configure einen Plan speichern, statt ihn anzuwenden, wenden Sie diesen gespeicherten Plan vor der erneuten Prüfung mit openclaw secrets apply --from <plan-path> an.
secrets audit
Die Befunde umfassen:
- Unverschlüsselte gespeicherte Werte (
openclaw.json,auth-profiles.json,.envund generierteagents/*/agent/models.json). - Verbliebene unverschlüsselte sensible Provider-Header in generierten
models.json-Einträgen. - Nicht aufgelöste Verweise.
- Überschattung durch Vorrangregeln (
auth-profiles.jsonhat Vorrang vor Verweisen inopenclaw.json). - Veraltete Überreste (
auth.json, OAuth-Erinnerungen).
Hinweis zu Exec: Standardmäßig überspringt das Audit Prüfungen der Auflösbarkeit von Exec-SecretRefs, um Nebeneffekte durch Befehle zu vermeiden. Verwenden Sie openclaw secrets audit --allow-exec, um Exec-Provider während des Audits auszuführen.
Hinweis zu Header-Überresten: Die Erkennung sensibler Provider-Header basiert auf Heuristiken für Namen (gängige Namen von Authentifizierungs-/Anmeldedaten-Headern sowie Fragmente wie authorization, x-api-key, token, secret, password und credential).
secrets configure
Interaktive Hilfsfunktion, die:
- Zuerst
secrets.providerskonfiguriert (env/file/exec, hinzufügen/bearbeiten/entfernen). - Sie unterstützte geheimnishaltige Felder in
openclaw.jsonsowieauth-profiles.jsonfür einen Agentenbereich auswählen lässt. - Direkt in der Zielauswahl eine neue
auth-profiles.json-Zuordnung erstellen kann. - SecretRef-Details (
source,provider,id) erfasst. - Eine Vorabauflösung durchführt und die Konfiguration sofort anwenden kann.
Hinweis zu Exec: Die Vorabprüfung überspringt Prüfungen von Exec-SecretRefs, sofern --allow-exec nicht gesetzt ist. Wenn Sie direkt über configure --apply anwenden und der Plan Exec-Verweise/-Provider enthält, lassen Sie --allow-exec auch für den Anwendungsschritt gesetzt.
Hilfreiche Modi:
openclaw secrets configure --providers-onlyopenclaw secrets configure --skip-provider-setupopenclaw secrets configure --agent <id>
Standardeinstellungen beim Anwenden mit configure:
- Übereinstimmende statische Anmeldedaten für die betreffenden Provider aus
auth-profiles.jsonentfernen. - Veraltete statische
api_key-Einträge ausauth.jsonentfernen. - Übereinstimmende bekannte Geheimniszeilen aus
<config-dir>/.enventfernen.
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-execHinweis zu Exec: Der Probelauf überspringt Exec-Prüfungen, sofern --allow-exec nicht gesetzt ist; der Schreibmodus lehnt Pläne mit Exec-SecretRefs/-Providern ab, sofern --allow-exec nicht gesetzt ist.
Einzelheiten zum strikten Ziel-/Pfadvertrag und die genauen Ablehnungsregeln finden Sie unter Vertrag für den Plan zur Anwendung von Geheimnissen.
Einweg-Sicherheitsrichtlinie
Sicherheitsmodell:
- Die Vorabprüfung muss erfolgreich sein, bevor der Schreibmodus beginnt.
- Die Laufzeitaktivierung wird vor dem Commit validiert.
- Beim Anwenden werden Dateien durch atomaren Dateiaustausch aktualisiert; bei einem Fehler wird nach Möglichkeit der vorherige Zustand wiederhergestellt.
Hinweise zur Kompatibilität mit veralteter Authentifizierung
Bei statischen Anmeldedaten ist die Laufzeit nicht mehr von der veralteten unverschlüsselten Authentifizierungsspeicherung abhängig.
- Die Quelle der Laufzeitanmeldedaten ist der aufgelöste In-Memory-Snapshot.
- Veraltete statische
api_key-Einträge werden entfernt, sobald sie gefunden werden. - OAuth-bezogenes Kompatibilitätsverhalten bleibt davon getrennt.
Hinweis zur Web-Benutzeroberfläche
Einige SecretInput-Unions lassen sich im Rohbearbeitungsmodus einfacher konfigurieren als im Formularmodus.
Verwandte Themen
- Authentifizierung - Einrichtung der Authentifizierung
- CLI: Geheimnisse - CLI-Befehle
- Vault-SecretRefs - Einrichtung des HashiCorp-Vault-Providers
- Umgebungsvariablen - Vorrang von Umgebungsvariablen
- Anmeldedatenoberfläche für SecretRefs - Anmeldedatenoberfläche
- Vertrag für den Plan zur Anwendung von Geheimnissen - Einzelheiten zum Planvertrag
- Sicherheit - Sicherheitskonzept