openclaw policy
openclaw policy 由捆绑的 Policy 插件提供。它是现有 OpenClaw 设置之上的企业一致性层,而不是第二套配置系统。你在 policy.jsonc 中编写要求;OpenClaw 观察活动工作区作为证据;策略通过 doctor --lint 报告偏差。Policy 不会在请求时强制执行工具调用或重写运行时行为,也不会为诸如 auth-profiles.json 之类的每个代理凭据存储提供证明。
策略检查已配置的通道、MCP 服务器、模型提供方、网络 SSRF
防护态势、入口/通道访问、Gateway 暴露和节点命令态势、
作者消息路由探针、
代理工作区访问、沙箱态势、数据处理态势、密钥
提供方/auth profile 态势,以及受治理的工具元数据(AGENTS.md 中的 ## Tools 部分)。当工作区需要一份持久、可检查的声明时使用它,例如“Telegram 不得
启用”或“受治理的工具必须声明风险和所有者元数据”。如果你
只需要没有证明或漂移检测的本地行为,普通配置就足够了。
另外,[openclaw agent exec](/cli/agent#agent-exec)会为每次运行应用一个隔离的
隐式策略配置:代理沙箱关闭,Gateway 主机执行完全允许,并且文件系统工具仅限于 --cwd。
快速开始
policy.jsonc 缺失,插件也会保持启用状态,因此 doctor 可以报告缺失的工件,而不是静默跳过检查。
请手动编写 policy.jsonc;它不会根据当前设置自动生成。每个顶级 section 都是一个规则命名空间:只有在其中存在具体规则时,检查才会运行(不支持的 section 或键会以 policy/policy-jsonc-invalid 失败,而不是被静默忽略)。覆盖所有受支持 section 的最小示例如下:
validate=false
- 如果在禁止非回环绑定时省略
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(shell/进程)可满足等效的安全姿态。- 当存在
execApprovals规则时,exec-approvals 检查只读取实时 SQLite approvals 文档;缺失或无效的工件属于不可观测证据,而不是人为构造的通过结果。 - secrets 和 auth-profile 证据仅记录 provider/source 姿态以及 SecretRef 元数据,绝不记录原始值。Policy 不会读取或证明按代理分开的凭据存储,例如
auth-profiles.json。 - data-handling 证据是配置级别的姿态(telemetry 捕获开关、session maintenance 模式、transcript-indexing 设置)以及始终开启的日志脱敏不变量。它不会检查日志、telemetry 导出、转录内容或 memory 文件,而干净的结果也不能证明其中不存在个人数据或密钥。
- routing probes 会复用 OpenClaw 的运行时 binding resolver。Routing 证据仅记录 probe id、解析出的代理、匹配类型以及经过脱敏的 binding 元数据。它绝不会记录 peer、account、guild、team 或 role 标识符。添加 routing section 会有意改变 policy 和 attestation 哈希;不包含 routing 的 policies 会保留其现有的证据形态。
策略规则参考
下面的每条规则都是可选的;只有当规则存在时才会运行检查。已观察到的状态是现有的 OpenClaw 配置或工作区元数据。作用域覆盖
当特定代理或通道需要比顶层基线更严格的策略时,请使用scopes.<scopeName>。作用域名称只是一个标签;匹配使用作用域内的选择器。覆盖是叠加式的:全局规则仍会运行,而作用域规则可以基于相同证据添加自己的发现。
sandbox.containers.*)仅根据匹配代理的 sandbox 后端能够暴露的证据进行检查。Docker 和 Podman 后端会暴露相同的 sandbox.docker.* 容器姿态设置。如果某个后端无法观察到为其启用的规则,策略会报告 policy/sandbox-container-posture-unobservable,而不是判定通过;应将容器规则限定在使用能够暴露这些规则的后端的代理组中。
后端授权使用已配置的身份。后端为 "docker" 要求 allowBackends: ["docker"],而后端为 "podman" 要求 allowBackends: ["podman"]。
顶层的 ingress.session.requireDmScope 保持全局生效;session.dmScope 不是可归属于通道的证据,因此不能通过 channelIds 设置作用域。
policy.jsonc 中出现的每个 scope 都必须有效且可执行。
通道
MCP 服务器
模型提供方
网络
消息路由
探测 id 必须唯一。路由支持
channel、可选的 accountId、peer、parentPeer、guildId、teamId 和 memberRoleIds。Peer 类型为 direct、group 和 channel。matchedBy 可以包含一个或多个运行时匹配类型,包括 binding.peer、binding.account、binding.channel 或 default。
路由检查仅用于一致性验证。它们不会改变启动、消息投递、绑定优先级或回退行为。发现项需要操作员审查,因为自动更改绑定可能会重定向私信。
入口和通道访问
网关
gateway.nodes.denyCommands 是一个精确、区分大小写的策略拒绝超集规则。
当 policy 必须证明特权节点命令已被 OpenClaw 配置明确拒绝时,请使用它。
对于故意允许某个特权节点命令的部署,应在审查后更新 policy.jsonc,而不是仅依赖 gateway.nodes.commands.allow。
代理工作区
Sandbox 姿态
策略将缺失的
sandbox.mode 视为其隐含默认值 off,因此 sandbox.requireMode 会将新建或未配置的 sandbox 视为不在诸如 ["all"] 之类的允许列表中。
数据处理
密钥
Exec 审批
Exec 审批检查默认读取运行时exec_approvals_config 单例行,位置在 ~/.openclaw/state/openclaw.sqlite;当设置了 OPENCLAW_STATE_DIR 时,则读取 $OPENCLAW_STATE_DIR/state 下的同一数据库。发现项会保留稳定的 oc://exec-approvals.json/... URI 方案;现在它表示该行中存储的权威 JSON 文档内的路径。
execApprovals.defaults.* 或 execApprovals.agents.* 下的姿态规则需要可读的工件证据;缺失或无效的工件会被报告为不可观察证据,而不是尽力通过。一旦可读,省略字段会继承运行时默认值:缺失的 defaults.security 为 full,缺失的代理 security 也会继承该默认值。证据包括 defaults、agents.*、agents.*.allowlist[].pattern、可选的 argPattern、有效的 autoAllowSkills 姿态以及条目来源——绝不包括 socket 路径/token、commandText、lastUsedCommand、解析后的路径或时间戳。
示例:要求 approvals 工件、拒绝宽松默认值,并仅允许为选定代理审查过的 exec approval 姿态。
身份验证配置
工具元数据
工具姿态
运行检查
在编写期间运行仅策略检查:policy check 仅运行策略检查集,并输出证据、发现项,
以及证明哈希。当启用 Policy 插件时,相同的发现项也会出现在
openclaw doctor --lint 中。
将运算符策略文件与已编写的基线进行比较:
policy compare 会根据策略文件语法检查策略文件语法;它不会检查运行时状态、证据、凭据或机密信息。它使用与作用域覆盖相同的规则元数据:允许列表必须保持相等或更窄,拒绝列表必须保持相等或更宽,必需布尔值必须保持其值,排序字符串只能朝着配置顺序中更严格的一端移动,而精确列表必须匹配。基线可以是组织编写的策略;被检查的策略可以添加更严格的值或额外规则。当它同样或更具限制性时,顶层被检查规则可以满足作用域基线规则。作用域名称在文件之间不需要匹配;比较以选择器(agentIds/channelIds)和字段为键。对于路由探针,每个基线探针 id 必须保持相同的路由和期望代理。被检查的策略可以添加探针或收紧 matchedBy,但删除探针、改变其路由或代理,或放宽其可接受的匹配类型,都会更弱。
干净的比较(--json):
policy check --json 输出包含运算符或
监督者可记录的稳定哈希:
配置策略
策略配置位于plugins.entries.policy.config。
将
plugins.entries.policy.config.enabled 设置为 false,即可在保留插件安装的同时,为某个工作区禁用策略检查。
接受策略状态
示例 JSON 输出:attestation.policy.hash 标识已编写的规则工件。evidence
记录检查所使用的已观测 OpenClaw 状态,而
workspace.hash 标识该证据负载。findingsHash 标识
精确的发现集合。checkedAt 记录检查运行时间。
attestationHash 标识稳定声明(策略哈希、证据哈希、
发现哈希以及干净/脏状态),并刻意排除 checkedAt,
因此相同的策略状态总会生成相同的 attestation hash。这四个值一起构成一次策略检查的审计元组。
如果网关或监督器使用策略来阻止、批准或标注运行时操作,
它应记录最近一次干净检查中的 attestation hash。checkedAt
会保留在 JSON 输出中用于审计日志,但不属于稳定哈希的一部分。
接受策略状态的生命周期:
- 编写或审阅
policy.jsonc。 - 运行
openclaw policy check --json。 - 如果结果干净,记录
attestation.policy.hash作为expectedHash。 - 记录
attestation.attestationHash作为expectedAttestationHash。 - 在 CI 或发布门禁中重新运行
openclaw doctor --lint。
expectedAttestationHash 会变化。
启用或升级 agents.workspace 规则会将 agentWorkspace 证据添加到工作区哈希和 attestation hash 中;启用后请审查新的证据并刷新已接受的 attestation hashes。启用或升级工具姿态规则会以相同方式添加 toolPosture 证据。
openclaw policy watch 会重新运行检查,并在当前证据不再匹配 expectedAttestationHash 时进行报告:
--once。如果不使用 --once,默认每两秒轮询一次;可使用 --interval-ms 更改轮询间隔。
发现项
一个发现项可以同时包含
target(被观察到的不符合要求的工作区对象)和 requirement(使其成为发现项的所编写规则)。
它们目前都是 oc:// 地址字符串,但字段名描述的是策略角色,而不是地址格式。
发现示例:
修复
doctor --lint 和 policy check 为只读操作。
doctor --fix 仅在 workspaceRepairs 明确启用时,才会编辑受策略管理的工作区设置;否则,检查会报告它们将会修复的内容,并保持设置不变。
在此版本中,修复可以禁用 channels.denyRules 拒绝的通道,并应用下面列出的自动收窄修复。只有在策略文件已审查后才启用 workspaceRepairs,因为有效规则可能会更改工作区配置:
- 当全局策略禁止提升权限工具时,将
tools.elevated.enabled=false - 当策略要求拒绝这些工具时,将缺失的必需拒绝工具 ID 添加到
tools.deny或agents.entries.*.tools.deny - 将不安全的
gateway.controlUi.*开关设为false - 当策略禁止远程 gateway 模式时,将
gateway.mode=local - 当策略禁止 Gateway HTTP API 端点时,将报告的
gateway.http.endpoints.*.enabled路径设为false - 当策略禁止开放的组入口时,将报告的通道入口
groupPolicy路径设为allowlist - 当策略要求组提及时,将报告的通道入口
requireMention路径设为true - 当策略禁止遥测内容捕获时,将
diagnostics.otel.captureContent=false,或 对于对象形式的遥测捕获设置,将diagnostics.otel.captureContent.enabled=false
dataHandling.sensitiveLogging.requireRedaction 没有检查也没有修复。敏感日志脱敏在 OpenClaw 中是无条件启用的,因此不会有任何内容报告它已被禁用。该键仍然是受支持的策略规则:openclaw policy 会验证其结构,openclaw policy compare 仍要求候选策略至少与基线一样严格,而 openclaw policy check 会在 dataHandling 证据和证明中记录运行时不变量 oc://openclaw.invariant/logging/redaction,作为满足该要求的证明。
当发现结果报告的是继承的根级 tools.deny 时,会跳过作用域内的必需拒绝修复,因为将所需工具添加到根配置会影响超出作用域策略目标的范围。仅限代理本地的必需拒绝修复可以更新报告的 agents.entries.*.tools.deny 路径。
若发现结果报告的是继承的 channels.defaults.*,则会跳过作用域内的通道入口修复,因为更改共享通道默认值会影响超出作用域策略目标的范围。Gateway HTTP URL 允许列表的发现仍需手动处理,因为自动修复无法选择正确的端点 URL 允许列表值。
Gateway 绑定和节点命令的发现仍需人工审查。当 policy/gateway-non-loopback-bind 或 policy/gateway-node-command-denied 可以映射到某个配置路径时,doctor --fix 会将建议的 gateway.bind 或 gateway.nodes.commands.deny 更改作为跳过的预览指导进行报告。它不会应用该更改,并且在操作员审查并更新配置或策略之前,该发现不算已修复。