Перейти к основному содержанию

openclaw policy

openclaw policy предоставляется встроенным Plugin Policy. Policy — это корпоративный слой соответствия поверх существующих настроек OpenClaw. Он не добавляет вторую систему конфигурации. policy.jsonc определяет заданные требования, OpenClaw наблюдает активную рабочую область как доказательство, а проверки состояния политики сообщают о расхождениях через doctor --lint. Итоговый сигнал соответствия — чистый запуск doctor --lint; политика добавляет findings в эту общую поверхность lint вместо создания отдельного шлюза состояния. Policy сейчас управляет настроенными каналами, MCP-серверами, поставщиками моделей, состоянием сетевой защиты от SSRF, состоянием доступа ingress/каналов, состоянием экспозиции Gateway, состоянием рабочей области агента, состоянием обработки данных, состоянием поставщика секретов/профиля auth в конфигурации OpenClaw и управляемыми объявлениями инструментов. Например, IT или оператор рабочей области может зафиксировать, что Telegram не является одобренным поставщиком канала, ограничить MCP-серверы и ссылки на модели одобренными записями, требовать, чтобы доступ fetch/browser к частной сети оставался отключенным, требовать, чтобы изоляция сессий личных сообщений и состояние ingress каналов оставались в проверенных пределах, требовать, чтобы bind/auth/HTTP-экспозиция Gateway оставалась в проверенных пределах, требовать, чтобы доступ агента к рабочей области и запреты инструментов оставались в проверенном состоянии, требовать, чтобы SecretRefs конфигурации OpenClaw использовали управляемых поставщиков, требовать, чтобы профили auth конфигурации содержали метаданные поставщика/режима, требовать, чтобы управляемые инструменты содержали метаданные риска и чувствительности, требовать редактирования чувствительного логирования, запрещать захват содержимого телеметрии, требовать обслуживание срока хранения сессий, запрещать индексирование памяти транскриптов сессий, а затем использовать doctor --lint как общий шлюз соответствия. Используйте policy, когда рабочей области нужно устойчивое утверждение вроде «эти каналы не должны быть включены» или «управляемые инструменты должны объявлять метаданные одобрения», а также повторяемый способ доказать, что OpenClaw по-прежнему соответствует этому утверждению. Используйте только обычную конфигурацию и документацию рабочей области, когда вам нужно лишь локальное поведение и не нужны findings политики или вывод аттестации.

Быстрый старт

Включите встроенный Plugin Policy перед первым использованием:
openclaw plugins enable policy
Когда policy включена, doctor может загружать проверки состояния policy без активации произвольных plugins. Plugin остается включенным, если policy.jsonc отсутствует, чтобы doctor мог сообщить об отсутствующем артефакте. Policy задается вручную, а не генерируется из текущих настроек пользователя. Минимальная policy для каналов, MCP-серверов, поставщиков моделей, сетевого состояния, доступа ingress/каналов, экспозиции Gateway, состояния рабочей области агента, состояния настроенной sandbox runtime, состояния обработки данных OpenClaw, состояния поставщика секретов/профиля auth конфигурации, состояния файла одобрений exec и метаданных инструментов выглядит так:
{
  "channels": {
    "denyRules": [
      {
        "id": "no-telegram",
        "when": { "provider": "telegram" },
        "reason": "Telegram is not approved for this workspace.",
      },
    ],
  },
  "mcp": {
    "servers": {
      "allow": ["docs"],
      "deny": ["untrusted"],
    },
  },
  "models": {
    "providers": {
      "allow": ["openai", "anthropic"],
      "deny": ["openrouter"],
    },
  },
  "network": {
    "privateNetwork": {
      "allow": false,
    },
  },
  "ingress": {
    "session": {
      "requireDmScope": "per-channel-peer",
    },
    "channels": {
      "allowDmPolicies": ["pairing", "allowlist", "disabled"],
      "denyOpenGroups": true,
      "requireMentionInGroups": true,
    },
  },
  "gateway": {
    "exposure": {
      "allowNonLoopbackBind": false,
      "allowTailscaleFunnel": false,
    },
    "auth": {
      "requireAuth": true,
      "requireExplicitRateLimit": true,
    },
    "controlUi": {
      "allowInsecure": false,
    },
    "remote": {
      "allow": false,
    },
    "http": {
      "denyEndpoints": ["chatCompletions", "responses"],
      "requireUrlAllowlists": true,
    },
  },
  "agents": {
    "workspace": {
      "allowedAccess": ["none", "ro"],
      "denyTools": ["exec", "process", "write", "edit", "apply_patch"],
    },
  },
  "dataHandling": {
    "sensitiveLogging": {
      "requireRedaction": true,
    },
    "telemetry": {
      "denyContentCapture": true,
    },
    "retention": {
      "requireSessionMaintenance": true,
    },
    "memory": {
      "denySessionTranscriptIndexing": true,
    },
  },
  "secrets": {
    "requireManagedProviders": true,
    "denySources": ["exec"],
    "allowInsecureProviders": false,
  },
  "auth": {
    "profiles": {
      "requireMetadata": ["provider", "mode"],
      "allowModes": ["api_key", "token"],
    },
  },
  "execApprovals": {
    "requireFile": true,
    "defaults": { "allowSecurity": ["deny"] },
    "agents": {
      "allowSecurity": ["deny", "allowlist"],
      "allowAutoAllowSkills": false,
      "allowlist": { "expected": ["deploy", "status"] },
    },
  },
  "tools": {
    "requireMetadata": ["risk", "sensitivity", "owner"],
    "profiles": {
      "allow": ["messaging", "minimal"],
    },
    "fs": {
      "requireWorkspaceOnly": true,
    },
    "exec": {
      "allowSecurity": ["deny", "allowlist"],
      "requireAsk": ["always"],
      "allowHosts": ["sandbox"],
    },
    "elevated": {
      "allow": false,
    },
    "denyTools": ["group:runtime", "group:fs"],
  },
}
Правила являются источником истины. Блок категории — это только пространство имен; проверки выполняются тогда, когда присутствует конкретное правило. OpenClaw читает текущие настройки channels.*, mcp.servers.*, models.providers.*, выбранные ссылки на модели агентов, настройки сетевого SSRF, область сессий личных сообщений, политику DM канала, групповую политику канала, шлюзы упоминаний канала/группы, состояние bind/auth/Control UI/Tailscale/remote/HTTP Gateway, состояние доступа рабочей области sandbox агента в конфигурации OpenClaw и запретов инструментов, состояние конфигурации обработки данных, происхождение поставщика секретов и SecretRef в конфигурации, метаданные профиля auth конфигурации, настроенное глобальное/покомпонентное состояние инструментов агента и объявления TOOLS.md как доказательство, затем сообщает о наблюдаемом состоянии, которое не соответствует требованиям. Если policy запрещает не-loopback bind Gateway, опускайте gateway.bind только тогда, когда вы готовы проверять runtime default; задайте gateway.bind=loopback для строгого соответствия конфигурации. Для состояния агента только для чтения настройте режим sandbox в применимых defaults или агенте и задайте workspaceAccess как none или ro; опущенный или off режим sandbox не удовлетворяет policy read-only/no-write. agents.workspace.denyTools поддерживает exec, process, write, edit и apply_patch; конфигурация OpenClaw group:fs покрывает инструменты изменения файлов, а group:runtime покрывает shell/process-инструменты. Policy состояния инструментов наблюдает tools.profile, tools.allow, tools.alsoAllow, tools.deny, tools.fs.workspaceOnly, tools.exec.security, tools.exec.ask, tools.exec.host, tools.elevated.enabled и те же переопределения на уровне агента agents.list[].tools.*. Policy одобрений exec читает именованный продуктовый артефакт exec-approvals.json только при наличии правила execApprovals; доказательство фиксирует defaults, состояние на уровне агента и шаблоны allowlist без socket tokens или текста последней использованной команды. Policy не принуждает вызовы инструментов во время runtime. Доказательства секретов фиксируют состояние поставщика/источника и метаданные SecretRef, но никогда не сырые значения секретов. Policy не читает и не аттестует хранилища учетных данных на уровне агента, такие как auth-profiles.json; эти хранилища остаются во владении существующих потоков auth и учетных данных. Доказательства обработки данных — это только состояние на уровне конфигурации: они проверяют настроенный режим редактирования, переключатели захвата содержимого телеметрии, режим обслуживания сессий и настройки индексирования памяти транскриптов сессий. Они не проверяют сырые логи, экспорты телеметрии, содержимое транскриптов, файлы памяти и не доказывают, что персональные данные или секреты отсутствуют.

