Изоляция (Sandboxing)

OpenClaw может запускать инструменты внутри Docker-контейнеров, чтобы уменьшить радиус поражения. Это опционально и контролируется конфигурацией (agents.defaults.sandbox или agents.list[].sandbox). Если изоляция выключена, инструменты выполняются на хосте. Шлюз остаётся на хосте; выполнение инструментов происходит в изолированной песочнице при включении.

Это не идеальная граница безопасности, но она существенно ограничивает доступ к файловой системе и процессам, когда модель делает что-то глупое.

Что изолируется

  • Выполнение инструментов (exec, read, write, edit, apply_patch, process и т.д.).
  • Опциональный изолированный браузер (agents.defaults.sandbox.browser).
    • По умолчанию браузер песочницы запускается автоматически (обеспечивает доступность CDP), когда инструменту браузера это нужно. Настраивается через agents.defaults.sandbox.browser.autoStart и agents.defaults.sandbox.browser.autoStartTimeoutMs.
    • agents.defaults.sandbox.browser.allowHostControl позволяет изолированным сессиям явно ориентироваться на браузер хоста.
    • Опциональные белые списки управляют target: "custom": allowedControlUrls, allowedControlHosts, allowedControlPorts.

Не изолируется:

  • Сам процесс Шлюза.
  • Любой инструмент, явно разрешённый для запуска на хосте (например, tools.elevated).
    • Exec с повышенными правами выполняется на хосте и обходит изоляцию.
    • Если изоляция выключена, tools.elevated не меняет выполнение (уже на хосте). Смотрите Elevated Mode.

Режимы

agents.defaults.sandbox.mode контролирует когда используется изоляция:

  • "off": без изоляции.
  • "non-main": изолировать только не-main сессии (по умолчанию, если вы хотите обычные чаты на хосте).
  • "all": каждая сессия выполняется в песочнице. Примечание: "non-main" основан на session.mainKey (по умолчанию "main"), а не на id агента. Сессии групп/каналов используют свои собственные ключи, поэтому они считаются non-main и будут изолированы.

Область

agents.defaults.sandbox.scope контролирует сколько контейнеров создаётся:

  • "session" (по умолчанию): один контейнер на сессию.
  • "agent": один контейнер на агента.
  • "shared": один контейнер, общий для всех изолированных сессий.

Доступ к рабочей области

agents.defaults.sandbox.workspaceAccess контролирует что видит песочница:

  • "none" (по умолчанию): инструменты видят рабочую область песочницы в ~/.openclaw/sandboxes.
  • "ro": монтирует рабочую область агента только для чтения в /agent (отключает write/edit/apply_patch).
  • "rw": монтирует рабочую область агента для чтения/записи в /workspace.

Входящие медиа копируются в активную рабочую область песочницы (media/inbound/*). Примечание навыков: инструмент read работает с корнем песочницы. С workspaceAccess: "none" OpenClaw зеркалирует подходящие навыки в рабочую область песочницы (.../skills), чтобы их можно было читать. С "rw" навыки рабочей области доступны для чтения из /workspace/skills.

Пользовательские монтирования привязок

agents.defaults.sandbox.docker.binds монтирует дополнительные каталоги хоста в контейнер. Формат: host:container:mode (например, "/home/user/source:/source:rw").

Глобальные и для каждого агента привязки объединяются (не заменяются). При scope: "shared" привязки для отдельных агентов игнорируются.

Пример (исходник только для чтения + docker socket):

{
  agents: {
    defaults: {
      sandbox: {
        docker: {
          binds: [
            "/home/user/source:/source:ro",
            "/var/run/docker.sock:/var/run/docker.sock"
          ]
        }
      }
    },
    list: [
      {
        id: "build",
        sandbox: {
          docker: {
            binds: ["/mnt/cache:/cache:rw"]
          }
        }
      }
    ]
  }
}

Примечания по безопасности:

  • Привязки обходят файловую систему песочницы: они открывают пути хоста с тем режимом, который вы установили (:ro или :rw).
  • Чувствительные монтирования (например, docker.sock, секреты, SSH ключи) должны быть :ro, если это абсолютно не требуется.
  • Комбинируйте с workspaceAccess: "ro", если вам нужен только доступ для чтения к рабочей области; режимы привязок остаются независимыми.
  • Смотрите Sandbox vs Tool Policy vs Elevated для того, как привязки взаимодействуют с политикой инструментов и exec с повышенными правами.

Образы + настройка

Образ по умолчанию: openclaw-sandbox:bookworm-slim

Соберите его один раз:

scripts/sandbox-setup.sh

Примечание: образ по умолчанию не включает Node. Если навыку нужен Node (или другие среды выполнения), либо создайте пользовательский образ, либо установите через sandbox.docker.setupCommand (требуется сетевой выход + записываемый root + пользователь root).

Образ изолированного браузера:

scripts/sandbox-browser-setup.sh

По умолчанию контейнеры песочницы запускаются без сети. Переопределите с помощью agents.defaults.sandbox.docker.network.

Установки Docker и контейнеризированный шлюз находятся здесь: Docker

setupCommand (одноразовая настройка контейнера)

setupCommand выполняется один раз после создания контейнера песочницы (не при каждом запуске). Он выполняется внутри контейнера через sh -lc.

Пути:

  • Глобальный: agents.defaults.sandbox.docker.setupCommand
  • Для каждого агента: agents.list[].sandbox.docker.setupCommand

Общие ловушки:

  • docker.network по умолчанию "none" (без выхода), поэтому установка пакетов не сработает.
  • readOnlyRoot: true предотвращает запись; установите readOnlyRoot: false или создайте пользовательский образ.
  • user должен быть root для установки пакетов (опустите user или установите user: "0:0").
  • Exec в песочнице не наследует process.env хоста. Используйте agents.defaults.sandbox.docker.env (или пользовательский образ) для API ключей навыков.

Политика инструментов + эскейп-хэтчи

Политики разрешения/запрета инструментов всё ещё применяются перед правилами песочницы. Если инструмент запрещён глобально или для отдельного агента, изоляция не вернёт его.

tools.elevated — это явный эскейп-хэтч, который запускает exec на хосте. Директивы /exec применяются только для авторизованных отправителей и сохраняются для сессии; для жёсткого отключения exec используйте запрет политики инструментов (смотрите Sandbox vs Tool Policy vs Elevated).

Отладка:

  • Используйте openclaw sandbox explain для проверки эффективного режима песочницы, политики инструментов и ключей конфигурации для исправления.
  • Смотрите Sandbox vs Tool Policy vs Elevated для ментальной модели "почему это заблокировано?". Держите это заблокированным.

Переопределения для нескольких агентов

Каждый агент может переопределить песочницу + инструменты: agents.list[].sandbox и agents.list[].tools (плюс agents.list[].tools.sandbox.tools для политики инструментов песочницы). Смотрите Multi-Agent Sandbox & Tools для приоритета.

Минимальный пример включения

{
  agents: {
    defaults: {
      sandbox: {
        mode: "non-main",
        scope: "session",
        workspaceAccess: "none"
      }
    }
  }
}

Связанные документы