Exec承認

Exec承認は、サンドボックス化されたエージェントが実際のホスト(gateway または node)でコマンドを実行できるようにするための コンパニオンアプリ/ノードホストガードレール です。安全インターロックのように考えてください: コマンドは、ポリシー + 許可リスト + (オプションの)ユーザー承認がすべて同意した場合にのみ許可されます。 Exec承認は、ツールポリシーとelevatedゲートに 追加 されます(elevatedが full に設定されている場合を除き、承認をスキップします)。 有効なポリシーは tools.exec.* と承認デフォルトの より厳格な ものです。承認フィールドが省略されている場合、tools.exec の値が使用されます。

コンパニオンアプリUIが 利用できない 場合、プロンプトを必要とする要求は askフォールバック(デフォルト: deny)によって解決されます。

適用場所

Exec承認は実行ホストでローカルに適用されます:

  • gatewayホスト → gatewayマシンの openclaw プロセス
  • nodeホスト → nodeランナー(macOSコンパニオンアプリまたはヘッドレスノードホスト)

macOS分割:

  • nodeホストサービス はローカルIPC経由で system.runmacOSアプリ に転送します。
  • macOSアプリ は承認を適用し、UIコンテキストでコマンドを実行します。

設定とストレージ

承認は実行ホストのローカルJSONファイルに保存されます:

~/.openclaw/exec-approvals.json

スキーマ例:

{
  "version": 1,
  "socket": {
    "path": "~/.openclaw/exec-approvals.sock",
    "token": "base64url-token"
  },
  "defaults": {
    "security": "deny",
    "ask": "on-miss",
    "askFallback": "deny",
    "autoAllowSkills": false
  },
  "agents": {
    "main": {
      "security": "allowlist",
      "ask": "on-miss",
      "askFallback": "deny",
      "autoAllowSkills": true,
      "allowlist": [
        {
          "id": "B0C8C0B3-2C2D-4F8A-9A3C-5A4B3C2D1E0F",
          "pattern": "~/Projects/**/bin/rg",
          "lastUsedAt": 1737150000000,
          "lastUsedCommand": "rg -n TODO",
          "lastResolvedPath": "/Users/user/Projects/.../bin/rg"
        }
      ]
    }
  }
}

ポリシーノブ

