CLI commands

Политика

openclaw policy

openclaw policy предоставляется встроенным плагином Policy. Это корпоративный уровень проверки соответствия поверх существующих настроек OpenClaw, а не вторая система конфигурации. Требования задаются в policy.jsonc; OpenClaw использует активное рабочее пространство как свидетельство; Policy сообщает об отклонениях через doctor --lint. Policy не контролирует вызовы инструментов и не изменяет поведение среды выполнения во время обработки запроса, а также не подтверждает соответствие хранилищ учетных данных отдельных агентов, таких как auth-profiles.json.

Policy проверяет настроенные каналы, серверы MCP, поставщиков моделей, защиту сети от SSRF, доступ к входящим подключениям и каналам, доступность Gateway и состояние команд узлов, доступ агентов к рабочему пространству, состояние песочницы, состояние обработки данных, состояние поставщиков секретов и профилей аутентификации, а также метаданные управляемых инструментов (TOOLS.md). Используйте его, когда рабочему пространству требуется устойчивое, проверяемое требование, например «Telegram не должен быть включен» или «управляемые инструменты должны содержать метаданные риска и владельца». Если нужно только локальное поведение без подтверждения соответствия или обнаружения отклонений, достаточно обычной конфигурации.

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

bash
openclaw plugins enable policy

Плагин остается включенным, даже если policy.jsonc отсутствует, чтобы doctor мог сообщить об отсутствующем артефакте, а не молча пропустить проверки.

Создайте policy.jsonc вручную; он не генерируется из текущих настроек. Каждый раздел верхнего уровня представляет пространство имен правил: проверка выполняется только при наличии конкретного правила в этом разделе (неподдерживаемые разделы или ключи приводят к ошибке policy/policy-jsonc-invalid, а не игнорируются без уведомления). Минимальный пример, охватывающий все поддерживаемые разделы:

