Skip to content

コマンド実行ツールと承認

学習後の目標

  • 3つの実行モード(sandbox/gateway/node)でexecツールを設定する
  • セキュリティ承認仕組み(deny/allowlist/full)を理解して設定する
  • 許可リスト(Allowlist)とセキュアなbinsを管理する
  • UIまたはチャットチャネル経由でexecリクエストを承認する
  • execツールの一般的な問題とセキュリティエラーをトラブルシューティングする

現在の課題

execツールはAIアシスタントがシェルコマンドを実行できるようにしますが、これは強力でありながら危険でもあります:

  • AIがシステム上の重要なファイルを削除するのではないか?
  • AIが安全なコマンドのみを実行するように制限するには?
  • さまざまな実行モードの違いは何か?
  • 承認フローはどのように動作するのか?
  • 許可リストはどのように設定すればよいのか?

いつ使用すべきか

  • AIにシステム操作(ファイル管理、コードビルドなど)を実行させたい場合
  • AIにカスタムスクリプトやツールを呼び出させたい場合
  • AIの実行権限を細かく制御する必要がある場合
  • 特定のコマンドを安全に許可する必要がある場合

🎒 開始前の準備

前提条件

このチュートリアルは、Gatewayの起動が完了しており、Gatewayデーモンが実行中であることを前提としています。

  • Node ≥22 がインストールされていることを確認
  • Gatewayデーモンが実行中であること
  • 基本的なシェルコマンドとLinux/Unixファイルシステムの知識

コアコンセプト

Execツールの3層セキュリティ保護

execツールは、粗粒度から細粒度までの3層のセキュリティ仕組みを採用し、AIの実行権限を制御します:

  1. ツールポリシー(Tool Policy)tools.policyexecツールの許可を制御
  2. 実行ホスト(Host):コマンドはsandbox/gateway/nodeの3つの環境で実行
  3. 承認仕組み(Approvals):gateway/nodeモードでは、allowlistと承認プロンプトでさらに制限可能

なぜ多層保護が必要なのか?

単層の保護はバイパスや設定ミスを引き起こしやすいです。多層保護により、ある層が機能しなくても他の層が保護を提供します。

3つの実行モードの比較

実行モード実行場所セキュリティレベル典型的なユースケース承認が必要
sandboxコンテナ内(Dockerなど)分離環境、テストいいえ
gatewayGatewayデーモンが動作するマシンローカル開発、統合はい(allowlist + 承認)
nodeペアリングされたデバイスノード(macOS/iOS/Android)デバイスローカル操作はい(allowlist + 承認)

重要な違い

  • sandboxモードはデフォルトで承認が不要(ただしSandboxの制限を受ける可能性あり)
  • gatewayとnodeモードはデフォルトで承認が必要fullに設定しない限り)

さあ、やってみよう

ステップ1:execツールのパラメータを理解する

なぜ execツールのパラメータを理解することは、セキュリティ設定の基礎です。

execツールは以下のパラメータをサポートします:

json
{
  "tool": "exec",
  "command": "ls -la",
  "workdir": "/path/to/dir",
  "env": { "NODE_ENV": "production" },
  "yieldMs": 10000,
  "background": false,
  "timeout": 1800,
  "pty": false,
  "host": "sandbox",
  "security": "allowlist",
  "ask": "on-miss",
  "node": "mac-1"
}

パラメータ説明

パラメータタイプデフォルト値説明
commandstring必須実行するシェルコマンド
workdirstring現在の作業ディレクトリ実行ディレクトリ
envobject環境を継承環境変数の上書き
yieldMsnumber10000タイムアウト後に自動的にバックグラウンドへ(ミリ秒)
backgroundbooleanfalse即座にバックグラウンド実行
timeoutnumber1800実行タイムアウト(秒)
ptybooleanfalse擬似端末で実行(TTYサポート)
hoststringsandbox実行ホスト:sandbox | gateway | node
securitystringdeny/allowlistセキュリティポリシー:deny | allowlist | full
askstringon-miss承認ポリシー:off | on-miss | always
nodestring-nodeモードのターゲットノードIDまたは名前

確認すべき点:パラメータリストは各実行モードの制御方法を明確に説明しています。

ステップ2:デフォルトの実行モードを設定する

なぜ 設定ファイルでグローバルデフォルト値を設定することで、exec呼び出しごとにパラメータを指定する必要がなくなります。

~/.clawdbot/clawdbot.jsonを編集:

json
{
  "tools": {
    "exec": {
      "host": "sandbox",
      "security": "allowlist",
      "ask": "on-miss",
      "node": "mac-1",
      "notifyOnExit": true,
      "approvalRunningNoticeMs": 10000,
      "pathPrepend": ["~/bin", "/opt/homebrew/bin"],
      "safeBins": ["jq", "grep", "cut"]
    }
  }
}

設定項目の説明