Справочник правил policy

Каждое поле policy ниже необязательно. Проверка выполняется только тогда, когда соответствующее правило присутствует в policy.jsonc. Наблюдаемое состояние — это существующая конфигурация OpenClaw или метаданные рабочей области; policy сообщает о расхождениях, но не переписывает runtime-поведение, если путь исправления не доступен явно и не включен. Файлы policy строгие: неподдерживаемые секции или ключи правил сообщаются как policy/policy-jsonc-invalid, а не игнорируются. Оверлеи policy сохраняют широкие правила верхнего уровня глобальными, затем позволяют именованным блокам scope добавлять более строгие обычные секции policy для явных селекторов. Имя scope — это только описательная группа; сопоставление использует значения селектора внутри scope. Оверлей аддитивен: глобальные утверждения продолжают выполняться, а scoped-утверждение может создать собственный finding для той же наблюдаемой конфигурации.

Scoped-оверлеи

Используйте scopes.<scopeName>, когда одному набору агентов или каналов нужна более строгая policy, чем базовый уровень верхнего уровня. Секции, scoped по агентам, используют agentIds, который поддерживает tools.*, agents.workspace.*, sandbox.*, dataHandling.memory.* и execApprovals.*. Ingress, scoped по каналам, использует channelIds, который поддерживает ingress.channels.*. Неподдерживаемые секции отклоняются, а не игнорируются. Если запись agentIds отсутствует в agents.list[], OpenClaw оценивает scoped-правило относительно унаследованного глобального/default-состояния для этого runtime agent id.
{
  "tools": {
    "exec": {
      "allowHosts": ["sandbox", "node"],
    },
  },
  "sandbox": {
    "requireMode": ["all", "non-main"],
  },
  "scopes": {
    "release-workspace": {
      "agentIds": ["release-agent", "review-agent"],
      "agents": {
        "workspace": {
          "allowedAccess": ["none", "ro"],
        },
      },
    },
    "release-lockdown": {
      "agentIds": ["release-agent"],
      "tools": {
        "exec": {
          "allowHosts": ["sandbox"],
          "allowSecurity": ["deny", "allowlist"],
          "requireAsk": ["always"],
        },
        "denyTools": ["exec", "process", "write", "edit", "apply_patch"],
      },
      "sandbox": {
        "requireMode": ["all"],
        "allowBackends": ["docker"],
      },
      "dataHandling": {
        "memory": {
          "denySessionTranscriptIndexing": true,
        },
      },
    },
    "shell-sandbox": {
      "agentIds": ["shell-agent"],
      "sandbox": {
        "allowBackends": ["openshell"],
        "containers": {
          "requireReadOnlyMounts": false,
        },
      },
    },
    "telegram-ingress": {
      "channelIds": ["telegram"],
      "ingress": {
        "channels": {
          "allowDmPolicies": ["pairing"],
          "denyOpenGroups": true,
          "requireMentionInGroups": true,
        },
      },
    },
  },
}
Один и тот же агент может присутствовать в нескольких scopes, когда каждый scope управляет разными полями, как показано выше. Повторяющееся scoped-поле для одного и того же агента должно быть столь же или более ограничительным согласно метаданным policy; более слабые дублирующиеся утверждения отклоняются. Метаданные строгости трактуют allow-lists как подмножества, deny-lists как надмножества, а обязательные булевы значения как фиксированные требования. Policy состояния контейнеров оценивается только по доказательствам, которые OpenClaw может наблюдать для сопоставленного агента. Если включенное правило sandbox.containers.* применяется к агенту, чей backend sandbox не может предоставить это поле, policy сообщает policy/sandbox-container-posture-unobservable вместо того, чтобы считать утверждение выполненным. Используйте отдельные scopes agentIds для групп агентов, которые используют разные backends sandbox, и оставляйте неподдерживаемые правила контейнеров неустановленными или false для групп, где эти поля нельзя наблюдать. ingress.session.requireDmScope верхнего уровня остается глобальным, потому что session.dmScope не является доказательством, атрибутируемым каналу.
СелекторПоддерживаемые разделыКогда использовать
agentIdstools, agents.workspace, sandbox, dataHandling.memory и execApprovalsОдному или нескольким runtime-агентам нужны более строгие правила.
channelIdsingress.channelsОдному или нескольким каналам нужны более строгие правила входящего трафика.
Каждая область действия, присутствующая в policy.jsonc, должна быть допустимой и принудительно применимой.