jsonc
{  "channels": {    "denyRules": [      {        "id": "no-telegram",        "when": { "provider": "telegram" },        "reason": "Telegram не одобрен для этого рабочего пространства.",      },    ],  },  "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,    },    "nodes": {      "denyCommands": ["system.run"],    },  },  "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"],  },}

Общие примечания, неочевидные из приведенных ниже таблиц правил:

  • Если запретить привязку к адресам, отличным от loopback, но не указать gateway.bind, будет принят стандартный вариант среды выполнения; для строгого соответствия задайте gateway.bind: "loopback".
  • Для агента с доступом только для чтения задайте параметру песочницы mode значение all или non-main в применимых настройках по умолчанию или настройках агента, а параметру workspaceAccess — значение none или ro. Отсутствующий режим песочницы или режим off не соответствует политике доступа только для чтения.
  • agents.workspace.denyTools принимает exec, process, write, edit, apply_patch. Группы запрета инструментов в конфигурации group:fs (изменение файлов) и group:runtime (командная оболочка и процессы) обеспечивают эквивалентное состояние.
  • Проверки разрешений на выполнение считывают активный артефакт exec-approvals.json только при наличии правила execApprovals; отсутствующий или недопустимый артефакт считается ненаблюдаемым свидетельством, а не искусственно успешной проверкой.
  • Свидетельства о секретах и профилях аутентификации содержат только сведения о состоянии поставщика или источника и метаданные SecretRef, но никогда не исходные значения. Policy не считывает и не подтверждает соответствие хранилищ учетных данных отдельных агентов, таких как auth-profiles.json.
  • Свидетельства об обработке данных отражают только состояние на уровне конфигурации (режим редактирования, переключатель захвата телеметрии, режим обслуживания сеансов, настройка индексирования расшифровок). Они не проверяют журналы, экспортированные данные телеметрии, расшифровки или файлы памяти, и успешный результат не доказывает отсутствие в них персональных данных или секретов.

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

Каждое приведенное ниже правило необязательно; проверка выполняется только при наличии правила. Наблюдаемое состояние — это существующая конфигурация OpenClaw или метаданные рабочего пространства.

Области с наложением правил

Используйте scopes.<scopeName>, когда отдельным агентам или каналам нужна более строгая политика, чем базовая политика верхнего уровня. Имя области — лишь метка; сопоставление выполняется по селектору внутри области. Наложения дополняют друг друга: глобальное правило продолжает действовать, а правило области может добавить собственное обнаруженное несоответствие для тех же свидетельств.

Селектор Поддерживаемые разделы Когда использовать
agentIds tools, agents.workspace, sandbox, dataHandling.memory, execApprovals Одному или нескольким агентам среды выполнения нужны более строгие правила.
channelIds ingress.channels Одному или нескольким каналам нужны более строгие правила входящего доступа.

Если запись agentIds отсутствует в agents.list[], OpenClaw проверяет правило области по унаследованному глобальному состоянию или состоянию по умолчанию для агента среды выполнения с указанным идентификатором, а не пропускает его.

jsonc
{  "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,        },      },    },  },}

Один и тот же агент может входить в несколько областей, если каждая область регулирует отдельное поле, как показано выше. Повторное поле области для одного агента должно быть столь же или более строгим; менее строгое повторное требование отклоняется (списки разрешений должны быть подмножествами, списки запретов — надмножествами, а обязательные логические значения неизменны).

Правила состояния контейнеров (sandbox.containers.*) проверяются только по свидетельствам, которые может предоставить серверная часть песочницы соответствующего агента. Если серверная часть не может наблюдать включенное для нее правило, Policy сообщает policy/sandbox-container-posture-unobservable, а не считает проверку успешной; ограничивайте правила контейнеров областями групп агентов, использующих серверную часть, которая может предоставить эти сведения.

Параметр верхнего уровня ingress.session.requireDmScope остается глобальным; session.dmScope не является свидетельством, которое можно отнести к каналу, поэтому его нельзя ограничить областью по channelIds.

Каждая область в policy.jsonc должна быть допустимой и обеспечивать выполнение правил.

Каналы

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

Серверы MCP

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

Поставщики моделей

Поле политики Наблюдаемое состояние Когда использовать
models.providers.allow Идентификаторы models.providers.* и ссылки на выбранные модели Требовать, чтобы настроенные поставщики и ссылки на выбранные модели использовали одобренных поставщиков.
models.providers.deny Идентификаторы models.providers.* и ссылки на выбранные модели Запретить настроенных поставщиков и ссылки на выбранные модели по идентификатору поставщика.

Сеть

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

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

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

Gateway

Поле политики Наблюдаемое состояние Когда использовать
gateway.exposure.allowNonLoopbackBind gateway.bind Установить значение false, чтобы требовать привязку Gateway к loopback-интерфейсу.
gateway.exposure.allowTailscaleFunnel Режим публикации Gateway через Tailscale Serve/Funnel Установить значение false, чтобы запретить публикацию через Tailscale Funnel.
gateway.auth.requireAuth gateway.auth.mode Установить значение true, чтобы отклонять отключенную аутентификацию Gateway.
gateway.auth.requireExplicitRateLimit gateway.auth.rateLimit Установить значение true, чтобы требовать явную конфигурацию ограничения частоты попыток аутентификации.
gateway.controlUi.allowInsecure Небезопасные переключатели аутентификации, устройства и источника в Control UI Установить значение false, чтобы запретить небезопасные переключатели публикации Control UI.
gateway.remote.allow Режим и конфигурация удаленного Gateway Установить значение false, чтобы запретить режим удаленного Gateway.
gateway.http.denyEndpoints Конечные точки HTTP API Gateway Запрещать идентификаторы конечных точек, такие как chatCompletions или responses.
gateway.http.requireUrlAllowlists Входные данные Gateway для получения URL по HTTP Установить значение true, чтобы требовать списки разрешенных URL для входных данных получения URL.
gateway.nodes.denyCommands gateway.nodes.denyCommands Требовать явного запрета точных идентификаторов команд Node, таких как system.run, в конфигурации OpenClaw.

gateway.nodes.denyCommands — точное, чувствительное к регистру правило, требующее, чтобы множество запретов было надмножеством. Используйте его, когда политика должна доказывать, что привилегированные команды Node явно запрещены конфигурацией OpenClaw. Если развертывание намеренно разрешает привилегированную команду Node, после проверки следует обновить policy.jsonc, а не полагаться только на gateway.nodes.allowCommands.

Рабочая область агента

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

Режим песочницы

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

Политика рассматривает отсутствующее значение sandbox.mode как его неявное значение по умолчанию off, поэтому sandbox.requireMode сообщает, что новая или ненастроенная песочница не входит в список разрешенных значений, такой как ["all"].

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

Поле политики Наблюдаемое состояние Когда использовать
dataHandling.sensitiveLogging.requireRedaction logging.redactSensitive Установить значение true, чтобы отклонять logging.redactSensitive: "off".
dataHandling.telemetry.denyContentCapture diagnostics.otel.captureContent Установить значение true, чтобы отклонять сбор содержимого телеметрии.
dataHandling.retention.requireSessionMaintenance session.maintenance.mode Установить значение true, чтобы требовать действующий режим обслуживания сеанса enforce.
dataHandling.memory.denySessionTranscriptIndexing memory.qmd.sessions.enabled и agents.*.memorySearch.experimental.sessionMemory Установить значение true, чтобы отклонять индексирование стенограмм сеансов в памяти.

Секреты

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

Подтверждения выполнения

Проверки подтверждений выполнения считывают артефакт среды выполнения exec-approvals.json: по умолчанию ~/.openclaw/exec-approvals.json или $OPENCLAW_STATE_DIR/exec-approvals.json, когда задано значение OPENCLAW_STATE_DIR. Правила режима в execApprovals.defaults.* или execApprovals.agents.* требуют доступных для чтения данных артефакта; отсутствующий или недействительный артефакт считается ненаблюдаемым доказательством, а не условно успешной проверкой. Если артефакт доступен для чтения, для пропущенных полей применяются значения среды выполнения по умолчанию: отсутствующее значение defaults.security считается равным full, а при отсутствии настроек безопасности агента наследуется это значение по умолчанию. Доказательства включают defaults, agents.*, agents.*.allowlist[].pattern, необязательное значение argPattern, действующий режим autoAllowSkills и источник записи, но никогда не включают путь к сокету или токен, commandText, lastUsedCommand, разрешенные пути или временные метки.

Поле политики Наблюдаемое состояние Когда использовать
execApprovals.requireFile Активный путь среды выполнения exec-approvals.json Установить значение true, чтобы требовать наличия и успешного разбора артефакта подтверждений.
execApprovals.defaults.allowSecurity defaults.security, по умолчанию full Разрешать только утвержденные режимы безопасности подтверждений по умолчанию.
execApprovals.agents.allowSecurity agents.*.security, с наследованием значений по умолчанию Разрешать только утвержденные действующие режимы безопасности подтверждений для каждого агента.
execApprovals.agents.allowAutoAllowSkills defaults.autoAllowSkills и agents.*.autoAllowSkills, с наследованием значений среды выполнения по умолчанию Установить значение false, чтобы требовать строгие ручные списки разрешений без неявного подтверждения CLI навыков.
execApprovals.agents.allowlist.expected Совокупный шаблон agents.*.allowlist[] и необязательные записи argPattern Требовать, чтобы список разрешений подтверждений соответствовал проверенному набору шаблонов.

Пример: требовать артефакт подтверждений, запрещать разрешительные значения по умолчанию и допускать только проверенный режим подтверждения выполнения для выбранных агентов.

jsonc
{  "execApprovals": {    "requireFile": true,    "defaults": {      // Режимы безопасности: "deny", "allowlist" или "full".      // Это значение по умолчанию допускает только строго ограниченный запрещающий режим.      "allowSecurity": ["deny"],    },  },  "scopes": {    "restricted-shell": {      "agentIds": ["family-agent", "groups-agent"],      "execApprovals": {        "agents": {          // Выбранные агенты могут использовать проверенный режим списка разрешений, но не "full".          "allowSecurity": ["allowlist"],          // false означает, что CLI навыков должны присутствовать в проверенном списке разрешений, а не          // неявно подтверждаться параметром autoAllowSkills.          "allowAutoAllowSkills": false,          "allowlist": {            "expected": [              // Простая запись: точный проверенный шаблон исполняемого файла без argPattern.              "travel-hub",              // Ограниченная запись: шаблон и проверенное регулярное выражение аргументов.              { "pattern": "calendar-cli", "argPattern": "^sync\\b" },              "/bin/date",            ],          },        },      },    },  },}

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

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

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

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

Режим инструментов

Поле политики Наблюдаемое состояние Когда использовать
tools.profiles.allow tools.profile и agents.list[].tools.profile Разрешать только идентификаторы профилей инструментов, такие как minimal, messaging или coding.
tools.fs.requireWorkspaceOnly tools.fs.workspaceOnly и переопределения tools.fs для отдельных агентов Установить значение true, чтобы требовать ограничения инструментов файловой системы только рабочей областью.
tools.exec.allowSecurity tools.exec.security и безопасность выполнения для отдельных агентов Разрешать только режимы безопасности выполнения, такие как deny или allowlist.
tools.exec.requireAsk tools.exec.ask и режим запроса выполнения для отдельных агентов Требовать режим подтверждения, такой как always.
tools.exec.allowHosts tools.exec.host и маршрутизация хоста выполнения для отдельных агентов Разрешать только режимы маршрутизации хоста выполнения, такие как sandbox.
tools.elevated.allow tools.elevated.enabled и режим повышенных привилегий для отдельных агентов Установить значение false, чтобы требовать сохранения отключённого режима инструментов с повышенными привилегиями.
tools.alsoAllow.expected tools.alsoAllow и tools.alsoAllow для отдельных агентов Требовать точного соответствия записям alsoAllow и сообщать об отсутствующих или неожиданных дополнительных разрешениях инструментов.
tools.denyTools tools.deny и agents.list[].tools.deny Требовать, чтобы настроенные списки запрета инструментов включали идентификаторы или группы инструментов, такие как group:runtime и group:fs.

Запуск проверок

Во время разработки запускайте только проверки политик:

bash
openclaw policy checkopenclaw policy check --jsonopenclaw policy check --severity-min error

policy check запускает только набор проверок политик и выводит свидетельства, результаты и хеши аттестации. Те же результаты также отображаются в openclaw doctor --lint, когда включён плагин Policy.

Сравните файл политики оператора с подготовленной базовой политикой:

bash
openclaw policy compare --baseline official.policy.jsoncopenclaw policy compare --baseline official.policy.jsonc --policy policy.jsonc --json

policy compare проверяет синтаксис файла политики относительно синтаксиса файла политики; эта команда не проверяет состояние среды выполнения, свидетельства, учётные данные или секреты. Она использует те же метаданные правил, которые регулируют наложения с областями действия: списки разрешений должны оставаться такими же или становиться уже, списки запретов — такими же или шире, обязательные логические значения должны сохранять своё значение, упорядоченные строки могут перемещаться только к более строгому концу заданного порядка, а точные списки должны совпадать. В качестве базовой политики можно использовать политику, подготовленную организацией; проверяемая политика может добавлять более строгие значения или дополнительные правила. Проверяемое правило верхнего уровня может удовлетворять базовому правилу с областью действия, если оно является таким же или более строгим. Имена областей действия в файлах могут не совпадать; сравнение выполняется по селектору (agentIds/channelIds) и полю.

Успешное сравнение (--json):

json
{  "ok": true,  "baselinePath": "official.policy.jsonc",  "policyPath": "policy.jsonc",  "rulesChecked": 3,  "findings": []}

Успешный вывод policy check --json содержит стабильные хеши, которые оператор или система надзора может сохранить:

json
{  "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.

jsonc
{  "plugins": {    "entries": {      "policy": {        "enabled": true,        "config": {          "enabled": true,          "path": "policy.jsonc",          "workspaceRepairs": false,          "expectedHash": "sha256:...",          "expectedAttestationHash": "sha256:...",        },      },    },  },}
Параметр Назначение
enabled Включить проверки политик ещё до появления policy.jsonc.
workspaceRepairs Разрешить doctor --fix изменять управляемые политикой параметры рабочей области.
expectedHash Необязательная фиксация хеша утверждённого артефакта политики.
expectedAttestationHash Необязательная фиксация хеша последней принятой успешной проверки политики.
path Расположение артефакта политики относительно рабочей области.

Установите для plugins.entries.policy.config.enabled значение false, чтобы отключить проверки политик для рабочей области, оставив плагин установленным.

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

Пример вывода JSON:

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.6-sol",        "provider": "openai",        "model": "gpt-5.6-sol",        "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": []}

attestation.policy.hash идентифицирует подготовленный артефакт правил. evidence фиксирует наблюдаемое состояние OpenClaw, использованное при проверках, а workspace.hash идентифицирует этот набор свидетельств. findingsHash идентифицирует точный набор результатов. checkedAt фиксирует время выполнения проверки. attestationHash идентифицирует стабильное утверждение (хеш политики, хеш свидетельств, хеш результатов и состояние успешности) и намеренно исключает 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:

bash
openclaw policy watch --json

Используйте --once в CI или сценариях, которым требуется однократная оценка отклонений. Без --once по умолчанию опрос выполняется каждые две секунды; используйте --interval-ms, чтобы изменить интервал.

Результаты проверок

Идентификатор проверки Обнаруженная проблема
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-unapproved session.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.
policy/gateway-tailscale-funnel Доступ через Tailscale Funnel для Gateway включён, хотя политика запрещает его.
policy/gateway-remote-enabled Удалённый режим Gateway активен, хотя политика запрещает его.
policy/gateway-http-endpoint-enabled Конечная точка HTTP API Gateway включена, хотя запрещена политикой.
policy/gateway-http-url-fetch-unrestricted Для входных URL-адресов, загружаемых через HTTP Gateway, отсутствует обязательный список разрешённых URL.
policy/gateway-node-command-denied Команда узла, запрещённая политикой, не запрещена конфигурацией OpenClaw.
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 Режим безопасности выполнения отсутствует в списке разрешённых политикой.
policy/tools-exec-ask-unapproved Режим запроса подтверждения выполнения отсутствует в списке разрешённых политикой.
policy/tools-exec-host-unapproved Маршрутизация выполнения на хост отсутствует в списке разрешённых политикой.
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-provider 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 Настроенный артефакт подтверждений выполнения невозможно разобрать.
policy/exec-approvals-default-security-unapproved Настройки подтверждений выполнения по умолчанию используют режим безопасности, отсутствующий в списке разрешённых политикой.
policy/exec-approvals-agent-security-unapproved Фактический режим безопасности подтверждений выполнения для отдельного агента отсутствует в списке разрешённых.
policy/exec-approvals-auto-allow-skills-enabled Агент подтверждений выполнения неявно автоматически разрешает CLI навыков, хотя политика запрещает это.
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 (созданное правило, из-за которого это считается проблемой). Сейчас оба значения являются строками адресов oc://, однако имена полей описывают роль в политике, а не формат адреса.

Примеры обнаруженных проблем:

json
{  "checkId": "policy/channels-denied-provider",  "severity": "error",  "message": "Канал 'telegram' использует запрещённого поставщика 'telegram'.",  "source": "policy",  "path": "конфигурация openclaw",  "ocPath": "oc://openclaw.config/channels/telegram",  "target": "oc://openclaw.config/channels/telegram",  "requirement": "oc://policy.jsonc/channels/denyRules/#0",  "fixHint": "Telegram не разрешён для этой рабочей области."}
json
{  "checkId": "policy/tools-missing-risk-level",  "severity": "error",  "message": "Для инструмента 'deploy' в TOOLS.md не указана явная классификация риска.",  "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"}
json
{  "checkId": "policy/mcp-unapproved-server",  "severity": "error",  "message": "Сервер MCP 'remote' отсутствует в списке разрешённых политикой.",  "source": "policy",  "path": "конфигурация openclaw",  "ocPath": "oc://openclaw.config/mcp/servers/remote",  "target": "oc://openclaw.config/mcp/servers/remote",  "requirement": "oc://policy.jsonc/mcp/servers/allow"}
json
{  "checkId": "policy/models-unapproved-provider",  "severity": "error",  "message": "Ссылка на модель 'anthropic/claude-sonnet-4.7' использует неразрешённого поставщика 'anthropic'.",  "source": "policy",  "path": "конфигурация openclaw",  "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"}
json
{  "checkId": "policy/network-private-access-enabled",  "severity": "error",  "message": "Сетевая настройка 'browser-private-network' разрешает доступ к частной сети.",  "source": "policy",  "path": "конфигурация openclaw",  "ocPath": "oc://openclaw.config/browser/ssrfPolicy/dangerouslyAllowPrivateNetwork",  "target": "oc://openclaw.config/browser/ssrfPolicy/dangerouslyAllowPrivateNetwork",  "requirement": "oc://policy.jsonc/network/privateNetwork/allow"}
json
{  "checkId": "policy/gateway-non-loopback-bind",  "severity": "error",  "message": "Настройка привязки Gateway 'gateway-bind' допускает доступ не только через loopback-интерфейс.",  "source": "policy",  "path": "конфигурация openclaw",  "ocPath": "oc://openclaw.config/gateway/bind",  "target": "oc://openclaw.config/gateway/bind",  "requirement": "oc://policy.jsonc/gateway/exposure/allowNonLoopbackBind"}
json
{  "checkId": "policy/gateway-node-command-denied",  "severity": "error",  "message": "Команда узла Gateway 'system.run' запрещена политикой, но не запрещена конфигурацией OpenClaw.",  "source": "policy",  "path": "конфигурация openclaw",  "ocPath": "oc://openclaw.config/gateway/nodes/denyCommands",  "target": "oc://openclaw.config/gateway/nodes/denyCommands",  "requirement": "oc://policy.jsonc/gateway/nodes/denyCommands",  "fixHint": "Добавьте 'system.run' в gateway.nodes.denyCommands или обновите политику после проверки."}
json
{  "checkId": "policy/agents-workspace-access-denied",  "severity": "error",  "message": "Значение 'rw' параметра sandbox workspaceAccess в agents.defaults не разрешено политикой.",  "source": "policy",  "path": "конфигурация openclaw",  "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 явно включён; в противном случае проверки сообщают, что они исправили бы, и оставляют настройки без изменений.

В этой версии исправление может отключать каналы, запрещённые channels.denyRules, и применять перечисленные ниже автоматические сужающие исправления. Включайте workspaceRepairs только после проверки файла политики, поскольку допустимое правило может изменить конфигурацию рабочей области:

  • установить tools.elevated.enabled=false, когда глобальная политика запрещает инструменты с повышенными привилегиями
  • добавить отсутствующие обязательные идентификаторы запрещённых инструментов в tools.deny или agents.list[].tools.deny, когда политика требует запретить эти инструменты
  • установить небезопасные переключатели gateway.controlUi.* в false
  • установить gateway.mode=local, когда политика запрещает удалённый режим Gateway
  • установить указанные пути gateway.http.endpoints.*.enabled в false, когда политика запрещает конечные точки HTTP API Gateway
  • установить указанные пути входящего трафика канала groupPolicy в allowlist, когда политика запрещает открытый групповой входящий трафик
  • установить указанные пути входящего трафика канала requireMention в true, когда политика требует упоминаний в группах
  • установить logging.redactSensitive=tools, когда политика требует редактирования конфиденциальных данных в журналах
  • установить diagnostics.otel.captureContent=false или diagnostics.otel.captureContent.enabled=false для настроек сбора телеметрии в форме объекта, когда политика запрещает сбор содержимого телеметрии

Исправления инструментов с повышенными привилегиями в заданной области доступны только для обнаружения. Исправления обработки данных в заданной области также пропускаются, когда результат проверки сообщает об общей конфигурации журналирования или телеметрии, поскольку изменение общей настройки затронуло бы не только цель политики в заданной области.

Исправления обязательных запретов в заданной области пропускаются, когда результат проверки сообщает об унаследованном корневом tools.deny, поскольку добавление обязательного инструмента в корневую конфигурацию затронуло бы не только цель политики в заданной области. Исправления обязательных запретов на уровне агента могут обновлять указанный путь agents.list[].tools.deny.

Исправления входящего трафика канала в заданной области пропускаются, когда результат проверки сообщает об унаследованном channels.defaults.*, поскольку изменение общего значения канала по умолчанию затронуло бы не только цель политики в заданной области. Результаты проверки списка разрешённых адресов для получения URL через HTTP в Gateway по-прежнему требуют ручного исправления, поскольку автоматическое исправление не может выбрать правильные значения списка разрешённых URL конечных точек.

Результаты проверки привязки Gateway и команд узлов по-прежнему требуют проверки. Когда policy/gateway-non-loopback-bind или policy/gateway-node-command-denied можно сопоставить с путём конфигурации, doctor --fix сообщает о предлагаемом изменении gateway.bind или gateway.nodes.denyCommands как о пропущенной предварительной рекомендации. Изменение не применяется, а результат проверки не считается исправленным, пока оператор не проверит и не обновит конфигурацию или политику.

jsonc
{  "plugins": {    "entries": {      "policy": {        "config": {          "workspaceRepairs": true,        },      },    },  },}

Коды завершения

Команда 0 1 2
policy check Нет результатов проверки, достигших порогового уровня. Один или несколько результатов проверки достигли порогового уровня. Ошибка аргумента или выполнения.
policy compare Файл политики не менее строг, чем базовый уровень. Файл политики недопустим, отсутствует или его правила слабее базовых. Ошибка аргумента или выполнения.
policy watch Результатов проверки нет, и принятый хеш актуален. Есть результаты проверки или срок действия принятой аттестации истёк. Ошибка аргумента или выполнения.

Связанные материалы

Was this useful?
On this page

On this page