セキュリティ(exec.security

  • deny: すべてのホストexec要求をブロック。
  • allowlist: 許可リストに載っているコマンドのみ許可。
  • full: すべてを許可(elevatedと同等)。

Ask(exec.ask

  • off: プロンプトしない。
  • on-miss: 許可リストが一致しない場合のみプロンプト。
  • always: すべてのコマンドでプロンプト。

Askフォールバック(askFallback

プロンプトが必要だがUIに到達できない場合、フォールバックが決定します:

  • deny: ブロック。
  • allowlist: 許可リストが一致する場合のみ許可。
  • full: 許可。

許可リスト(エージェントごと)

許可リストは エージェントごと です。複数のエージェントが存在する場合、macOSアプリで編集するエージェントを切り替えます。パターンは 大文字小文字を区別しないglobマッチ です。 パターンは バイナリパス に解決される必要があります(basename のみのエントリは無視されます)。 レガシーの agents.default エントリは、ロード時に agents.main に移行されます。

例:

  • ~/Projects/**/bin/bird
  • ~/.local/bin/*
  • /opt/homebrew/bin/rg

各許可リストエントリは以下を追跡します:

  • id UI識別に使用される安定したUUID(オプション)
  • last used タイムスタンプ
  • last used command
  • last resolved path

スキルCLIの自動許可

Auto-allow skill CLIs が有効な場合、既知のスキルが参照する実行可能ファイルはノード(macOSノードまたはヘッドレスノードホスト)で許可リストに載っているものとして扱われます。これはGateway RPC経由で skills.bins を使用してスキルbinリストを取得します。厳格な手動許可リストが必要な場合はこれを無効にします。

セーフバイナリ(stdinのみ)

tools.exec.safeBins は、明示的な許可リストエントリなしで許可リストモードで実行できる stdinのみ のバイナリ(例: jq)の小さなリストを定義します。セーフバイナリは位置ファイル引数とパスのようなトークンを拒否するため、入ってくるストリームでのみ動作できます。 シェルチェーンとリダイレクトは許可リストモードで自動許可されません。

シェルチェーン(&&||;)は、すべてのトップレベルセグメントが許可リストを満たす場合(セーフバイナリまたはスキル自動許可を含む)に許可されます。リダイレクトは許可リストモードでサポートされていません。

デフォルトのセーフバイナリ: jqgrepcutsortuniqheadtailtrwc

Control UIでの編集

Control UI → Nodes → Exec approvals カードを使用して、デフォルト、エージェントごとのオーバーライド、許可リストを編集します。スコープ(デフォルトまたはエージェント)を選択し、ポリシーを調整し、許可リストパターンを追加/削除してから、保存 します。UIはパターンごとの last used メタデータを表示するため、リストを整理できます。

ターゲットセレクターは Gateway(ローカル承認)または Node を選択します。ノードは system.execApprovals.get/set を宣伝する必要があります(macOSアプリまたはヘッドレスノードホスト)。 ノードがまだexec承認を宣伝していない場合は、ローカルの ~/.openclaw/exec-approvals.json を直接編集します。

CLI: openclaw approvals はgatewayまたはノード編集をサポートします(Approvals CLI参照)。

承認フロー

プロンプトが必要な場合、gatewayは exec.approval.requested をオペレータークライアントにブロードキャストします。 Control UIとmacOSアプリは exec.approval.resolve 経由で解決し、gatewayは承認された要求をノードホストに転送します。

承認が必要な場合、execツールは承認IDで即座に返します。そのIDを使用して、後のシステムイベント(Exec finished / Exec denied)を関連付けます。タイムアウト前に決定が到着しない場合、要求は承認タイムアウトとして扱われ、拒否理由として表示されます。

確認ダイアログには以下が含まれます:

  • コマンド + 引数
  • cwd
  • エージェントID
  • 解決された実行可能パス
  • ホスト + ポリシーメタデータ

アクション:

  • Allow once → 今すぐ実行
  • Always allow → 許可リストに追加 + 実行
  • Deny → ブロック

チャットチャネルへの承認転送

exec承認プロンプトを任意のチャットチャネル(プラグインチャネルを含む)に転送し、/approve で承認できます。これは通常のアウトバウンド配信パイプラインを使用します。

設定:

{
  approvals: {
    exec: {
      enabled: true,
      mode: "session", // "session" | "targets" | "both"
      agentFilter: ["main"],
      sessionFilter: ["discord"], // 部分文字列または正規表現
      targets: [
        { channel: "slack", to: "U12345678" },
        { channel: "telegram", to: "123456789" }
      ]
    }
  }
}

チャットで返信:

/approve <id> allow-once
/approve <id> allow-always
/approve <id> deny

macOS IPCフロー

Gateway -> Node Service (WS)
                 |  IPC (UDS + token + HMAC + TTL)
                 v
             Mac App (UI + approvals + system.run)

セキュリティノート:

  • Unixソケットモード 0600、トークンは exec-approvals.json に保存。
  • 同一UIDピアチェック。
  • チャレンジ/レスポンス(nonce + HMACトークン + 要求ハッシュ)+ 短いTTL。

システムイベント

Execライフサイクルはシステムメッセージとして表示されます:

  • Exec running(コマンドが実行通知しきい値を超えた場合のみ)
  • Exec finished
  • Exec denied

これらはノードがイベントを報告した後、エージェントのセッションに投稿されます。 Gatewayホストexec承認は、コマンドが終了したとき(およびオプションでしきい値より長く実行されているとき)に同じライフサイクルイベントを発行します。 承認ゲートされたexecは、これらのメッセージでの簡単な相関のために、承認IDを runId として再利用します。

影響

  • full は強力です。可能であれば許可リストを優先してください。
  • ask は高速承認を許可しながらループに保ちます。
  • エージェントごとの許可リストは、あるエージェントの承認が他のエージェントに漏れるのを防ぎます。
  • 承認は 承認された送信者 からのホストexec要求にのみ適用されます。承認されていない送信者は /exec を発行できません。
  • /exec security=full は承認されたオペレーター向けのセッションレベルの便利機能で、設計により承認をスキップします。 ホストexecをハードブロックするには、承認セキュリティを deny に設定するか、ツールポリシー経由で exec ツールを拒否します。

関連: