マルチエージェントのサンドボックス & ツール設定
概要
マルチエージェント構成では、各エージェントが次を個別に持てます。- サンドボックス設定(
agents.list[].sandboxがagents.defaults.sandboxを上書き) - ツール制限(
tools.allow/tools.deny、およびagents.list[].tools)
- フル アクセスの個人アシスタント
- ツールを制限した家族 / 仕事用エージェント
- サンドボックス内の公開向けエージェント
setupCommand は sandbox.docker(グローバルまたはエージェントごと)の配下に属し、コンテナ作成時に一度だけ実行されます。
認証はエージェント単位です。各エージェントは次の場所にある自身の agentDir 認証ストアを読み取ります。
agentDir を再利用しないでください。
認証情報はエージェント間で共有されません**。 エージェント間で agentDir を再利用しないでください。
資格情報はエージェント間で共有されません。agentDir をエージェント間で再利用しないでください。資格情報を共有したい場合は、auth-profiles.json を別のエージェントの agentDir にコピーしてください。
実行時の Sandbox の動作については、 Sandboxing を参照してください。
実行時の Sandbox の動作については、 Sandboxing を参照してください。
実行時のサンドボックスの挙動については、Sandboxing を参照してください。
「なぜブロックされるのか?」のデバッグについては、Sandbox vs Tool Policy vs Elevated と openclaw sandbox explain を参照してください。
設定例
例 1: 個人用 + 制限付き家族用エージェント
mainエージェント: ホスト上で実行、ツールはフル アクセスfamilyエージェント: Docker 内で実行(エージェントごとに 1 コンテナ)、readツールのみ
例 2: 共有サンドボックスの仕事用エージェント
例 2b: グローバルなコーディング プロファイル + メッセージング専用エージェント
- デフォルトのエージェントはコーディング ツールを使用可能
supportエージェントはメッセージング専用(+ Slack ツール)
例 3: エージェントごとに異なるサンドボックス モード
設定の優先順位
グローバル(agents.defaults.*)とエージェント固有(agents.list[].*)の設定が両方存在する場合:
サンドボックス設定
エージェント固有の設定がグローバルを上書きします。- そのエージェントでは
agents.list[].sandbox.{docker,browser,prune}.*がagents.defaults.sandbox.{docker,browser,prune}.*を上書きします(サンドボックス スコープが"shared"に解決される場合は無視されます)。
ツール制限
フィルタリング順は次のとおりです。- ツール プロファイル(
tools.profileまたはagents.list[].tools.profile) - プロバイダー ツール プロファイル(
tools.byProvider[provider].profileまたはagents.list[].tools.byProvider[provider].profile) - グローバル ツール ポリシー(
tools.allow/tools.deny) - プロバイダー ツール ポリシー(
tools.byProvider[provider].allow/deny) - エージェント固有のツール ポリシー(
agents.list[].tools.allow/deny) - エージェント プロバイダー ポリシー(
agents.list[].tools.byProvider[provider].allow/deny) - サンドボックス ツール ポリシー(
tools.sandbox.toolsまたはagents.list[].tools.sandbox.tools) - サブエージェント ツール ポリシー(
tools.subagents.tools、該当する場合)
agents.list[].tools.sandbox.tools が設定されている場合、tools.sandbox.tools に置き換えられます。
agents.list[].tools.profile が設定されている場合、そのエージェントの tools.profile が上書きされます。
プロバイダのツールキーは、provider(例:google-antigubity)またはprovider/model(例:openai/gpt-5.2)のいずれかを受け付けます。
ツール グループ(ショートハンド)
ツール ポリシー(グローバル、エージェント、サンドボックス)は、複数の具体的なツールに展開されるgroup:* エントリをサポートします。
group:runtime:exec,bash,processgroup:fs:read,write,edit,apply_patchgroup:sessions:sessions_list,sessions_history,sessions_send,sessions_spawn,session_statusgroup:memory:memory_search,memory_getgroup:ui:browser,canvasgroup:automation:cron,gatewaygroup:messaging:messagegroup:nodes:nodesgroup:openclaw: すべての組み込み OpenClaw ツール(プロバイダー プラグインは除外)
Elevated モード
tools.elevated はグローバルベースライン(送信者ベースの許可リスト)です。 tools.elevated はグローバルのベースライン(送信者ベースの許可リスト)です。agents.list[].tools.elevated は、特定のエージェントに対して Elevated をさらに制限できます(両方で許可される必要があります)。 tools.elevated はグローバルのベースライン(送信者ベースの許可リスト)です。agents.list[].tools.elevated は、特定のエージェントに対して Elevated をさらに制限できます(両方で許可される必要があります)。
緩和パターン:
- 信頼できないエージェントでは
execを拒否(agents.list[].tools.deny: ["exec"]) - 制限付きエージェントへルーティングされる送信者を許可リストに追加しない
- サンドボックス化された実行のみを望む場合は、グローバルで Elevated を無効化(
tools.elevated.enabled: false) - 機微なプロファイルでは、エージェント単位で Elevated を無効化(
agents.list[].tools.elevated.enabled: false)
単一エージェントからの移行
Before(単一エージェント):agent.* 設定は openclaw doctor により移行されます。今後は agents.defaults + agents.list を推奨します。
ツール制限の例
読み取り専用エージェント
安全実行エージェント(ファイル変更なし)
通信専用エージェント
よくある落とし穴: 「non-main」
agents.defaults.sandbox.mode: "non-main" はエージェント ID ではなく、session.mainKey(デフォルトは "main")に基づきます。
グループ / チャンネル セッションは常に独自のキーを取得するため、non-main として扱われ、サンドボックス化されます。エージェントを常にサンドボックス化しない場合は、agents.list[].sandbox.mode: "off" を設定してください。 グループ/チャネルセッションは常に独自のキーを取得するため、
はメインではないものとして扱われ、サンドボックス化されます。 もしエージェントに
サンドボックスを渡さないようにしたい場合は、 agents.list[].sandbox.mode: "off" を設定します。 グループ/チャネルセッションは常に独自のキーを取得するため、
はメインではないものとして扱われ、サンドボックス化されます。 もしエージェントに
サンドボックスを渡さないようにしたい場合は、 agents.list[].sandbox.mode: "off" を設定します。
テスト
マルチエージェントのサンドボックスとツールを設定した後:-
エージェント解決の確認:
-
サンドボックス コンテナの確認:
-
ツール制限のテスト:
- 制限されたツールを必要とするメッセージを送信
- 拒否されたツールをエージェントが使用できないことを確認
-
ログの監視:
トラブルシューティング
mode: "all" にもかかわらずエージェントがサンドボックス化されない
- 上書きするグローバルの
agents.defaults.sandbox.modeがないか確認 - エージェント固有の設定が優先されるため、
agents.list[].sandbox.mode: "all"を設定
拒否リストがあるのにツールが使用可能なまま
- ツールのフィルタリング順を確認: グローバル → エージェント → サンドボックス → サブエージェント
- 各レベルは制限のみ可能で、再付与は不可
- ログで確認:
[tools] filtering tools for agent:${agentId}
エージェントごとにコンテナが分離されない
- エージェント固有のサンドボックス設定で
scope: "agent"を設定 - デフォルトは
"session"で、セッションごとに 1 コンテナを作成