openclaw policy
openclaw policy 由内置的 Policy 插件提供。它是基于现有 OpenClaw 设置的企业级合规层,而不是第二套配置系统。你在 policy.jsonc 中编写要求;OpenClaw 将活动工作区作为证据进行观测;Policy 通过 doctor --lint 报告偏差。Policy 不会在请求时强制执行工具调用或改写运行时行为,也不会证明 auth-profiles.json 等各智能体凭据存储的合规性。
Policy 检查已配置的渠道、MCP 服务器、模型提供商、网络 SSRF 防护态势、入口/渠道访问、Gateway 网关暴露情况和节点命令态势、编写的消息路由探针、Agent 工作区访问、沙箱态势、数据处理态势、机密信息提供商/身份验证配置文件态势,以及受治理的工具元数据(TOOLS.md)。当工作区需要“不得启用 Telegram”或“受治理的工具必须声明风险和所有者元数据”这类持久且可检查的声明时,请使用它。如果只需要本地行为,而不需要合规证明或偏差检测,普通配置就足够了。
快速开始
policy.jsonc,该插件也会保持启用,因此 Doctor 可以报告缺失的工件,而不是静默跳过检查。
请手动编写 policy.jsonc;它不会根据当前设置生成。每个顶层部分都是一个规则命名空间:只有其下存在具体规则时,检查才会运行(不支持的部分或键会以 policy/policy-jsonc-invalid 失败,而不是被静默忽略)。以下是覆盖所有受支持部分的最小示例:
- 在禁止非 local 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(shell/进程)可满足等效态势。- 仅当存在
execApprovals规则时,Exec 审批检查才会读取实时的exec-approvals.json工件;缺失或无效的工件属于无法观测的证据,不会被视为人为构造的通过结果。 - 机密信息和身份验证配置文件证据仅记录提供商/来源态势及 SecretRef 元数据,绝不记录原始值。Policy 不会读取或证明
auth-profiles.json等各智能体凭据存储的合规性。 - 数据处理证据仅反映配置层面的态势(脱敏模式、遥测捕获开关、会话维护模式、转录文本索引设置)。它不会检查日志、遥测导出、转录文本或记忆文件;即使结果无异常,也不能证明其中不存在个人数据或机密信息。
- 路由探针复用 OpenClaw 的运行时绑定解析器。路由证据仅记录探针 ID、解析得到的智能体、匹配类型及已脱敏的绑定元数据。它绝不会记录对等方、账户、服务器、团队或角色标识符。添加路由部分会有意改变策略和证明哈希;不含路由的策略会保留其现有证据结构。
Policy 规则参考
以下每条规则均为可选;只有规则存在时,检查才会运行。观测到的状态来自现有 OpenClaw 配置或工作区元数据。作用域覆盖层
当特定智能体或渠道需要比顶层基准更严格的策略时,请使用scopes.<scopeName>。作用域名称只是标签;匹配使用作用域内的选择器。覆盖层是累加式的:全局规则仍会运行,而作用域规则可以针对同一证据添加自己的发现项。
如果
agentIds 条目不在 agents.entries.* 中,OpenClaw 会依据该运行时智能体 ID 继承的全局/默认态势评估作用域规则,而不会跳过它。
sandbox.containers.*)仅针对匹配智能体的沙箱后端能够提供的证据进行检查。如果后端无法观测你为其启用的规则,Policy 会报告 policy/sandbox-container-posture-unobservable,而不是判定通过;请将容器规则的作用域限定为使用能够提供相应证据的后端的智能体组。
顶层 ingress.session.requireDmScope 保持全局有效;session.dmScope 不是可归因于渠道的证据,因此无法通过 channelIds 限定作用域。
policy.jsonc 中存在的每个作用域都必须有效且可执行。
渠道
MCP 服务器
模型提供商
网络
消息路由
探测 ID 必须唯一。路由支持
channel、可选的 accountId、
peer、parentPeer、guildId、teamId 和 memberRoleIds。对等方类型包括
direct、group 和 channel。matchedBy 可包含一个或多个运行时
匹配类型,包括 binding.peer、binding.account、binding.channel
或 default。
路由检查仅用于合规性检查。它们不会更改启动、
消息传递、绑定优先级或回退行为。发现项需要
操作员审核,因为自动更改绑定可能会将
私信重定向到其他位置。
入口和渠道访问
Gateway 网关
gateway.nodes.denyCommands 是一种精确且区分大小写的策略拒绝超集规则。
当策略必须证明 OpenClaw 配置显式拒绝了特权节点命令时,
使用此规则。如果部署有意允许某个特权
节点命令,应在审核后更新 policy.jsonc,而不是仅依赖
gateway.nodes.commands.allow。
Agent 工作区
沙箱安全态势
策略将缺失的
sandbox.mode 视为其隐式默认值 off,因此
sandbox.requireMode 会将全新或未配置的沙箱报告为不在
["all"] 等允许列表中。
数据处理
机密信息
Exec 审批
Exec 审批检查会读取运行时exec-approvals.json 工件:
默认为 ~/.openclaw/exec-approvals.json,设置 OPENCLAW_STATE_DIR 时则为
$OPENCLAW_STATE_DIR/exec-approvals.json。
execApprovals.defaults.* 或 execApprovals.agents.* 下的安全态势规则
要求提供可读的工件证据;缺失或无效的工件会报告为
无法观测的证据,而不是尽力而为地判定通过。工件可读后,省略的
字段将继承运行时默认值:缺失的 defaults.security 为 full,并且
缺失的智能体安全配置会继承该默认值。证据包括 defaults、
agents.*、agents.*.allowlist[].pattern、可选的 argPattern、有效的
autoAllowSkills 安全态势和条目来源,但绝不包括套接字路径/令牌、
commandText、lastUsedCommand、已解析路径或时间戳。
示例:要求审批工件存在、拒绝宽松的默认值,并且仅允许
所选智能体使用经过审查的 Exec 审批安全策略。
身份验证配置文件
工具元数据
工具安全策略
运行检查
编写期间运行仅策略检查: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,
因此,相同的策略状态始终会生成相同的证明哈希。这四个值共同
构成一次策略检查的审计元组。
如果 Gateway 网关或监督程序使用策略来阻止、批准运行时操作或为其添加注释,
它应记录上一次干净检查的证明哈希。checkedAt 会保留在 JSON
输出中供审计日志使用,但不属于稳定哈希的一部分。
接受策略状态的生命周期:
- 编写或审查
policy.jsonc。 - 运行
openclaw policy check --json。 - 如果检查干净,将
attestation.policy.hash记录为expectedHash。 - 将
attestation.attestationHash记录为expectedAttestationHash。 - 在 CI 或发布门禁中重新运行
openclaw doctor --lint。
expectedAttestationHash 会发生变化。
启用或升级 agents.workspace 规则会将 agentWorkspace 证据
添加到工作区哈希和证明哈希中;启用后,请审查新证据并
刷新已接受的证明哈希。启用或升级工具安全态势规则时,也会以相同方式
添加 toolPosture 证据。
openclaw policy watch 会重新运行检查,并在当前证据不再
匹配 expectedAttestationHash 时报告:
--once。如果未指定
--once,默认每两秒轮询一次;使用 --interval-ms 可更改
轮询间隔。
发现
一个发现可以同时包含
target(观测到的不符合要求的工作区对象)
和 requirement(使其成为发现的已编写规则)。
目前两者都是 oc:// 地址字符串,但字段名称描述的是策略角色,
而不是地址格式。
发现示例:
修复
doctor --lint 和 policy check 为只读。
仅当明确启用
workspaceRepairs 时,doctor --fix 才会编辑策略管理的工作区设置;否则,检查会报告其
将修复的内容,并保持设置不变。
在此版本中,修复功能可以禁用被 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 - 当策略要求对敏感日志进行脱敏时,设置
logging.redactSensitive=tools - 当策略拒绝遥测内容采集时,设置
diagnostics.otel.captureContent=false,或针对对象形式的遥测 采集设置设置diagnostics.otel.captureContent.enabled=false
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 更改报告为已跳过的预览
指导。它不会应用更改,并且在操作员审查并更新配置或策略之前,
该发现项不会计为已修复。