Skip to main content

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 设为 allnon-main,并将 workspaceAccess 设为 nonero。缺失或为 off 的沙箱模式不满足只读策略。
  • agents.workspace.denyTools 接受 execprocesswriteeditapply_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、可选的 accountIdpeerparentPeerguildIdteamIdmemberRoleIds。Peer 类型为 directgroupchannelmatchedBy 可以包含一个或多个运行时匹配类型,包括 binding.peerbinding.accountbinding.channeldefault 路由检查仅用于一致性验证。它们不会改变启动、消息投递、绑定优先级或回退行为。发现项需要操作员审查,因为自动更改绑定可能会重定向私信。

入口和通道访问

网关

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.securityfull,缺失的代理 security 也会继承该默认值。证据包括 defaultsagents.*agents.*.allowlist[].pattern、可选的 argPattern、有效的 autoAllowSkills 姿态以及条目来源——绝不包括 socket 路径/token、commandTextlastUsedCommand、解析后的路径或时间戳。 示例:要求 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 输出中用于审计日志,但不属于稳定哈希的一部分。 接受策略状态的生命周期:
  1. 编写或审阅 policy.jsonc
  2. 运行 openclaw policy check --json
  3. 如果结果干净,记录 attestation.policy.hash 作为 expectedHash
  4. 记录 attestation.attestationHash 作为 expectedAttestationHash
  5. 在 CI 或发布门禁中重新运行 openclaw doctor --lint
如果策略规则有意更改,请从一次干净检查中更新这两个已接受哈希。如果只是工作区设置变更(策略保持不变),通常只有 expectedAttestationHash 会变化。 启用或升级 agents.workspace 规则会将 agentWorkspace 证据添加到工作区哈希和 attestation hash 中;启用后请审查新的证据并刷新已接受的 attestation hashes。启用或升级工具姿态规则会以相同方式添加 toolPosture 证据。 openclaw policy watch 会重新运行检查,并在当前证据不再匹配 expectedAttestationHash 时进行报告:
在需要单次漂移评估的 CI 或脚本中使用 --once。如果不使用 --once,默认每两秒轮询一次;可使用 --interval-ms 更改轮询间隔。

发现项

一个发现项可以同时包含 target(被观察到的不符合要求的工作区对象)和 requirement(使其成为发现项的所编写规则)。 它们目前都是 oc:// 地址字符串,但字段名描述的是策略角色,而不是地址格式。 发现示例:

修复

doctor --lintpolicy check 为只读操作。 doctor --fix 仅在 workspaceRepairs 明确启用时,才会编辑受策略管理的工作区设置;否则,检查会报告它们将会修复的内容,并保持设置不变。 在此版本中,修复可以禁用 channels.denyRules 拒绝的通道,并应用下面列出的自动收窄修复。只有在策略文件已审查后才启用 workspaceRepairs,因为有效规则可能会更改工作区配置:
  • 当全局策略禁止提升权限工具时,将 tools.elevated.enabled=false
  • 当策略要求拒绝这些工具时,将缺失的必需拒绝工具 ID 添加到 tools.denyagents.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-bindpolicy/gateway-node-command-denied 可以映射到某个配置路径时,doctor --fix 会将建议的 gateway.bindgateway.nodes.commands.deny 更改作为跳过的预览指导进行报告。它不会应用该更改,并且在操作员审查并更新配置或策略之前,该发现不算已修复。

退出代码

相关