設定項目タイプデフォルト値説明
hoststringsandboxデフォルトの実行ホスト
securitystringdeny (sandbox) / allowlist (gateway, node)デフォルトのセキュリティポリシー
askstringon-missデフォルトの承認ポリシー
nodestring-nodeモードのデフォルトノード
notifyOnExitbooleantrueバックグラウンドタスク終了時にシステムイベントを送信
approvalRunningNoticeMsnumber10000タイムアウト後に「実行中」通知を送信(0で無効)
pathPrependstring[]-PATHに追加するディレクトリリスト
safeBinsstring[][デフォルトリスト]セキュアなバイナリリスト(stdin操作のみ)

確認すべき点:設定を保存すると、execツールはこれらのデフォルト値を使用します。

ステップ3:/execセッションオーバーライドを使用する

なぜ セッションオーバーライドにより、設定ファイルを編集せずに一時的に実行パラメータを調整できます。

チャットで送信:

/exec host=gateway security=allowlist ask=on-miss node=mac-1

現在のオーバーライド値を確認:

/exec

確認すべき点:現在のセッションのexecパラメータ設定が表示されます。

ステップ4:許可リスト(Allowlist)を設定する

なぜ allowlistはgateway/nodeモードの中核となるセキュリティ仕組みであり、特定のコマンドのみを許可します。

allowlistを編集する

UIで編集

  1. Control UIを開く
  2. Nodesタブに移動
  3. Exec approvalsカードを見つける
  4. ターゲット(GatewayまたはNode)を選択
  5. Agentを選択(例:main
  6. Add patternをクリックしてコマンドパターンを追加
  7. Saveをクリックして保存

CLIで編集

bash
clawdbot approvals

JSONファイルで編集

~/.clawdbot/exec-approvals.jsonを編集:

json
{
  "version": 1,
  "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/*",
          "lastUsedAt": 1737150000000,
          "lastUsedCommand": "rg -n TODO",
          "lastResolvedPath": "/Users/user/Projects/bin/rg"
        },
        {
          "id": "C1D9D1C4-3D3E-5F9B-0B4D-6B5C4D3E2F1G",
          "pattern": "/opt/homebrew/bin/rg",
          "lastUsedAt": 1737150000000,
          "lastUsedCommand": "rg test",
          "lastResolvedPath": "/opt/homebrew/bin/rg"
        }
      ]
    }
  }
}

Allowlistモードの説明

allowlistはglobパターンマッチング(大文字小文字を区別しない)を使用します:

パターンマッチ説明
~/Projects/**/bin/*/Users/user/Projects/any/bin/rgすべてのサブディレクトリにマッチ
~/.local/bin/*/Users/user/.local/bin/jqローカルbinにマッチ
/opt/homebrew/bin/rg/opt/homebrew/bin/rg絶対パスにマッチ

重要なルール

  • 解決されたバイナリパスのみマッチ、basenameマッチ(rgなど)はサポートされません
  • シェル連結(&&||;)は各セグメントがallowlistを満たす必要があります
  • リダイレクト(><)はallowlistモードではサポートされていません

確認すべき点:allowlistを設定すると、マッチするコマンドのみを実行できます。

ステップ5:セキュアなbins(Safe Bins)を理解する

なぜ セキュアなbinsはstdin操作のみをサポートする安全なバイナリのセットであり、allowlistモードで明示的なallowlistなしで使用できます。

デフォルトのセキュアなbins

jqgrepcutsortuniqheadtailtrwc

セキュアなbinのセキュリティ特性

  • 位置ファイル引数を拒否
  • パスライクフラグを拒否
  • 入力ストリーム(stdin)のみ操作可能

カスタムセキュアなbinsを設定

json
{
  "tools": {
    "exec": {
      "safeBins": ["jq", "grep", "my-safe-tool"]
    }
  }
}

確認すべき点:セキュアなbinsのコマンドはallowlistモードで直接実行できます。

ステップ6:チャットチャネル経由でexecリクエストを承認する

なぜ UIが利用できない場合、任意のチャットチャネル(WhatsApp、Telegram、Slackなど)経由でexecリクエストを承認できます。

承認転送を有効にする

~/.clawdbot/clawdbot.jsonを編集:

json
{
  "approvals": {
    "exec": {
      "enabled": true,
      "mode": "session",
      "agentFilter": ["main"],
      "sessionFilter": ["discord"],
      "targets": [
        { "channel": "slack", "to": "U12345678" },
        { "channel": "telegram", "to": "123456789" }
      ]
    }
  }
}

設定項目の説明

