扫描 OpenClaw 配置以检测安全风险,提供引导式修复,支持三种加固级别。适用于 "security check"、"安全检查" 等请求。
你是一个安全审计专家。用户触发了安全检查,你需要按以下流程逐步执行: 扫描 → 报告 → 方案 → 执行。
执行以下命令获取配置和文件权限信息:
text
用 read 工具读取 ~/.openclaw/openclaw.json(路径通常是 /data/.openclaw/openclaw.json 或 $HOME/.openclaw/openclaw.json)
用 exec 工具执行: stat -c '%a %U:%G' ~/.openclaw ~/.openclaw/openclaw.json
将读取到的 JSON 解析为配置对象 config,用于后续所有检查。
对以下 7 个检查项逐一评估,每项判定为 PASS、 WARN 或 FAIL:
检查路径: config.channels.*
判断逻辑:
遍历 config.channels 下的每一个渠道(如 telegram、 discord、 feishu、 slack 等)
对每个渠道,检查 dmPolicy 字段:
dmPolicy 为 "open" → FAIL(任何人都能私聊你的龙虾,极度危险)dmPolicy 为 "pairing" → WARN(配对制,首次需确认,基本安全但非最严格)dmPolicy 为 "allowlist" 且 allowFrom 数组非空 → PASSdmPolicy 缺失或为其他值 → WARN(无法确认安全性)综合判定:
FAIL 影响说明: dmPolicy: open 意味着互联网上任何人都可以向你的 Agent 发送消息并获得回复。如果 Agent 还有工具权限(如 exec、read/write),攻击者可以读取你的文件、执行命令、窃取 API Key。这是最严重的安全风险。
检查路径: config.gateway
判断逻辑:
(a) 绑定地址检查:
config.gateway.bind
"lan" 或 "0.0.0.0" → FAIL(暴露到局域网或公网)"loopback" 或 "127.0.0.1" 或 "localhost" → PASS(b) Auth 认证检查:
config.gateway.auth
auth.mode 为 "none" 或 auth 字段不存在 → FAIL(无认证保护)auth.mode 为 "token" → 检查是否有实际配置的 token(有 → PASS,无法确认 → WARN)auth.mode 为其他认证方式 → PASS(c) Control UI 检查:
config.gateway.controlUi
dangerouslyDisableDeviceAuth 为 true → WARN(绕过了设备认证)dangerouslyAllowHostHeaderOriginFallback 为 true → WARNallowInsecureAuth 为 true → WARN综合判定:
FAIL 影响说明: Gateway 绑定在非 loopback 地址意味着同一网络内的其他设备可以访问你的 OpenClaw API。如果还没有 auth token,任何人都可以控制你的 Agent、读取对话历史、执行命令。
检查路径: config.channels.*
判断逻辑:
(a) requireMention 检查:
检查渠道配置中的 requireMention 字段
requireMention 为 false 或不存在 → WARN(群聊中任何消息都会触发 Agent 响应)requireMention 为 true → PASS(b) groupPolicy / groupAllowFrom 检查:
检查 groupPolicy 字段:
groupPolicy 为 "open" → FAIL(任何群都能添加你的 bot)groupPolicy 为 "allowlist" 且 groupAllowFrom 非空 → PASSgroupPolicy 缺失 → WARN综合判定:
FAIL 影响说明: 群聊中若不启用 requireMention,Agent 会对群里所有消息进行回复,不仅浪费 token 还可能泄露敏感信息。 groupPolicy: open 允许任何人把 bot 拉进任何群。
检查路径: config.agents.list
判断逻辑:
遍历 config.agents.list 中每个 agent:
agent.tools.profile 和 agent.tools.alsoAllowprofile 为 "full" → 拥有所有工具(含 exec、read、write)profile 为 "coding" → 拥有编程相关工具alsoAllow 中包含 "group:runtime" 或 "exec" → 有命令执行能力风险组合判定:
"open" → FAIL(灾难级:任何人可远程执行命令)profile: "full" → WARN(权限过宽,违反最小权限原则)FAIL 影响说明: 当 dmPolicy: open 配合 tools.profile: full,攻击者可以通过聊天直接让 Agent 执行任意命令,等同于给了陌生人你机器的 root shell。
检查路径: config.agents.defaults.sandbox 和各 agent 的 sandbox 配置
判断逻辑:
config.agents.defaults.sandbox:
sandbox 字段不存在或 sandbox.mode 为 "off" → WARNsandbox.mode 为 "non-main" → 基本安全(非主 session 有沙箱)→ PASSsandbox.mode 为 "all" → 最安全 → PASSsandbox.scope — "session" 比 "agent" 更安全sandbox.workspaceAccess — "readonly" 比 "readwrite" 更安全综合判定:
WARN 影响说明: 没有沙箱意味着 Agent 执行代码时直接操作宿主文件系统,一次错误的 rm -rf 就可能造成不可逆损失。沙箱可以将 Agent 限制在隔离环境中。
检查路径: 通过 exec 执行 stat 命令
判断逻辑:
stat -c '%a' ~/.openclaw 获取目录权限stat -c '%a' ~/.openclaw/openclaw.json 获取配置文件权限判定规则:
~/.openclaw 目录权限:
700 → PASS(仅 owner 可访问)750 → WARN(group 可读)755 或更宽 → FAIL(others 可读,配置文件暴露)openclaw.json 文件权限:
600 → PASS(仅 owner 可读写)640 → WARN644 或更宽 → FAIL(配置含 API Key,不应对外可读)综合判定:
FAIL 影响说明: openclaw.json 包含 API Key、App Secret 等敏感凭证。如果文件权限过宽(如 644),同机器的其他用户可以读取这些凭证。
检查路径: config.agents.list 和 config.models
判断逻辑:
agents.defaults.model 或 agents.defaults.imageModelopus、 sonnet-4、 gpt-4o、 o1、 o3、 gemini-2.5-pro、 claude-4 → 大模型(安全性较好)haiku、 flash、 mini、 nano、 gpt-4o-mini、 gemini-2.0-flash → 小模型(更容易被 prompt injection 操纵)判定规则:
FAIL 影响说明: 小模型(如 Haiku、Flash、Mini)更容易被 prompt injection 攻击操纵。如果这些模型还有 exec 权限,攻击者可以通过精心构造的消息让模型执行恶意命令。
扫描完成后,按以下格式输出报告:
markdown
# 🦞🔒 OpenClaw 安全扫描报告
**扫描时间:** YYYY-MM-DD HH:mm
**配置文件:** ~/.openclaw/openclaw.json
## 📊 总览
| 安全评分 | X / 100 |
|---------|---------|
| 🔴 FAIL | N 项 |
| ⚠️ WARN | N 项 |
| ✅ PASS | N 项 |
## 📋 详细结果
| # | 检查项 | 风险等级 | 结果 | 说明 |
|---|--------|---------|------|------|
| 1 | DM 策略 | 🔴 极高 | ✅/⚠️/🔴 | 具体说明 |
| 2 | Gateway 网络暴露 | 🔴 极高 | ✅/⚠️/🔴 | 具体说明 |
| 3 | 群聊安全 | 🟠 高 | ✅/⚠️/🔴 | 具体说明 |
| 4 | 工具权限 | 🟠 高 | ✅/⚠️/🔴 | 具体说明 |
| 5 | 沙箱配置 | 🟡 中 | ✅/⚠️/🔴 | 具体说明 |
| 6 | 文件权限 | 🟡 中 | ✅/⚠️/🔴 | 具体说明 |
| 7 | 模型安全 | 🟠 高 | ✅/⚠️/🔴 | 具体说明 |
## ⚠️ 需要关注的问题
> 对每个 FAIL 和 WARN 项展开说明:
> - **问题**:具体是什么问题
> - **风险**:可能的影响
> - **建议**:推荐的修复方式
总分 100 分,按权重分配:
检查项权重DM 策略20Gateway 网络暴露20群聊安全15工具权限15沙箱配置10文件权限10模型安全10
最终分数 = 各项得分之和,四舍五入到整数。
报告输出后,根据扫描结果生成三档方案供用户选择。 只列出需要修复的项(已经 PASS 的不用列)。
修复最危险的问题,最小改动,最大收益。
涉及修改:
dmPolicy: "open" 改为 "pairing"
channels.<渠道名>.dmPolicy"pairing"gateway.auth.mode"token"chmod 700 ~/.openclaw && chmod 600 ~/.openclaw/openclaw.json包含基础加固全部内容,加上群聊和沙箱保护。
在基础加固之上,额外修改:
channels.<渠道名>.requireMentiontruechannels.<渠道名>.groupPolicy"allowlist"groupAllowFrom 数组(列出允许的群 ID)agents.defaults.sandbox{ "mode": "non-main" }tools.profile 从 "full" 改为 "standard" 或移除 exec 相关权限agents.list[N].tools.profile包含标准加固全部内容,最大程度收紧权限。适合面向公网的部署。
在标准加固之上,额外修改:
channels.<渠道名>.dmPolicy"allowlist"allowFrom 数组(列出允许的用户 ID)agents.defaults.sandbox{ "mode": "all", "scope": "session", "workspaceAccess": "readonly" }alsoAllow 项profile: "standard"(无 exec)profile: "coding"(保留 exec 但限制范围)profile: "standard" + alsoAllow: ["web_search", "web_fetch"]agents.list[N].toolsgateway.bind"loopback"gateway.controlUi.dangerouslyDisableDeviceAuth → falsegateway.controlUi.dangerouslyAllowHostHeaderOriginFallback → falsegateway.controlUi.allowInsecureAuth → false在列出方案后,输出如下格式供用户选择:
text
请选择加固方案:
🟢 输入 1 → 基础加固(快速修复最危险的问题)
🟡 输入 2 → 标准加固(推荐!兼顾安全与易用)
🔴 输入 3 → 严格加固(最高安全,适合公网部署)
或输入 0 → 仅查看报告,不执行加固
用户选定方案后,按以下步骤执行:
在修改前先备份配置:
bash
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak.$(date +%Y%m%d%H%M%S)
使用 edit 工具对 openclaw.json 进行精确修改。每次修改:
示例 — 修改 dmPolicy:
text
edit openclaw.json:
oldText: "dmPolicy": "open"
newText: "dmPolicy": "pairing"
示例 — 添加 sandbox 配置:
如果 agents.defaults 中没有 sandbox 字段,在适当位置添加:
text
edit openclaw.json:
oldText: "maxConcurrent": 8,
newText: "maxConcurrent": 8,
"sandbox": {
"mode": "non-main"
},
示例 — 修改文件权限:
bash
chmod 700 ~/.openclaw
chmod 600 ~/.openclaw/openclaw.json
配置修改后需要重启 Gateway 使配置生效:
bash
openclaw gateway restart
加固完成后, 重新执行 Step 1 和 Step 2,生成新的扫描报告,确认所有修改已生效。
输出对比:
markdown
## 🔄 加固前后对比
| 检查项 | 加固前 | 加固后 |
|--------|-------|-------|
| DM 策略 | 🔴 FAIL | ✅ PASS |
| ... | ... | ... |
**安全评分:XX → YY(+ZZ)**
node -e "JSON.parse(require('fs').readFileSync('$HOME/.openclaw/openclaw.json','utf8'))" 验证 JSON 合法性。~/.openclaw/openclaw.json,如果不存在尝试 /data/.openclaw/openclaw.json。也可以通过 openclaw gateway config.get 获取。