マルチエージェントのサンドボックス & ツール設定¶
概要¶
マルチエージェント構成では、各エージェントが次を個別に持てます。
- サンドボックス設定(
agents.list[].sandboxがagents.defaults.sandboxを上書き) - ツール制限(
tools.allow/tools.deny、およびagents.list[].tools)
これにより、異なるセキュリティ プロファイルで複数のエージェントを実行できます。
- フル アクセスの個人アシスタント
- ツールを制限した家族 / 仕事用エージェント
- サンドボックス内の公開向けエージェント
setupCommand は sandbox.docker(グローバルまたはエージェントごと)の配下に属し、コンテナ作成時に一度だけ実行されます。
認証はエージェント単位です。各エージェントは次の場所にある自身の agentDir 認証ストアを読み取ります。
~/.openclaw/agents/<agentId>/agent/auth-profiles.json
認証情報はエージェント間で共有されません**。 エージェント間で agentDir を再利用しないでください。
資格情報はエージェント間で共有されません。agentDir をエージェント間で再利用しないでください。資格情報を共有したい場合は、auth-profiles.json を別のエージェントの agentDir にコピーしてください。
実行時の Sandbox の動作については、 Sandboxing を参照してください。
実行時のサンドボックスの挙動については、Sandboxing を参照してください。
「なぜブロックされるのか?」のデバッグについては、Sandbox vs Tool Policy vs Elevated と openclaw sandbox explain を参照してください。
設定例¶
例 1: 個人用 + 制限付き家族用エージェント¶
{
"agents": {
"list": [
{
"id": "main",
"default": true,
"name": "Personal Assistant",
"workspace": "~/.openclaw/workspace",
"sandbox": { "mode": "off" }
},
{
"id": "family",
"name": "Family Bot",
"workspace": "~/.openclaw/workspace-family",
"sandbox": {
"mode": "all",
"scope": "agent"
},
"tools": {
"allow": ["read"],
"deny": ["exec", "write", "edit", "apply_patch", "process", "browser"]
}
}
]
},
"bindings": [
{
"agentId": "family",
"match": {
"provider": "whatsapp",
"accountId": "*",
"peer": {
"kind": "group",
"id": "120363424282127706@g.us"
}
}
}
]
}
結果:
mainエージェント: ホスト上で実行、ツールはフル アクセスfamilyエージェント: Docker 内で実行(エージェントごとに 1 コンテナ)、readツールのみ
例 2: 共有サンドボックスの仕事用エージェント¶
{
"agents": {
"list": [
{
"id": "personal",
"workspace": "~/.openclaw/workspace-personal",
"sandbox": { "mode": "off" }
},
{
"id": "work",
"workspace": "~/.openclaw/workspace-work",
"sandbox": {
"mode": "all",
"scope": "shared",
"workspaceRoot": "/tmp/work-sandboxes"
},
"tools": {
"allow": ["read", "write", "apply_patch", "exec"],
"deny": ["browser", "gateway", "discord"]
}
}
]
}
}
例 2b: グローバルなコーディング プロファイル + メッセージング専用エージェント¶
{
"tools": { "profile": "coding" },
"agents": {
"list": [
{
"id": "support",
"tools": { "profile": "messaging", "allow": ["slack"] }
}
]
}
}
結果:
- デフォルトのエージェントはコーディング ツールを使用可能
supportエージェントはメッセージング専用(+ Slack ツール)
例 3: エージェントごとに異なるサンドボックス モード¶
{
"agents": {
"defaults": {
"sandbox": {
"mode": "non-main", // Global default
"scope": "session"
}
},
"list": [
{
"id": "main",
"workspace": "~/.openclaw/workspace",
"sandbox": {
"mode": "off" // Override: main never sandboxed
}
},
{
"id": "public",
"workspace": "~/.openclaw/workspace-public",
"sandbox": {
"mode": "all", // Override: public always sandboxed
"scope": "agent"
},
"tools": {
"allow": ["read"],
"deny": ["exec", "write", "edit", "apply_patch"]
}
}
]
}
}
設定の優先順位¶
グローバル(agents.defaults.*)とエージェント固有(agents.list[].*)の設定が両方存在する場合:
サンドボックス設定¶
エージェント固有の設定がグローバルを上書きします。
agents.list[].sandbox.mode > agents.defaults.sandbox.mode
agents.list[].sandbox.scope > agents.defaults.sandbox.scope
agents.list[].sandbox.workspaceRoot > agents.defaults.sandbox.workspaceRoot
agents.list[].sandbox.workspaceAccess > agents.defaults.sandbox.workspaceAccess
agents.list[].sandbox.docker.* > agents.defaults.sandbox.docker.*
agents.list[].sandbox.browser.* > agents.defaults.sandbox.browser.*
agents.list[].sandbox.prune.* > agents.defaults.sandbox.prune.*
注記:
- そのエージェントでは
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 をさらに制限できます(両方で許可される必要があります)。
緩和パターン:
- 信頼できないエージェントでは
execを拒否(agents.list[].tools.deny: ["exec"]) - 制限付きエージェントへルーティングされる送信者を許可リストに追加しない
- サンドボックス化された実行のみを望む場合は、グローバルで Elevated を無効化(
tools.elevated.enabled: false) - 機微なプロファイルでは、エージェント単位で Elevated を無効化(
agents.list[].tools.elevated.enabled: false)
単一エージェントからの移行¶
Before(単一エージェント):
{
"agents": {
"defaults": {
"workspace": "~/.openclaw/workspace",
"sandbox": {
"mode": "non-main"
}
}
},
"tools": {
"sandbox": {
"tools": {
"allow": ["read", "write", "apply_patch", "exec"],
"deny": []
}
}
}
}
After(異なるプロファイルのマルチエージェント):
{
"agents": {
"list": [
{
"id": "main",
"default": true,
"workspace": "~/.openclaw/workspace",
"sandbox": { "mode": "off" }
}
]
}
}
レガシーの agent.* 設定は openclaw doctor により移行されます。今後は agents.defaults + agents.list を推奨します。
ツール制限の例¶
読み取り専用エージェント¶
{
"tools": {
"allow": ["read"],
"deny": ["exec", "write", "edit", "apply_patch", "process"]
}
}
安全実行エージェント(ファイル変更なし)¶
{
"tools": {
"allow": ["read", "exec", "process"],
"deny": ["write", "edit", "apply_patch", "browser", "gateway"]
}
}
通信専用エージェント¶
{
"tools": {
"allow": ["sessions_list", "sessions_send", "sessions_history", "session_status"],
"deny": ["exec", "write", "edit", "apply_patch", "read", "browser"]
}
}
よくある落とし穴: 「non-main」¶
agents.defaults.sandbox.mode: "non-main" はエージェント ID ではなく、session.mainKey(デフォルトは "main")に基づきます。
グループ / チャンネル セッションは常に独自のキーを取得するため、non-main として扱われ、サンドボックス化されます。エージェントを常にサンドボックス化しない場合は、agents.list[].sandbox.mode: "off" を設定してください。 グループ/チャネルセッションは常に独自のキーを取得するため、
はメインではないものとして扱われ、サンドボックス化されます。 もしエージェントに
サンドボックスを渡さないようにしたい場合は、 agents.list[].sandbox.mode: "off" を設定します。
テスト¶
マルチエージェントのサンドボックスとツールを設定した後:
- エージェント解決の確認:
exec
openclaw agents list --bindings
- サンドボックス コンテナの確認:
exec
docker ps --filter "name=openclaw-sbx-"
-
ツール制限のテスト: - 制限されたツールを必要とするメッセージを送信 - 拒否されたツールをエージェントが使用できないことを確認
-
ログの監視:
exec
tail -f "${OPENCLAW_STATE_DIR:-$HOME/.openclaw}/logs/gateway.log" | grep -E "routing|sandbox|tools"
トラブルシューティング¶
mode: "all" にもかかわらずエージェントがサンドボックス化されない¶
- 上書きするグローバルの
agents.defaults.sandbox.modeがないか確認 - エージェント固有の設定が優先されるため、
agents.list[].sandbox.mode: "all"を設定
拒否リストがあるのにツールが使用可能なまま¶
- ツールのフィルタリング順を確認: グローバル → エージェント → サンドボックス → サブエージェント
- 各レベルは制限のみ可能で、再付与は不可
- ログで確認:
[tools] filtering tools for agent:${agentId}
エージェントごとにコンテナが分離されない¶
- エージェント固有のサンドボックス設定で
scope: "agent"を設定 - デフォルトは
"session"で、セッションごとに 1 コンテナを作成