Каналы

Поле политикиНаблюдаемое состояниеКогда использовать
channels.denyRules[].when.providerПровайдер channels.* и состояние включенияЗапретить настроенные каналы от провайдера, например telegram.
channels.denyRules[].reasonСообщение о находке и контекст подсказки по исправлениюОбъяснить, почему провайдер запрещен.

MCP-серверы

Поле политикиНаблюдаемое состояниеКогда использовать
mcp.servers.allowid mcp.servers.*Требовать, чтобы каждый настроенный MCP-сервер был в списке разрешенных.
mcp.servers.denyid mcp.servers.*Запретить конкретные id настроенных MCP-серверов.

Провайдеры моделей

Поле политикиНаблюдаемое состояниеКогда использовать
models.providers.allowid models.providers.* и выбранные ссылки на моделиТребовать, чтобы настроенные провайдеры и выбранные ссылки на модели использовали одобренных провайдеров.
models.providers.denyid models.providers.* и выбранные ссылки на моделиЗапретить настроенных провайдеров и выбранные ссылки на модели по id провайдера.

Сеть

Поле политикиНаблюдаемое состояниеКогда использовать
network.privateNetwork.allowЛазейки обхода SSRF для частной сетиУстановите false, чтобы требовать, чтобы доступ к частной сети оставался отключенным.

Входящий трафик и доступ к каналам

Поле политикиНаблюдаемое состояниеКогда использовать
ingress.session.requireDmScopesession.dmScopeТребовать проверенную область изоляции личных сообщений.
ingress.channels.allowDmPolicieschannels.*.dmPolicy и устаревшие поля политики DM каналаРазрешать только проверенные политики каналов для личных сообщений.
ingress.channels.denyOpenGroupsПолитика входящего трафика канала, аккаунта и группыЗапретить открытый входящий трафик групп для настроенных каналов и аккаунтов.
ingress.channels.requireMentionInGroupsКонфигурация шлюза упоминаний для канала, аккаунта, группы, guild и вложенных упоминанийТребовать шлюзы упоминаний, когда входящий трафик групп открыт или ограничен упоминаниями.

Gateway

Поле политикиНаблюдаемое состояниеКогда использовать
gateway.exposure.allowNonLoopbackBindgateway.bindУстановите false, чтобы требовать привязку Gateway к loopback.
gateway.exposure.allowTailscaleFunnelПоложение Tailscale serve/funnel для GatewayУстановите false, чтобы запретить экспонирование Tailscale Funnel.
gateway.auth.requireAuthgateway.auth.modeУстановите true, чтобы отклонять отключенную аутентификацию Gateway.
gateway.auth.requireExplicitRateLimitgateway.auth.rateLimitУстановите true, чтобы требовать явную конфигурацию лимита скорости аутентификации.
gateway.controlUi.allowInsecureНебезопасные переключатели аутентификации/устройства/origin для Control UIУстановите false, чтобы запретить небезопасные переключатели экспонирования Control UI.
gateway.remote.allowРежим/конфигурация удаленного GatewayУстановите false, чтобы запретить режим удаленного Gateway.
gateway.http.denyEndpointsКонечные точки HTTP API GatewayЗапретить id конечных точек, такие как chatCompletions или responses.
gateway.http.requireUrlAllowlistsВходные данные URL-fetch Gateway HTTPУстановите true, чтобы требовать списки разрешенных URL для входных данных URL-fetch.

Рабочее пространство агента

Поле политикиНаблюдаемое состояниеКогда использовать
agents.workspace.allowedAccessagents.defaults.sandbox.workspaceAccess и agents.list[].sandbox.workspaceAccessРазрешать только значения доступа к рабочему пространству песочницы, такие как none или ro.
agents.workspace.denyToolsГлобальная и поагентная конфигурация запрета инструментовТребовать запрета инструментов изменения рабочего пространства/runtime, таких как exec, process, write, edit или apply_patch.

Положение песочницы

