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 не должен
быть включен» или «управляемые инструменты должны содержать метаданные риска и владельца». Если
нужно только локальное поведение без подтверждения соответствия или обнаружения отклонений, достаточно обычной
конфигурации.
Быстрый старт
openclaw plugins enable policyПлагин остается включенным, даже если policy.jsonc отсутствует, чтобы doctor мог
сообщить об отсутствующем артефакте, а не молча пропустить проверки.
Создайте policy.jsonc вручную; он не генерируется из текущих настроек. Каждый
раздел верхнего уровня представляет пространство имен правил: проверка выполняется только при наличии конкретного правила
в этом разделе (неподдерживаемые разделы или ключи приводят к ошибке
policy/policy-jsonc-invalid, а не игнорируются без уведомления). Минимальный
пример, охватывающий все поддерживаемые разделы:
{ "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 проверяет
правило области по унаследованному глобальному состоянию или состоянию по умолчанию для агента среды выполнения
с указанным идентификатором, а не пропускает его.
{ "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 |
Требовать, чтобы список разрешений подтверждений соответствовал проверенному набору шаблонов. |
Пример: требовать артефакт подтверждений, запрещать разрешительные значения по умолчанию и допускать только проверенный режим подтверждения выполнения для выбранных агентов.
{ "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. |
Запуск проверок
Во время разработки запускайте только проверки политик:
openclaw policy checkopenclaw policy check --jsonopenclaw policy check --severity-min errorpolicy check запускает только набор проверок политик и выводит свидетельства, результаты
и хеши аттестации. Те же результаты также отображаются в
openclaw doctor --lint, когда включён плагин Policy.
Сравните файл политики оператора с подготовленной базовой политикой:
openclaw policy compare --baseline official.policy.jsoncopenclaw policy compare --baseline official.policy.jsonc --policy policy.jsonc --jsonpolicy compare проверяет синтаксис файла политики относительно синтаксиса файла политики; эта команда
не проверяет состояние среды выполнения, свидетельства, учётные данные или секреты. Она использует те же
метаданные правил, которые регулируют наложения с областями действия: списки разрешений должны оставаться такими же
или становиться уже, списки запретов — такими же или шире, обязательные логические значения должны сохранять
своё значение, упорядоченные строки могут перемещаться только к более строгому концу
заданного порядка, а точные списки должны совпадать. В качестве базовой политики можно использовать
политику, подготовленную организацией; проверяемая политика может добавлять более строгие значения или
дополнительные правила. Проверяемое правило верхнего уровня может удовлетворять базовому правилу с областью действия, если
оно является таким же или более строгим. Имена областей действия в файлах могут
не совпадать; сравнение выполняется по селектору (agentIds/channelIds) и полю.
Успешное сравнение (--json):
{ "ok": true, "baselinePath": "official.policy.jsonc", "policyPath": "policy.jsonc", "rulesChecked": 3, "findings": []}Успешный вывод policy check --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.
{ "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:
{ "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 для журналов аудита, но не является частью
стабильного хеша.
Жизненный цикл принятия состояния политики:
- Создайте или проверьте
policy.jsonc. - Запустите
openclaw policy check --json. - Если проверка успешна, запишите
attestation.policy.hashкакexpectedHash. - Запишите
attestation.attestationHashкакexpectedAttestationHash. - Повторно запустите
openclaw doctor --lintв CI или шлюзах выпуска.
Если правила политики изменяются намеренно, обновите оба принятых хеша по результатам
успешной проверки. Если изменяются только параметры рабочей области (политика остаётся прежней),
обычно изменяется только expectedAttestationHash.
Включение или обновление правил agents.workspace добавляет свидетельства agentWorkspace
в хеш рабочей области и хеш аттестации; проверьте новые свидетельства и
обновите принятые хеши аттестации после включения. Включение или обновление
правил режима инструментов таким же образом добавляет свидетельства toolPosture.
openclaw policy watch повторно запускает проверку и сообщает, когда текущие свидетельства больше
не соответствуют expectedAttestationHash:
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://, однако имена полей описывают
роль в политике, а не формат адреса.
Примеры обнаруженных проблем:
{ "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 не разрешён для этой рабочей области."}{ "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"}{ "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"}{ "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"}{ "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"}{ "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"}{ "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 или обновите политику после проверки."}{ "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 как о пропущенной предварительной
рекомендации. Изменение не применяется, а результат проверки не считается
исправленным, пока оператор не проверит и не обновит конфигурацию или политику.
{ "plugins": { "entries": { "policy": { "config": { "workspaceRepairs": true, }, }, }, },}Коды завершения
| Команда | 0 |
1 |
2 |
|---|---|---|---|
policy check |
Нет результатов проверки, достигших порогового уровня. | Один или несколько результатов проверки достигли порогового уровня. | Ошибка аргумента или выполнения. |
policy compare |
Файл политики не менее строг, чем базовый уровень. | Файл политики недопустим, отсутствует или его правила слабее базовых. | Ошибка аргумента или выполнения. |
policy watch |
Результатов проверки нет, и принятый хеш актуален. | Есть результаты проверки или срок действия принятой аттестации истёк. | Ошибка аргумента или выполнения. |