Конфигурация песочницы и инструментов для мультиагентов
Обзор
Каждый агент в мультиагентной конфигурации теперь может иметь свою собственную:
- Конфигурацию песочницы (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 для разных агентов. Если вы хотите поделиться учетными данными, скопируйте auth-profiles.json в agentDir другого агента.
Для поведения песочницы во время выполнения см. 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": "[email protected]"
}
}
}
]
}
Результат:
- агент main: работает на хосте, полный доступ к инструментам
- агент family: работает в Docker (один контейнер на агента), только инструмент 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",
"scope": "session"
}
},
"list": [
{
"id": "main",
"workspace": "~/.openclaw/workspace",
"sandbox": {
"mode": "off"
}
},
{
"id": "public",
"workspace": "~/.openclaw/workspace-public",
"sandbox": {
"mode": "all",
"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-antigravity), либо provider/model (например, openai/gpt-5.2).
Группы инструментов (сокращения)
Политики инструментов (глобальные, агента, песочницы) поддерживают записи group:*, которые расширяются до нескольких конкретных инструментов:
- group:runtime: exec, bash, process
- group:fs: read, write, edit, apply_patch
- group:sessions: sessions_list, sessions_history, sessions_send, sessions_spawn, session_status
- group:memory: memory_search, memory_get
- group:ui: browser, canvas
- group:automation: cron, gateway
- group:messaging: message
- group:nodes: nodes
- group:openclaw: все встроенные инструменты OpenClaw (исключая плагины провайдеров)
Режим повышенных привилегий
tools.elevated — это глобальная базовая линия (белый список на основе отправителя). agents.list[].tools.elevated может дополнительно ограничить повышенные привилегии для конкретных агентов (оба должны разрешить).
Шаблоны защиты:
- Запретите exec для ненадежных агентов (agents.list[].tools.deny: ["exec"])
- Избегайте добавления отправителей в белый список, которые направляются к ограниченным агентам
- Отключите повышенные привилегии глобально (tools.elevated.enabled: false), если вы хотите только изолированное выполнение
- Отключите повышенные привилегии для каждого агента (agents.list[].tools.elevated.enabled: false) для конфиденциальных профилей
Миграция с одного агента
До (один агент):
{
"agents": {
"defaults": {
"workspace": "~/.openclaw/workspace",
"sandbox": {
"mode": "non-main"
}
}
},
"tools": {
"sandbox": {
"tools": {
"allow": ["read", "write", "apply_patch", "exec"],
"deny": []
}
}
}
}
После (мультиагент с различными профилями):
{
"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" основан на session.mainKey (по умолчанию "main"), а не на идентификаторе агента. Групповые/канальные сессии всегда получают свои собственные ключи, поэтому они обрабатываются как не-основные и будут изолированы. Если вы хотите, чтобы агент никогда не изолировался, установите agents.list[].sandbox.mode: "off".
Тестирование
После настройки песочницы и инструментов для мультиагентов:
-
Проверьте разрешение агента:
openclaw agents list --bindings -
Проверьте контейнеры песочницы:
docker ps --filter "name=openclaw-sbx-" -
Протестируйте ограничения инструментов:
- Отправьте сообщение, требующее ограниченных инструментов
- Убедитесь, что агент не может использовать запрещенные инструменты
-
Мониторинг логов:
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", что создает один контейнер на сессию