Поле политикиНаблюдаемое состояниеКогда использовать
sandbox.requireModeagents.defaults.sandbox.mode и поагентный режимРазрешать только проверенные режимы песочницы, такие как all или non-main.
sandbox.allowBackendsagents.defaults.sandbox.backend и поагентный backendРазрешать только проверенные backend песочницы, такие как docker.
sandbox.containers.denyHostNetworkСетевой режим песочницы/браузера на базе контейнераЗапретить сетевой режим хоста.
sandbox.containers.denyContainerNamespaceJoinСетевой режим песочницы/браузера на базе контейнераЗапретить присоединение к пространству имен сети другого контейнера.
sandbox.containers.requireReadOnlyMountsРежим монтирования песочницы/браузера на базе контейнераТребовать, чтобы точки монтирования были только для чтения.
sandbox.containers.denyContainerRuntimeSocketMountsЦели монтирования песочницы/браузера на базе контейнераЗапретить монтирование сокетов runtime контейнеров.
sandbox.containers.denyUnconfinedProfilesПоложение профиля безопасности контейнераЗапретить неограниченные профили безопасности контейнера.
sandbox.browser.requireCdpSourceRangeДиапазон источника CDP браузера песочницыТребовать, чтобы экспонирование CDP браузера объявляло диапазон источника.
Политика трактует отсутствующий sandbox.mode как неявное значение по умолчанию off, поэтому sandbox.requireMode сообщает о новой или ненастроенной песочнице как находящейся вне списка разрешенных, например ["all"].

Обработка данных

Поле политикиНаблюдаемое состояниеКогда использовать
dataHandling.sensitiveLogging.requireRedactionlogging.redactSensitiveУстановите true, чтобы отклонять logging.redactSensitive: "off".
dataHandling.telemetry.denyContentCapturediagnostics.otel.captureContentУстановите true, чтобы отклонять захват содержимого телеметрией.
dataHandling.retention.requireSessionMaintenancesession.maintenance.modeУстановите true, чтобы требовать эффективный режим обслуживания сеансов enforce.
dataHandling.memory.denySessionTranscriptIndexingmemory.qmd.sessions.enabled и agents.*.memorySearch.experimental.sessionMemoryУстановите true, чтобы отклонять индексацию стенограмм сеансов в память.

Секреты

Поле политикиНаблюдаемое состояниеКогда использовать
secrets.requireManagedProvidersConfig SecretRefs и объявления secrets.providers.*Установите true, чтобы требовать, чтобы SecretRefs указывали на объявленных провайдеров.
secrets.denySourcesИсточники провайдеров секретов и источники SecretRefЗапретить источники, такие как exec, file или другое настроенное имя источника.
secrets.allowInsecureProvidersФлаги небезопасного положения провайдера секретовУстановите false, чтобы отклонять провайдеров, которые явно выбирают небезопасное положение.

Подтверждения exec

Политика подтверждений exec наблюдает активный runtime-артефакт exec-approvals.json. По умолчанию это ~/.openclaw/exec-approvals.json; когда задан OPENCLAW_STATE_DIR, Policy читает $OPENCLAW_STATE_DIR/exec-approvals.json. Фактические правила положения, такие как execApprovals.defaults.* или execApprovals.agents.*, требуют читаемых доказательств из артефакта; отсутствующий или недопустимый артефакт сообщается как ненаблюдаемое доказательство, а не становится best-effort прохождением проверки относительно синтетических runtime-значений по умолчанию. После того как артефакт становится читаемым, пропущенные поля подтверждений наследуют runtime-значения по умолчанию: отсутствующее defaults.security равно full, а отсутствующая безопасность агента наследует это значение по умолчанию. Доказательства включают defaults, agents.* и agents.*.allowlist[].pattern, а также необязательный argPattern, эффективное положение autoAllowSkills и источник записи. Они не включают путь сокета/токен, commandText, lastUsedCommand, разрешенные пути или метки времени.
Поле политикиНаблюдаемое состояниеКогда использовать
execApprovals.requireFileПуть активного runtime-артефакта exec-approvals.jsonУстановите true, чтобы требовать существования и разбора артефакта подтверждений.
execApprovals.defaults.allowSecuritydefaults.security, по умолчанию fullРазрешать только утвержденные режимы безопасности подтверждений по умолчанию.
execApprovals.agents.allowSecurityagents.*.security, наследует значения по умолчаниюРазрешать только утвержденные эффективные режимы безопасности подтверждений для агента.
execApprovals.agents.allowAutoAllowSkillsdefaults.autoAllowSkills и agents.*.autoAllowSkills, наследуют runtime defaultsУстановите false, чтобы требовать строгие ручные allowlist без неявного подтверждения CLI Skills.
execApprovals.agents.allowlist.expectedСовокупность шаблона agents.*.allowlist[] и необязательных записей argPatternТребовать, чтобы allowlist подтверждений совпадал с проверенным набором шаблонов.
Например, требуйте артефакт подтверждений, запрещайте разрешающие значения по умолчанию и разрешайте только проверенную позицию подтверждения exec для выбранных агентов:
{
  "execApprovals": {
    "requireFile": true,
    "defaults": {
      // Security modes: "deny", "allowlist", or "full".
      // This default permits only the locked-down deny posture.
      "allowSecurity": ["deny"],
    },
  },
  "scopes": {
    "restricted-shell": {
      "agentIds": ["family-agent", "groups-agent"],
      "execApprovals": {
        "agents": {
          // Selected agents may use reviewed allowlist posture, but not "full".
          "allowSecurity": ["allowlist"],
          // false means skill CLIs must appear in the reviewed allowlist instead of
          // being implicitly approved by autoAllowSkills.
          "allowAutoAllowSkills": false,
          "allowlist": {
            "expected": [
              // Simple entry: exact reviewed executable pattern with no argPattern.
              "travel-hub",
              // Constrained entry: pattern plus reviewed argument regex.
              { "pattern": "calendar-cli", "argPattern": "^sync\\b" },
              "/bin/date",
            ],
          },
        },
      },
    },
  },
}