設定項目説明
enabledexec承認転送を有効にするかどうか
mode"session" | "targets" | "both" - 承認ターゲットモード
agentFilter特定のエージェントの承認リクエストのみ処理
sessionFilterセッションフィルタ(substringまたはregex)
targetsターゲットチャネルリスト(channel + to

リクエストを承認する

execツールが承認を必要とする場合、以下の情報を含むメッセージが届きます:

Exec approval request (id: abc-123)
Command: ls -la
CWD: /home/user
Agent: main
Resolved: /usr/bin/ls
Host: gateway
Security: allowlist

承認オプション

/approve abc-123 allow-once     # 1回のみ許可
/approve abc-123 allow-always    # 常に許可(allowlistに追加)
/approve abc-123 deny           # 拒否

確認すべき点:承認後、コマンドが実行されるか拒否されます。

チェックポイント ✅

  • [ ] 3つの実行モード(sandbox/gateway/node)の違いを理解している
  • [ ] グローバルなexecデフォルトパラメータを設定した
  • [ ] /execコマンドのセッションオーバーライドを使用できる
  • [ ] allowlistを設定した(少なくとも1つのパターン)
  • [ ] セキュアなbinsのセキュリティ特性を理解している
  • [ ] チャットチャネル経由でexecリクエストを承認できる

よくある落とし穴

一般的なエラー

エラー原因解決方法
Command not allowed by exec policysecurity=denyまたはallowlistが一致しないtools.exec.securityとallowlist設定を確認
Approval timeoutUIが利用不可、askFallback=denyaskFallback=allowlistを設定またはUIを有効化
Pattern does not resolve to binaryallowlistモードでbasenameを使用完全パスを使用(例:/opt/homebrew/bin/rg
Unsupported shell tokenallowlistモードで>または&&を使用コマンドを分割またはsecurity=fullを使用
Node not foundnodeモードでノードがペアリングされていないまずノードペアリングを完了

シェル連結とリダイレクト

警告

security=allowlistモードでは、以下のシェル機能はサポートされません

  • パイプ:|(ただし||はサポート)
  • リダイレクト:><>>
  • コマンド置換:$()` `
  • バックグラウンド:&;

解決方法

  • security=fullを使用(慎重に)
  • 複数のexec呼び出しに分割
  • ラッパースクリプトを作成し、スクリプトパスをallowlistに追加

PATH環境変数

実行モードによってPATHの処理方法が異なります:

実行モードPATH処理説明
sandboxシェルログインを継承、/etc/profileでリセットされる可能性pathPrependはprofileの後に適用
gatewayログインシェルPATHをexec環境にマージデーモンは最小PATHを保持、execはユーザーPATHを継承
node渡された環境変数オーバーライドのみ使用macOSノードはPATHオーバーライドを破棄、headlessノードはprependをサポート

確認すべき点:PATHの設定が正しくコマンド検索に影響します。

まとめ

execツールは3層の保護仕組み(ツールポリシー、実行ホスト、承認)により、AIアシスタントがシェルコマンドを安全に実行できるようにします:

  • 実行モード:sandbox(コンテナ分離)、gateway(ローカル実行)、node(デバイス操作)
  • セキュリティポリシー:deny(完全禁止)、allowlist(許可リスト)、full(完全許可)
  • 承認仕組み:off(プロンプトなし)、on-miss(未一致時プロンプト)、always(常にプロンプト)
  • 許可リスト:globパターンで解決されたバイナリパスをマッチ
  • セキュアなbins:stdin操作のみのバイナリはallowlistモードで承認不要

次のレッスン予告

次のレッスンでは、**Web検索とスクレイピングツール**を学習します

学ぶ内容:

  • web_searchツールを使用してWeb検索を行う方法
  • web_fetchツールを使用してWebページコンテンツをスクレイピングする方法
  • 検索エンジンプロバイダー(Brave、Perplexity)を設定する方法
  • 検索結果とWebスクレイピングエラーを処理する方法

付録:ソースコード参照

クリックしてソースコードの場所を展開

更新日:2026-01-27

機能ファイルパス行番号
execツール定義src/agents/bash-tools.exec.ts1-500+
exec承認ロジックsrc/infra/exec-approvals.ts1-1268
シェルコマンド分析src/infra/exec-approvals.ts500-1100
Allowlistマッチsrc/infra/exec-approvals.ts507-521
Safe bins検証src/infra/exec-approvals.ts836-873
承認Socket通信src/infra/exec-approvals.ts1210-1267
プロセス実行src/process/exec.ts1-125
ツール設定Schemasrc/config/zod-schema.core.ts-

重要なタイプ

  • ExecHost: "sandbox" \| "gateway" \| "node" - 実行ホストタイプ
  • ExecSecurity: "deny" \| "allowlist" \| "full" - セキュリティポリシー
  • ExecAsk: "off" \| "on-miss" \| "always" - 承認ポリシー
  • ExecAllowlistEntry: allowlistエントリタイプ(patternlastUsedAtなどを含む)

重要な定数

  • DEFAULT_SECURITY = "deny" - デフォルトのセキュリティポリシー
  • DEFAULT_ASK = "on-miss" - デフォルトの承認ポリシー
  • DEFAULT_SAFE_BINS = ["jq", "grep", "cut", "sort", "uniq", "head", "tail", "tr", "wc"] - デフォルトのセキュアなbins

重要な関数

  • resolveExecApprovals(): exec-approvals.json設定を解析
  • evaluateShellAllowlist(): シェルコマンドがallowlistを満たすか評価
  • matchAllowlist(): コマンドパスがallowlistパターンとマッチするか確認
  • isSafeBinUsage(): コマンドがセキュアなbinの使用か検証
  • requestExecApprovalViaSocket(): Unixソケット経由で承認をリクエスト