发现与修复
解读策略发现、修复策略发现,以及退出码的相关说明。属于 openclaw policy 参考文档的一部分。
发现¶
| 检查 ID | 发现 |
|---|---|
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/routing-bindings-required |
策略要求配置渠道路由绑定,但未配置任何绑定。 |
policy/routing-binding-channel-unconfigured |
某个路由绑定指定了 channels.* 中不存在的渠道。 |
policy/routing-agent-mismatch |
某个已编写的路由解析到了不同的代理。 |
policy/routing-match-kind-mismatch |
某个已编写的路由以意外的绑定特异性进行匹配。 |
policy/ingress-dm-policy-unapproved |
渠道 DM 策略不在策略允许列表中。 |
policy/ingress-dm-scope-unapproved |
session.dmScope 与策略要求的 DM 隔离范围不匹配。 |
policy/ingress-open-groups-denied |
渠道群组策略为 open,而策略禁止开放式群组入站。 |
policy/ingress-group-mention-required |
策略要求提及门控时,某个渠道或群组条目却禁用了提及门控。 |
policy/gateway-non-loopback-bind |
策略禁止时,网关绑定姿态仍允许非回环地址暴露。 |
policy/gateway-auth-disabled |
策略要求身份验证时,网关身份验证却被禁用。 |
policy/gateway-rate-limit-missing |
策略要求速率限制时,网关身份验证的速率限制姿态未明确。 |
policy/gateway-control-ui-insecure |
网关控制界面的不安全暴露开关已启用。 |
policy/gateway-tailscale-funnel |
策略禁止时,仍启用了网关 Tailscale Funnel 暴露。 |
policy/gateway-remote-enabled |
策略禁止时,网关远程模式仍处于激活状态。 |
policy/gateway-http-endpoint-enabled |
某个网关 HTTP API 端点已启用,但被策略拒绝。 |
policy/gateway-http-url-fetch-unrestricted |
网关 HTTP URL 获取输入缺少必需的 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 |
Exec 安全模式不在策略允许列表中。 |
policy/tools-exec-ask-unapproved |
Exec 询问模式不在策略允许列表中。 |
policy/tools-exec-host-unapproved |
Exec 主机路由不在策略允许列表中。 |
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-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 |
策略要求 SQLite 执行审批文档,但该行缺失。 |
policy/exec-approvals-invalid |
配置的 SQLite 执行审批文档无法解析。 |
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": "Channel 'telegram' uses denied provider 'telegram'.",
"source": "policy",
"path": "openclaw config",
"ocPath": "oc://openclaw.config/channels/telegram",
"target": "oc://openclaw.config/channels/telegram",
"requirement": "oc://policy.jsonc/channels/denyRules/#0",
"fixHint": "Telegram is not approved for this workspace."
}
{
"checkId": "policy/tools-missing-risk-level",
"severity": "error",
"message": "AGENTS.md tool 'deploy' has no explicit risk classification.",
"source": "policy",
"path": "AGENTS.md",
"line": 12,
"ocPath": "oc://AGENTS.md/tools/deploy",
"target": "oc://AGENTS.md/tools/deploy",
"requirement": "oc://policy.jsonc/tools/requireMetadata"
}
{
"checkId": "policy/mcp-unapproved-server",
"severity": "error",
"message": "MCP server 'remote' is not in the policy allowlist.",
"source": "policy",
"path": "openclaw config",
"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": "Model ref 'anthropic/claude-sonnet-4.7' uses unapproved provider 'anthropic'.",
"source": "policy",
"path": "openclaw config",
"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": "Network setting 'browser-private-network' allows private-network access.",
"source": "policy",
"path": "openclaw config",
"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 bind setting 'gateway-bind' permits non-loopback exposure.",
"source": "policy",
"path": "openclaw config",
"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 node command 'system.run' is denied by policy but not denied by OpenClaw config.",
"source": "policy",
"path": "openclaw config",
"ocPath": "oc://openclaw.config/gateway/nodes/commands/deny",
"target": "oc://openclaw.config/gateway/nodes/commands/deny",
"requirement": "oc://policy.jsonc/gateway/nodes/denyCommands",
"fixHint": "Add 'system.run' to gateway.nodes.commands.deny or update policy after review."
}
{
"checkId": "policy/agents-workspace-access-denied",
"severity": "error",
"message": "agents.defaults sandbox workspaceAccess 'rw' is not allowed by policy.",
"source": "policy",
"path": "openclaw config",
"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 是只读的。
只有在显式启用 workspaceRepairs 时,doctor --fix 才会编辑由策略管理的工作区设置;否则,检查会报告它们将要修复的内容,并保持设置不变。
修复可以禁用被 channels.denyRules 拒绝的频道,并应用下面列出的自动收窄修复。只有在策略文件经过审查后才能启用 workspaceRepairs,因为一条有效的规则可能会改变工作区配置:
- 当全局策略禁止提权工具时,将
tools.elevated.enabled设为false - 当策略要求拒绝某些工具时,将缺失的必需拒绝工具 ID 添加到
tools.deny或agents.entries.*.tools.deny - 将不安全的
gateway.controlUi.*开关设为false - 当策略拒绝远程网关模式时,将
gateway.mode设为local - 当策略拒绝 Gateway HTTP API 端点时,将报告的
gateway.http.endpoints.*.enabled路径设为false - 当策略拒绝开放群组入口时,将报告的频道入口
groupPolicy路径设为allowlist - 当策略要求群组提及(mention)时,将报告的频道入口
requireMention路径设为true - 当策略拒绝遥测内容捕获时,将
diagnostics.otel.captureContent设为false;对于对象形式的遥测捕获设置,则将diagnostics.otel.captureContent.enabled设为false
作用域范围内的提权工具修复仅用于检测。当发现项报告共享遥测配置时,作用域范围内的数据处理修复同样会被跳过,因为更改共享设置会影响超出作用域策略目标的范围。
dataHandling.sensitiveLogging.requireRedaction 没有检查项,也没有修复操作。敏感日志脱敏在 OpenClaw 中是无条件执行的,因此没有任何机制可以将其报告为已禁用。该键仍然是一条受支持的策略规则:openclaw policy 会验证其形式,openclaw policy compare 仍然要求候选策略至少与基线策略对此键的规定同样严格,并且 openclaw policy check 会将运行时不变式 oc://openclaw.invariant/logging/redaction 记录在 dataHandling 证据和证明中,以证明该要求已满足。
当发现项报告继承自根配置的 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 更改报告为已跳过的预览指导。它不会应用该更改,并且在操作人员审查并更新配置或策略之前,该发现项不会被视为已修复。
退出代码¶
| 命令 | 0 |
1 |
2 |
|---|---|---|---|
policy check |
没有发现项达到阈值。 | 有一个或多个发现项达到阈值。 | 参数错误或运行时失败。 |
policy compare |
策略文件至少与基线同样严格。 | 策略文件无效、缺失或弱于基线规则。 | 参数或运行时失败。 |
policy watch |
无发现,且接受的哈希为当前值。 | 存在发现,或接受的证明已过期。 | 参数或运行时失败。 |
本页原文 Markdown:在 AtomGit 查看·内容源自开源项目 cl/openclaw