Профили аутентификации

Поле политикиНаблюдаемое состояниеКогда использовать
auth.profiles.requireMetadataМетаданные провайдера и режима auth.profiles.*Требовать ключи метаданных, такие как provider и mode, в профилях аутентификации config.
auth.profiles.allowModesauth.profiles.*.modeРазрешать только поддерживаемые режимы профиля аутентификации, такие как api_key, aws-sdk, oauth или token.

Метаданные инструментов

Поле политикиНаблюдаемое состояниеКогда использовать
tools.requireMetadataУправляемые объявления TOOLS.mdТребовать, чтобы управляемые инструменты объявляли ключи метаданных, такие как risk, sensitivity или owner.

Позиция инструментов

Поле политикиНаблюдаемое состояниеКогда использовать
tools.profiles.allowtools.profile и agents.list[].tools.profileРазрешать только ids профилей инструментов, такие как minimal, messaging или coding.
tools.fs.requireWorkspaceOnlytools.fs.workspaceOnly и переопределения tools.fs для агентаУстановите true, чтобы требовать позицию filesystem-инструмента только в пределах workspace.
tools.exec.allowSecuritytools.exec.security и безопасность exec для агентаРазрешать только режимы безопасности exec, такие как deny или allowlist.
tools.exec.requireAsktools.exec.ask и режим запроса exec для агентаТребовать позицию подтверждения, например always.
tools.exec.allowHoststools.exec.host и маршрутизация exec host для агентаРазрешать только режимы маршрутизации exec host, такие как sandbox.
tools.elevated.allowtools.elevated.enabled и elevated-позиция для агентаУстановите false, чтобы требовать, чтобы elevated-режим инструмента оставался отключенным.
tools.alsoAllow.expectedtools.alsoAllow и tools.alsoAllow для агентаТребовать точные записи alsoAllow и сообщать об отсутствующих или неожиданных дополнительных разрешениях инструментов.
tools.denyToolstools.deny и agents.list[].tools.denyТребовать, чтобы настроенные списки запрета инструментов включали ids или группы инструментов, такие как group:runtime и group:fs.
Запускайте проверки только политики во время авторинга:
openclaw policy check
openclaw policy check --json
openclaw policy check --severity-min error
policy check запускает только набор проверок политики и выводит доказательства, findings и хэши аттестации. Те же findings также появляются в openclaw doctor --lint, когда Policy plugin включен. Сравните файл политики оператора с authored baseline-файлом политики:
openclaw policy compare --baseline official.policy.jsonc
openclaw policy compare --baseline official.policy.jsonc --policy policy.jsonc --json
policy compare сравнивает синтаксис файла политики с синтаксисом файла политики. Он не проверяет runtime-состояние OpenClaw, доказательства, учетные данные или секреты. Команда использует те же метаданные правил политики, которые управляют scoped overlays: allowlist должны оставаться равными или более узкими, denylist должны оставаться равными или более широкими, обязательные булевы значения должны сохранять требуемое значение, упорядоченные строки должны смещаться только к более ограничительному концу настроенного порядка, а точные списки должны совпадать. Файл baseline может быть политикой, authored организацией. Проверяемая политика может использовать более строгие значения или добавлять дополнительные правила политики. Проверяемое правило верхнего уровня также может удовлетворять scoped baseline-правилу, когда оно столь же или более ограничительное, потому что политика верхнего уровня применяется широко. Имена scope не обязаны совпадать; scoped-сравнение привязано к значению селектора, такому как agentIds или channelIds, и к проверяемому полю политики. Пример чистого JSON-вывода compare сообщает только состояние сравнения файлов политики:
{
  "ok": true,
  "baselinePath": "official.policy.jsonc",
  "policyPath": "policy.jsonc",
  "rulesChecked": 3,
  "findings": []
}
Пример чистого вывода policy check --json включает стабильные хэши, которые оператор или supervisor может записать:
{
  "ok": true,
  "attestation": {
    "policy": {
      "path": "policy.jsonc",
      "hash": "sha256:..."
    },
    "workspace": {
      "scope": "policy",
      "hash": "sha256:..."
    },
    "findingsHash": "sha256:...",
    "attestationHash": "sha256:..."
  },
  "checksRun": 5,
  "checksSkipped": 0,
  "findings": []
}

Настройка политики

Конфигурация политики находится в plugins.entries.policy.config.
{
  "plugins": {
    "entries": {
      "policy": {
        "enabled": true,
        "config": {
          "enabled": true,
          "path": "policy.jsonc",
          "workspaceRepairs": false,
          "expectedHash": "sha256:...",
          "expectedAttestationHash": "sha256:...",
        },
      },
    },
  },
}
НастройкаНазначение
enabledВключить проверки политики даже до появления policy.jsonc.
workspaceRepairsРазрешить doctor --fix редактировать управляемые политикой настройки workspace.
expectedHashНеобязательная hash-lock для утвержденного артефакта политики.
expectedAttestationHashНеобязательная hash-lock для последней принятой чистой проверки политики.
pathРасположение артефакта политики относительно workspace.
Установите plugins.entries.policy.config.enabled в false, чтобы отключить проверки политики для workspace, оставив Plugin установленным. Требования к метаданным инструментов authored в policy.jsonc с помощью tools.requireMetadata, например ["risk", "sensitivity", "owner"].

Принятие состояния политики

