平文も引き続き機能します。SecretRef は認証情報ごとにオプトインです。
ランタイムモデル
- シークレットは、リクエストパス上で遅延解決されるのではなく、アクティベーション中に即時に、メモリ内ランタイムスナップショットへ解決されます。
- 実質的にアクティブな SecretRef を解決できない場合、起動は早期に失敗します。
- リロードはアトミックな差し替えです。完全に成功するか、最後に正常だったスナップショットを維持します。
- ポリシー違反(たとえば OAuth モードの認証プロファイルと SecretRef 入力の組み合わせ)は、ランタイム差し替えの前にアクティベーションを失敗させます。
- ランタイムリクエストは、アクティブなメモリ内スナップショットだけを読み取ります。送信配信パス(Discord の返信/スレッド配信、Telegram アクション送信)もそのスナップショットを読み取り、送信ごとに ref を再解決しません。
エージェントアクセス境界
SecretRef は、認証情報が設定や生成されたモデルファイルに永続化されることを防ぎますが、プロセス分離境界ではありません。エージェントが読み取れるパスのディスク上に平文の認証情報が残っている場合、API レベルの秘匿化を迂回して、ファイルまたはシェルツール経由で引き続き読み取り可能です。 エージェントがアクセス可能なファイルが対象範囲に含まれる本番デプロイでは、次のすべてが満たされている場合にのみ移行完了とみなしてください。- 対応している認証情報は、平文値の代わりに SecretRef を使用している。
- レガシーな平文の残存が、
openclaw.json、auth-profiles.json、.env、生成されたmodels.jsonファイルから削除されている。 - 移行後に
openclaw secrets audit --checkがクリーンである。 - 残っている未対応またはローテーション対象の認証情報は、OS 分離、コンテナ分離、または外部認証情報プロキシで保護されている。
アクティブサーフェスのフィルタリング
SecretRef は、実質的にアクティブなサーフェスでのみ検証されます。- 有効なサーフェス: 未解決の ref は起動/リロードをブロックします。
- 非アクティブなサーフェス: 未解決の ref は起動/リロードをブロックせず、非致命的な
SECRETS_REF_IGNORED_INACTIVE_SURFACE診断を出力します。
非アクティブなサーフェスの例
非アクティブなサーフェスの例
- 無効化されたチャンネル/アカウント項目。
- 有効なアカウントが継承しないトップレベルのチャンネル認証情報。
- 無効化されたツール/機能サーフェス。
tools.web.search.providerで選択されていない Web 検索プロバイダー固有のキー。自動モード(プロバイダー未設定)では、いずれかが解決されるまで自動検出のために優先順位に従ってキーが参照されます。選択後、選択されなかったプロバイダーキーは非アクティブになります。- サンドボックス SSH 認証素材(
agents.defaults.sandbox.ssh.identityData、certificateData、knownHostsData、およびエージェントごとの上書き)は、有効なサンドボックスバックエンドがsshで、サンドボックスモードがoffではなく、デフォルトエージェントまたは有効なエージェントに対する場合にのみアクティブです。 gateway.remote.token/gateway.remote.passwordSecretRef は、次のいずれかが成り立つ場合にアクティブです。gateway.mode=remotegateway.remote.urlが設定されているgateway.tailscale.modeがserveまたはfunnelである- これらのリモートサーフェスがないローカルモード: トークン認証が勝ち得て、env/認証トークンが設定されていない場合、
gateway.remote.tokenはアクティブです。パスワード認証が勝ち得て、env/認証パスワードが設定されていない場合にのみ、gateway.remote.passwordはアクティブです。
OPENCLAW_GATEWAY_TOKENが設定されている場合、gateway.auth.tokenSecretRef は起動時の認証解決では非アクティブです。そのランタイムでは env トークン入力が優先されるためです。
Gateway 認証サーフェス診断
SecretRef がgateway.auth.token、gateway.auth.password、gateway.remote.token、または gateway.remote.password に設定されている場合、Gateway の起動/リロードはコード SECRETS_GATEWAY_AUTH_SURFACE でサーフェス状態をログに記録します。
active: SecretRef は有効な認証サーフェスの一部であり、解決される必要があります。inactive: 別の認証サーフェスが優先されている、またはリモート認証が無効/非アクティブです。
オンボーディング参照の事前検証
対話型オンボーディングで SecretRef ストレージを選択すると、保存前に事前検証が実行されます。- Env ref: env var 名を検証し、セットアップ中に空でない値が見えていることを確認します。
- Provider ref(
fileまたはexec): プロバイダー選択を検証し、idを解決して、解決された値の型を確認します。 - クイックスタートフロー:
gateway.auth.tokenがすでに SecretRef の場合、オンボーディングは probe/dashboard bootstrap の前に、同じ fail-fast ゲートを使用してそれを解決します(env、file、execref)。
SecretRef 契約
どこでも 1 つのオブジェクト形状です。- env
- file
- exec
providerは^[a-z][a-z0-9_-]{0,63}$に一致する必要がありますidは^[A-Z][A-Z0-9_]{0,127}$に一致する必要があります
プロバイダー設定
secrets.providers の下にプロバイダーを定義します。
Env プロバイダー
Env プロバイダー
allowlistによる任意の完全一致名 allowlist。- env 値がない、または空の場合、解決は失敗します。
File プロバイダー
File プロバイダー
pathのローカルファイルを読み取ります。mode: "json"(デフォルト)は JSON オブジェクトペイロードを想定し、idを JSON pointer として解決します。mode: "singleValue"は ref id"value"を想定し、生のファイル内容(末尾の改行は除去)を返します。- パスは所有権/権限チェックに合格する必要があります。
timeoutMs(デフォルト 5000)とmaxBytes(デフォルト 1 MiB)が読み取りを制限します。 - Windows は fail-closed です。パスの ACL 検証が利用できない場合、解決は失敗します。信頼済みパスに限り、そのプロバイダーで
allowInsecurePath: trueを設定してチェックを迂回できます。
Exec プロバイダー
Exec プロバイダー
- 設定された絶対バイナリパスを直接実行します。シェルは使用しません。
- デフォルトでは、
commandはシンボリックリンクではなく通常ファイルである必要があります。シンボリックリンクのコマンドパス(たとえば Homebrew shim)を許可するにはallowSymlinkCommand: trueを設定し、trustedDirs(たとえば["/opt/homebrew"])と組み合わせて、パッケージマネージャーパスだけが対象になるようにします。 timeoutMs(デフォルト 5000)、noOutputTimeoutMs(デフォルトはtimeoutMsと同じ)、maxOutputBytes(デフォルト 1 MiB)、env/passEnvallowlist、trustedDirsをサポートします。jsonOnlyのデフォルトはtrueです。jsonOnly: falseでリクエストされた id が 1 つだけの場合、プレーンな非 JSON stdout がその id の値として受け付けられます。- Windows は fail-closed です。コマンドパスの ACL 検証が利用できない場合、解決は失敗します。信頼済みパスに限り、そのプロバイダーで
allowInsecurePath: trueを設定してチェックを迂回できます。 - Plugin 管理の exec プロバイダーは、コピーされた
command/argsの代わりにpluginIntegrationを使用できます。OpenClaw は起動/リロード中に、インストール済み Plugin マニフェストから現在のコマンド詳細を解決します。Plugin が無効化、削除、未信頼になっている、またはその統合を宣言しなくなっている場合、そのプロバイダー上のアクティブな SecretRef は fail closed します。
ファイル backed API キー
設定のenv ブロックに file:... 文字列を入れないでください。そのブロックはリテラルであり、上書きもしないため、そこで file:... が解決されることはありません。
代わりに、対応している認証情報フィールドでファイル SecretRef を使用してください。
mode: "singleValue" では、SecretRef id は "value" です。mode: "json" では、"/providers/xai/apiKey" のような絶対 JSON pointer を使用します。
SecretRef を受け付けるフィールドについては、SecretRef 認証情報サーフェス を参照してください。
Exec 統合の例
1Password CLI
1Password CLI
Bitwarden Secrets Manager (`bws`)
Bitwarden Secrets Manager (`bws`)
SecretRef id を Bitwarden Secrets Manager 項目キーへマップするには、resolver ラッパーを使用します。リポジトリには リゾルバーは要求された id をバッチ化し、
scripts/secrets/openclaw-bws-resolver.mjs が含まれています。Gateway を実行するホスト上の絶対信頼済みパスにインストールまたはコピーしてください。要件:- Gateway ホストに Bitwarden Secrets Manager CLI (
bws) がインストールされている。 BWS_ACCESS_TOKENが Gateway サービスで利用可能。PATHがリゾルバーに渡されている、またはBWS_BINが絶対bwsバイナリパスに設定されている。- セルフホストの Bitwarden インスタンスを使用する場合は、環境で
BWS_SERVER_URLが設定されている。
bws secret list を実行し、一致するシークレットの key フィールドの値を返します。openclaw/providers/openai/apiKey のように、exec SecretRef id コントラクトを満たすキーを使用してください。アンダースコアを含む env-var 形式のキーは、リゾルバーの実行前に拒否されます。複数の表示可能な Bitwarden シークレットが要求されたキーを共有している場合、リゾルバーは推測せず、その id を曖昧として失敗させます。config を更新したら、リゾルバーパスを検証します。HashiCorp Vault CLI
HashiCorp Vault CLI
password-store (`pass`)
password-store (`pass`)
SecretRef id を 次に exec provider を設定し、シークレットは
pass エントリに直接マッピングする小さなリゾルラーラッパーを使用します。たとえば /usr/local/bin/openclaw-pass-resolver のように、exec-provider パスチェックに通る絶対パスに実行可能ファイルとして保存してください。#!/usr/bin/env node shebang は、リゾルバープロセスの PATH から node を解決するため、passEnv に PATH を含めてください。pass がその PATH 上にない場合は、親環境で PASS_BIN を設定し、それも passEnv に含めます。apiKey が pass エントリパスを指すようにします。pass エントリの最初の行に置くか、代わりに完全な pass show 出力を返すようラッパーをカスタマイズしてください。config を更新したら、静的監査と exec リゾルバーパスの両方を検証します。sops
sops
MCP サーバー環境変数
plugins.entries.acpx.config.mcpServers 経由で設定される MCP サーバー env var は SecretInput を受け入れ、API キーとトークンを平文 config から除外します。
${MCP_SERVER_API_KEY} のような env-template ref と SecretRef オブジェクトは、MCP サーバープロセスが起動する前の gateway activation 中に解決されます。他の SecretRef surface と同様に、未解決の ref は acpx Plugin が実質的にアクティブな場合にのみ activation をブロックします。
Sandbox SSH 認証マテリアル
コアのssh sandbox バックエンドも、SSH 認証マテリアル用の SecretRef をサポートします。
- OpenClaw は、SSH 呼び出しごとに遅延解決するのではなく、sandbox activation 中にこれらの ref を解決します。
- 解決済みの値は制限付きファイル権限 (
0o600) で一時ディレクトリに書き込まれ、生成された SSH config で使用されます。 - 実効 sandbox バックエンドが
sshでない場合、または sandbox mode がoffの場合、これらの ref は非アクティブのままで、起動をブロックしません。
サポートされる認証情報 surface
標準のサポート対象および非サポート対象の認証情報は、SecretRef 認証情報 surface に記載されています。ランタイムで発行される認証情報やローテーションされる認証情報、および OAuth refresh マテリアルは、読み取り専用 SecretRef 解決から意図的に除外されています。
必須の動作と優先順位
- ref のないフィールド: 変更なし。
- ref のあるフィールド: active surface では activation 中に必須。
- 平文と ref の両方が存在する場合、サポートされる優先パスでは ref が優先されます。
- redaction sentinel
__OPENCLAW_REDACTED__は内部 config の redaction/restore 用に予約されており、literal submitted config data としては拒否されます。
SECRETS_REF_OVERRIDES_PLAINTEXT(ランタイム警告)REF_SHADOWED(auth-profiles.json認証情報がopenclaw.jsonref より優先される場合の監査 finding)
serviceAccountRef は平文の serviceAccount より優先されます。兄弟 ref が設定されると、平文値は無視されます。
Activation トリガー
Secret activation は次で実行されます。- Startup (preflight と最終 activation)
- Config reload hot-apply path
- Config reload restart-check path
secrets.reloadによる手動 reload- Gateway config write RPC preflight (
config.set/config.apply/config.patch)。編集を永続化する前に、送信された config payload 内で active-surface SecretRef が解決可能かをチェックします
- 成功すると snapshot がアトミックに入れ替わります。
- Startup failure は gateway startup を中止します。
- Runtime reload failure は last-known-good snapshot を保持します。
- Write-RPC preflight failure は送信された config を拒否します。disk config と active runtime snapshot はどちらも変更されません。
- outbound helper/tool call に明示的な per-call channel token を渡しても SecretRef activation はトリガーされません。activation point は startup、reload、明示的な
secrets.reloadのままです。
Degraded と recovered のシグナル
正常状態の後に reload-time activation が失敗すると、OpenClaw は degraded secrets state に入り、ワンショットの system event と log code を発行します。SECRETS_RELOADER_DEGRADEDSECRETS_RELOADER_RECOVERED
- Degraded: ランタイムは last-known-good snapshot を保持します。
- Recovered: 次の activation 成功後に一度だけ発行されます。
- すでに degraded の間に失敗が繰り返される場合は警告をログに出しますが、イベントは再発行しません。
- Startup fail-fast は degraded event を発行しません。ランタイムが一度も active になっていないためです。
コマンドパス解決
Command path は、Gateway snapshot RPC を介して、サポートされる SecretRef 解決にオプトインできます。大きく 2 つの動作があります。- 厳格なコマンドパス
- 読み取り専用コマンドパス
たとえば、
openclaw memory remote-memory path や、remote shared-secret ref が必要な場合の openclaw qr --remote です。これらは active snapshot から読み取り、必要な SecretRef が利用できない場合は即座に失敗します。- backend secret rotation 後の snapshot refresh は
openclaw secrets reloadによって処理されます。 - これらの command path が使用する Gateway RPC method:
secrets.resolve。
監査と configure ワークフロー
デフォルトの operator flow: 再監査がクリーンになるまで、移行が完了したものとして扱わないでください。監査で保存時の平文値がまだ報告される場合、runtime API が墨消し済みの値を返していても、エージェントアクセスのリスクは残ります。configure 中に適用せずにプランを保存した場合は、再監査の前に openclaw secrets apply --from <plan-path> でその保存済みプランを適用してください。
secrets audit
secrets audit
検出項目には以下が含まれます。
- 保存時の平文値(
openclaw.json、auth-profiles.json、.env、生成されたagents/*/agent/models.json)。 - 生成された
models.jsonエントリ内に残った、機密性の高いプロバイダー header の平文。 - 未解決の ref。
- 優先順位によるシャドーイング(
auth-profiles.jsonがopenclaw.jsonの ref より優先される)。 - レガシー残留物(
auth.json、OAuth リマインダー)。
openclaw secrets audit --allow-exec を使用してください。header 残留物の注記: 機密性の高いプロバイダー header の検出は、名前ヒューリスティックに基づきます(一般的な認証/認可情報 header 名、および authorization、x-api-key、token、secret、password、credential などの断片)。secrets configure
secrets configure
対話型ヘルパーは以下を行います。
- まず
secrets.providersを設定する(env/file/exec、追加/編集/削除)。 - 1 つのエージェントスコープについて、
openclaw.jsonとauth-profiles.json内のサポート対象の secret 保持フィールドを選択できるようにする。 - ターゲットピッカー内で新しい
auth-profiles.jsonマッピングを直接作成できる。 - SecretRef の詳細(
source、provider、id)を取得する。 - preflight 解決を実行し、すぐに適用できる。
--allow-exec が設定されていない限り、preflight は exec SecretRef チェックをスキップします。configure --apply から直接適用し、プランに exec ref/プロバイダーが含まれる場合は、適用ステップでも --allow-exec を設定したままにしてください。便利なモード:openclaw secrets configure --providers-onlyopenclaw secrets configure --skip-provider-setupopenclaw secrets configure --agent <id>
configure の適用時デフォルト:- 対象プロバイダーについて、
auth-profiles.jsonから一致する静的認証情報をスクラブする。 auth.jsonからレガシー静的api_keyエントリをスクラブする。<config-dir>/.envから一致する既知の secret 行をスクラブする。
secrets apply
secrets apply
保存済みプランを適用します。exec 注記: dry-run は
--allow-exec が設定されていない限り exec チェックをスキップします。書き込みモードは、--allow-exec が設定されていない限り、exec SecretRef/プロバイダーを含むプランを拒否します。厳密なターゲット/パス契約の詳細と正確な拒否ルールについては、Secrets Apply Plan Contract を参照してください。一方向の安全ポリシー
安全モデル:- 書き込みモードの前に preflight が成功している必要があります。
- commit 前に runtime activation が検証されます。
- apply は、atomic なファイル置換と失敗時のベストエフォート復元を使用してファイルを更新します。
レガシー認証互換性の注記
静的認証情報については、runtime は平文のレガシー認証ストレージに依存しなくなりました。- runtime の認証情報ソースは、解決済みのインメモリスナップショットです。
- レガシー静的
api_keyエントリは、検出時にスクラブされます。 - OAuth 関連の互換性動作は別扱いのままです。
Web UI の注記
一部の SecretInput union は、フォームモードより raw editor mode の方が設定しやすい場合があります。関連
- 認証 - 認証セットアップ
- CLI: secrets - CLI コマンド
- 環境変数 - 環境の優先順位
- SecretRef Credential Surface - 認証情報サーフェス
- Secrets Apply Plan Contract - プラン契約の詳細
- セキュリティ - セキュリティ態勢