Пример JSON-вывода:
{
  "ok": true,
  "attestation": {
    "checkedAt": "2026-05-10T20:00:00.000Z",
    "policy": {
      "path": "policy.jsonc",
      "hash": "sha256:..."
    },
    "workspace": {
      "scope": "policy",
      "hash": "sha256:..."
    },
    "findingsHash": "sha256:...",
    "attestationHash": "sha256:..."
  },
  "evidence": {
    "channels": [
      {
        "id": "telegram",
        "provider": "telegram",
        "source": "oc://openclaw.config/channels/telegram",
        "enabled": false
      }
    ],
    "mcpServers": [
      {
        "id": "docs",
        "transport": "stdio",
        "source": "oc://openclaw.config/mcp/servers/docs",
        "command": "npx"
      }
    ],
    "modelProviders": [
      {
        "id": "openai",
        "source": "oc://openclaw.config/models/providers/openai"
      }
    ],
    "modelRefs": [
      {
        "ref": "openai/gpt-5.5",
        "provider": "openai",
        "model": "gpt-5.5",
        "source": "oc://openclaw.config/agents/defaults/model"
      }
    ],
    "network": [
      {
        "id": "browser-private-network",
        "source": "oc://openclaw.config/browser/ssrfPolicy/dangerouslyAllowPrivateNetwork",
        "value": false
      }
    ],
    "gatewayExposure": [
      {
        "id": "gateway-bind",
        "kind": "bind",
        "source": "oc://openclaw.config/gateway/bind",
        "value": "loopback",
        "nonLoopback": false,
        "explicit": true
      }
    ],
    "agentWorkspace": [
      {
        "id": "agents-defaults-workspace-access",
        "kind": "workspaceAccess",
        "source": "oc://openclaw.config/agents/defaults/sandbox/workspaceAccess",
        "scope": "defaults",
        "value": "ro",
        "sandboxMode": "all",
        "sandboxModeSource": "oc://openclaw.config/agents/defaults/sandbox/mode",
        "sandboxEnabled": true,
        "explicit": true
      },
      {
        "id": "agents-defaults-tool-exec",
        "kind": "toolDeny",
        "source": "oc://openclaw.config/tools/deny",
        "scope": "defaults",
        "tool": "exec",
        "denied": true,
        "explicit": true
      }
    ],
    "secrets": [
      {
        "id": "vault",
        "kind": "provider",
        "source": "oc://openclaw.config/secrets/providers/vault",
        "providerSource": "env"
      },
      {
        "id": "oc://openclaw.config/models/providers/openai/apiKey",
        "kind": "input",
        "source": "oc://openclaw.config/models/providers/openai/apiKey",
        "provenance": "secretRef",
        "refSource": "env",
        "refProvider": "vault"
      }
    ],
    "authProfiles": [
      {
        "id": "github",
        "source": "oc://openclaw.config/auth/profiles/github",
        "validMetadata": true,
        "provider": "github",
        "mode": "token"
      }
    ],
    "tools": [
      {
        "id": "deploy",
        "source": "oc://TOOLS.md/tools/deploy",
        "line": 12,
        "risk": "critical",
        "sensitivity": "restricted",
        "capabilities": ["IRREVERSIBLE_EXTERNAL"]
      }
    ]
  },
  "checksRun": 30,
  "checksSkipped": 0,
  "findings": []
}
Хеш политики идентифицирует созданный артефакт правил. Блок доказательств записывает наблюдаемое состояние OpenClaw, использованное проверками политики. Значение workspace.hash идентифицирует эту полезную нагрузку доказательств для проверенной области. Хеш находок идентифицирует точный набор находок, возвращенный проверкой. checkedAt фиксирует время выполнения оценки. Хеш аттестации идентифицирует стабильное утверждение: хеш политики, хеш доказательств, хеш находок и то, был ли результат чистым. Он намеренно не включает checkedAt, поэтому одно и то же состояние политики создает одну и ту же аттестацию при повторных проверках. Вместе они образуют аудиторский кортеж для этой проверки политики. Если позже Gateway или супервизор использует политику, чтобы блокировать, одобрять или аннотировать действие во время выполнения, он должен записывать хеш аттестации из последней чистой проверки политики. checkedAt остается в выводе JSON для журналов аудита, но не является частью стабильного хеша аттестации. Используйте этот жизненный цикл при принятии состояния политики:
  1. Создайте или проверьте policy.jsonc.
  2. Запустите openclaw policy check --json.
  3. Если результат чистый, запишите attestation.policy.hash как expectedHash.
  4. Запишите attestation.attestationHash как expectedAttestationHash.
  5. Повторно запустите openclaw doctor --lint в CI или релизных шлюзах.
Если правила политики намеренно изменяются, обновите оба принятых хеша из чистой проверки. Если настройки рабочей области намеренно изменяются, но политика остается прежней, обычно изменяется только expectedAttestationHash. Включение или обновление правил agents.workspace добавляет доказательство agentWorkspace в хеш рабочей области и хеш аттестации. Операторам следует проверить новое доказательство и обновить принятые хеши аттестации после включения этих правил. Включение или обновление правил состояния инструментов добавляет доказательство toolPosture тем же образом. openclaw policy watch многократно выполняет ту же проверку и сообщает, когда текущие доказательства больше не соответствуют expectedAttestationHash:
openclaw policy watch --json
Используйте --once в CI или скриптах, которым нужна только одна оценка дрейфа. Без --once команда по умолчанию опрашивает каждые две секунды; используйте --interval-ms, чтобы выбрать другой интервал.

Находки

Политика сейчас проверяет:
ID проверкиНаходка
policy/policy-jsonc-missingПолитика включена, но policy.jsonc отсутствует.
policy/policy-jsonc-invalidПолитику не удается разобрать или она содержит некорректные записи правил.
policy/policy-hash-mismatchПолитика не соответствует настроенному expectedHash.
policy/attestation-hash-mismatchТекущие доказательства политики больше не соответствуют принятой аттестации.
policy/policy-conformance-invalidБазовый или проверяемый файл политики содержит недопустимый синтаксис сравнения.
policy/policy-conformance-missingВ проверяемом файле политики отсутствует правило, требуемое базовым файлом политики.
policy/policy-conformance-weakerВ проверяемом файле политики значение слабее, чем в базовом файле политики.
policy/channels-denied-providerВключенный канал соответствует правилу запрета канала.
policy/mcp-denied-serverНастроенный MCP-сервер запрещен политикой.
policy/mcp-unapproved-serverНастроенный MCP-сервер находится вне списка разрешений.
policy/models-denied-providerНастроенный поставщик моделей или ссылка на модель использует запрещенного поставщика.
policy/models-unapproved-providerНастроенный поставщик моделей или ссылка на модель находится вне списка разрешений.
policy/network-private-access-enabledОбход SSRF для частной сети включен, хотя политика запрещает его.
policy/ingress-dm-policy-unapprovedПолитика личных сообщений канала находится вне списка разрешений политики.
policy/ingress-dm-scope-unapprovedsession.dmScope не соответствует области изоляции личных сообщений, требуемой политикой.
policy/ingress-open-groups-deniedПолитика группы канала имеет значение open, хотя политика запрещает входящий доступ для открытых групп.
policy/ingress-group-mention-requiredЗапись канала или группы отключает шлюзы упоминаний, хотя политика требует их.
policy/gateway-non-loopback-bindСостояние привязки Gateway допускает доступ не через loopback, хотя политика запрещает его.
policy/gateway-auth-disabledАутентификация Gateway отключена, хотя политика требует аутентификацию.
policy/gateway-rate-limit-missingСостояние ограничения частоты для аутентификации Gateway не задано явно, хотя политика требует этого.
policy/gateway-control-ui-insecureВключены переключатели небезопасного доступа к Gateway Control UI.
policy/gateway-tailscale-funnelДоступ через Gateway Tailscale Funnel включен, хотя политика запрещает его.
policy/gateway-remote-enabledУдаленный режим Gateway активен, хотя политика запрещает его.
policy/gateway-http-endpoint-enabledHTTP API endpoint Gateway включен, хотя он запрещен политикой.
policy/gateway-http-url-fetch-unrestrictedВвод URL-fetch Gateway HTTP не имеет требуемого списка разрешенных URL.
policy/agents-workspace-access-deniedРежим песочницы агента или доступ к рабочей области находится вне списка разрешений политики.
policy/agents-tool-not-deniedАгент или конфигурация по умолчанию не запрещает инструмент, требуемый политикой.
policy/tools-profile-unapprovedНастроенный глобальный или агентский профиль инструментов находится вне списка разрешений.
policy/tools-fs-workspace-only-requiredИнструменты файловой системы не настроены на состояние путей только в рабочей области.
policy/tools-exec-security-unapprovedРежим безопасности exec находится вне списка разрешений политики.
policy/tools-exec-ask-unapprovedРежим запроса exec находится вне списка разрешений политики.
policy/tools-exec-host-unapprovedМаршрутизация хоста exec находится вне списка разрешений политики.
policy/tools-elevated-enabledПовышенный режим инструмента включен, хотя политика запрещает его.
policy/tools-also-allow-missingВ настроенном списке alsoAllow отсутствует запись, требуемая политикой.
policy/tools-also-allow-unexpectedНастроенный список alsoAllow включает запись, не ожидаемую политикой.
policy/tools-required-deny-missingГлобальный или агентский список запрета инструментов не включает обязательный запрещенный инструмент.
policy/sandbox-mode-unapprovedРежим песочницы находится вне списка разрешений политики.
policy/sandbox-backend-unapprovedБэкенд песочницы находится вне списка разрешений политики.
policy/sandbox-container-posture-unobservableПравило состояния контейнера включено для бэкенда, который не может его наблюдать.
policy/sandbox-container-host-network-deniedПесочница или браузер на базе контейнера использует режим сети хоста.
policy/sandbox-container-namespace-join-deniedПесочница или браузер на базе контейнера присоединяется к пространству имен другого контейнера.
policy/sandbox-container-mount-mode-requiredМонтирование песочницы или браузера на базе контейнера не является доступным только для чтения.
policy/sandbox-container-runtime-socket-mountМонтирование песочницы или браузера на базе контейнера открывает сокет среды выполнения контейнера.
policy/sandbox-container-unconfined-profileПрофиль контейнерной песочницы является неограниченным, хотя политика запрещает это.
policy/sandbox-browser-cdp-source-range-missingДиапазон источника CDP браузера песочницы отсутствует, хотя политика требует его.
policy/data-handling-redaction-disabledРедактирование чувствительных данных в журналах отключено, хотя политика требует его.
policy/data-handling-telemetry-content-captureЗахват содержимого телеметрии включен, хотя политика запрещает его.
policy/data-handling-session-retention-not-enforcedОбслуживание срока хранения сеансов не применяется, хотя политика требует его.
policy/data-handling-session-transcript-memory-enabledИндексация памяти расшифровок сеансов включена, хотя политика запрещает ее.
policy/secrets-unmanaged-providerConfig SecretRef ссылается на поставщика, не объявленного в secrets.providers.
policy/secrets-denied-provider-sourceПоставщик секретов конфигурации или SecretRef использует источник, запрещенный политикой.
policy/secrets-insecure-providerПоставщик секретов выбирает небезопасное состояние, хотя политика запрещает его.
policy/auth-profile-invalid-metadataВ профиле аутентификации конфигурации отсутствуют корректные метаданные поставщика или режима.
policy/auth-profile-unapproved-modeРежим профиля аутентификации конфигурации находится вне списка разрешений политики.
policy/exec-approvals-missingПолитика требует exec-approvals.json, но артефакт отсутствует.
policy/exec-approvals-invalidНастроенный артефакт утверждений exec не удается разобрать.
policy/exec-approvals-default-security-unapprovedЗначения утверждений exec по умолчанию используют режим безопасности вне списка разрешений политики.
policy/exec-approvals-agent-security-unapprovedЭффективный режим безопасности утверждения exec для агента находится вне списка разрешений.
policy/exec-approvals-auto-allow-skills-enabledАгент утверждения exec неявно автоматически разрешает CLI Skills, хотя политика запрещает это.
policy/exec-approvals-allowlist-missingВ списке разрешений утверждений отсутствует шаблон, требуемый политикой.
policy/exec-approvals-allowlist-unexpectedСписок разрешений утверждений включает шаблон, не ожидаемый политикой.
policy/tools-missing-risk-levelВ управляемом объявлении инструмента отсутствуют метаданные риска.
policy/tools-unknown-risk-levelУправляемое объявление инструмента использует неизвестное значение риска.
policy/tools-missing-sensitivity-tokenВ управляемом объявлении инструмента отсутствуют метаданные чувствительности.
policy/tools-missing-ownerВ управляемом объявлении инструмента отсутствуют метаданные владельца.
policy/tools-unknown-sensitivity-tokenУправляемое объявление инструмента использует неизвестное значение чувствительности.
Находки политики могут включать и target, и requirement. target — это наблюдаемый объект рабочей области, который не соответствует требованиям. requirement — это созданное правило политики, из-за которого он стал находкой. Сегодня оба значения являются адресами, обычно путями oc://, но имена полей описывают их роль в политике, а не формат адреса. Пример JSON-находки:
{
  "checkId": "policy/channels-denied-provider",
  "severity": "error",
  "message": "Channel 'telegram' uses denied provider 'telegram'.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/channels/telegram",
  "target": "oc://openclaw.config/channels/telegram",
  "requirement": "oc://policy.jsonc/channels/denyRules/#0",
  "fixHint": "Telegram is not approved for this workspace."
}
Пример находки инструмента:
{
  "checkId": "policy/tools-missing-risk-level",
  "severity": "error",
  "message": "TOOLS.md tool 'deploy' has no explicit risk classification.",
  "source": "policy",
  "path": "TOOLS.md",
  "line": 12,
  "ocPath": "oc://TOOLS.md/tools/deploy",
  "target": "oc://TOOLS.md/tools/deploy",
  "requirement": "oc://policy.jsonc/tools/requireMetadata"
}
Пример MCP-находки:
{
  "checkId": "policy/mcp-unapproved-server",
  "severity": "error",
  "message": "MCP server 'remote' is not in the policy allowlist.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/mcp/servers/remote",
  "target": "oc://openclaw.config/mcp/servers/remote",
  "requirement": "oc://policy.jsonc/mcp/servers/allow"
}
Пример находки поставщика модели:
{
  "checkId": "policy/models-unapproved-provider",
  "severity": "error",
  "message": "Model ref 'anthropic/claude-sonnet-4.7' uses unapproved provider 'anthropic'.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/agents/defaults/model/fallbacks/#0",
  "target": "oc://openclaw.config/agents/defaults/model/fallbacks/#0",
  "requirement": "oc://policy.jsonc/models/providers/allow"
}
Пример сетевой находки:
{
  "checkId": "policy/network-private-access-enabled",
  "severity": "error",
  "message": "Network setting 'browser-private-network' allows private-network access.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/browser/ssrfPolicy/dangerouslyAllowPrivateNetwork",
  "target": "oc://openclaw.config/browser/ssrfPolicy/dangerouslyAllowPrivateNetwork",
  "requirement": "oc://policy.jsonc/network/privateNetwork/allow"
}
Пример обнаружения раскрытия Gateway:
{
  "checkId": "policy/gateway-non-loopback-bind",
  "severity": "error",
  "message": "Gateway bind setting 'gateway-bind' permits non-loopback exposure.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/gateway/bind",
  "target": "oc://openclaw.config/gateway/bind",
  "requirement": "oc://policy.jsonc/gateway/exposure/allowNonLoopbackBind"
}
Пример обнаружения рабочей области агента:
{
  "checkId": "policy/agents-workspace-access-denied",
  "severity": "error",
  "message": "agents.defaults sandbox workspaceAccess 'rw' is not allowed by policy.",
  "source": "policy",
  "path": "openclaw config",
  "ocPath": "oc://openclaw.config/agents/defaults/sandbox/workspaceAccess",
  "target": "oc://openclaw.config/agents/defaults/sandbox/workspaceAccess",
  "requirement": "oc://policy.jsonc/agents/workspace/allowedAccess"
}

Исправление

doctor --lint и policy check доступны только для чтения. doctor --fix изменяет управляемые политиками настройки рабочей области только тогда, когда workspaceRepairs явно включен. Без этого явного согласия проверки политик сообщают, что они бы исправили, и оставляют настройки без изменений. В этой версии исправление может отключать каналы, которые включены в конфигурации OpenClaw, но запрещены channels.denyRules. Включайте workspaceRepairs только после проверки файла политики, потому что корректное правило запрета может отключить настроенный канал:
{
  "plugins": {
    "entries": {
      "policy": {
        "config": {
          "workspaceRepairs": true,
        },
      },
    },
  },
}

Коды выхода

Команда012
policy checkНет находок на пороге.Одна или несколько находок достигли порога.Ошибка аргументов или выполнения.
policy compareФайл политики не менее строгий, чем базовый уровень.Файл политики недействителен, отсутствует или слабее базовых правил.Ошибка аргументов или выполнения.
policy watchНет находок, и принятый хэш актуален.Находки существуют или принятое свидетельство устарело.Ошибка аргументов или выполнения.

См. также