OpenClaw 安全加固完全指南:从"能用"到"敢用"

🔒 你的 OpenClaw Agent 可以执行任意 Shell 命令、读写整个文件系统、控制浏览器。默认配置几乎毫无限制。本文带你逐层建立防御,让你既享受 AI Agent 的生产力,又不会在半夜被 rm -rf / 吓醒
如果你现在的 OpenClaw 配置还是默认的,请务必读完这篇文章。

📑 文章目录

  1. 警钟:默认配置到底有多危险
  2. 安全模型概览:OpenClaw 的纵深防御架构
  3. 第一层:Gateway 网络加固
  4. 第二层:DM 与群组访问控制
  5. 第三层:Exec 安全策略——命令审批机制
  6. 第四层:Tool Policy——工具级权限控制
  7. 第五层:Sandbox——Docker 沙箱隔离
  8. 第六层:Elevated Mode——宿主机逃逸通道
  9. 第七层:SecretRef——凭证永不落盘
  10. 第八层:Skill 供应链安全
  11. 安全审计:自动化检查与监控
  12. 完整加固配置模板
  13. 常见安全陷阱与排查

1. 警钟:默认配置到底有多危险

在你读完我之前的本地部署指南MCP 集成实战后,你的 OpenClaw 可能跑得很欢快。但你可能没有意识到一个关键事实:

默认情况下,OpenClaw 可以执行任意 Shell 命令。没有权限限制,没有命令白名单,开箱即用也没有审批要求。这对入门很方便,但对生产环境来说令人恐惧。

你的 OpenClaw 默认能做的事情:

🔴 执行任意 Shell 命令    → rm -rf / ? 技术上可行
🔴 读写整个文件系统       → SSH keys、AWS 凭证、数据库密码——都能读
🔴 访问网络资源           → 调用 API、下载文件、扫描内网端口
🔴 控制浏览器            → 通过 Playwright 操作你登录过的网站
🔴 读取环境变量           → 你的所有 API Key 都在 env 里

更令人担忧的是:在 2026 年初发现 93.4% 的 OpenClaw 实例由于薄弱的安全配置而容易被攻击。

运行 OpenClaw 不仅仅是一个配置选择。这是关于哪台机器、哪些身份和哪些数据你准备在 Agent 处理不可信输入时暴露的信任决策。

真实攻击案例

2026 年 1 月,Giskard 的安全研究人员利用了一个 OpenClaw 部署,揭示了多个漏洞。调查证实,一旦 AI Agent 暴露在公共聊天应用中并配备了强大工具,配置错误就会成为数据泄露和账户接管的直接路径。

暴露的控制 UI 导致访问令牌出现在查询参数中;共享全局上下文意味着为一个用户加载的密钥对其他用户可见;群聊在没有适当隔离的情况下运行强大工具。


2. 安全模型概览:OpenClaw 的纵深防御架构

OpenClaw 既是产品也是实验——你把前沿模型的行为接入到真实的消息平台和真实的工具上。没有"完美安全"的配置。目标是刻意控制——Agent 能触及什么。从满足需求的最小权限开始,然后随着信心增长逐步扩大。

OpenClaw 的安全架构是洋葱模型——多层防御,每一层解决不同维度的风险:

┌───────────────────────────────────────────────────────────┐
│  第 1 层: Gateway 网络加固                                 │
│  ├── 绑定地址(localhost vs 0.0.0.0)                     │
│  ├── Gateway 认证(token / password)                     │
│  └── TLS / Tailscale                                     │
│                                                           │
│  ┌─────────────────────────────────────────────────────┐  │
│  │  第 2 层: DM & 群组访问控制                           │  │
│  │  ├── dmPolicy(pairing / allowlist / open)          │  │
│  │  └── groupPolicy(mention / allowlist)              │  │
│  │                                                     │  │
│  │  ┌───────────────────────────────────────────────┐  │  │
│  │  │  第 3 层: Exec 安全策略                         │  │  │
│  │  │  ├── security: deny / allowlist / full         │  │  │
│  │  │  └── 命令审批流程                              │  │  │
│  │  │                                               │  │  │
│  │  │  ┌─────────────────────────────────────────┐  │  │  │
│  │  │  │  第 4 层: Tool Policy                    │  │  │  │
│  │  │  │  ├── allow / deny 工具白名单              │  │  │  │
│  │  │  │  └── 分组策略(group:fs/web/runtime)    │  │  │  │
│  │  │  │                                         │  │  │  │
│  │  │  │  ┌───────────────────────────────────┐  │  │  │  │
│  │  │  │  │  第 5 层: Sandbox                  │  │  │  │  │
│  │  │  │  │  Docker 容器隔离                   │  │  │  │  │
│  │  │  │  │  ├── 文件系统隔离                  │  │  │  │  │
│  │  │  │  │  ├── 网络隔离                     │  │  │  │  │
│  │  │  │  │  └── 进程隔离                     │  │  │  │  │
│  │  │  │  └───────────────────────────────────┘  │  │  │  │
│  │  │  └─────────────────────────────────────────┘  │  │  │
│  │  └───────────────────────────────────────────────┘  │  │
│  └─────────────────────────────────────────────────────┘  │
│                                                           │
│  横切关注点:                                               │
│  ├── 第 6 层: Elevated Mode(宿主机逃逸通道控制)          │
│  ├── 第 7 层: SecretRef(凭证管理)                       │
│  └── 第 8 层: Skill 供应链安全                            │
└───────────────────────────────────────────────────────────┘

OpenClaw 对沙箱化 Agent 有三道权限门:agents.list[].tools.allow/deny(Agent 级工具权限)、tools.sandbox.tools.allow(沙箱级工具过滤)、sandbox.docker.network(容器的网络访问)。你需要配置所有层级。沙箱工具策略与 Agent 工具 allow/deny 是分开的。


3. 第一层:Gateway 网络加固

Gateway 是 OpenClaw 的入口。如果这一层被突破,后面所有防线都没有意义。

3.1 绑定地址

将 Gateway 绑定到 0.0.0.0 是最危险的错误配置。端口 18789 应该被防火墙限制。把它开放等于给攻击者提供了直达你 Agent 的通道。

// ~/.openclaw/openclaw.json
{
  "gateway": {
    // ✅ 安全:仅监听本地回环地址
    "bind": "127.0.0.1",
    "port": 18789,

    // ❌ 危险:监听所有接口 = 暴露到互联网
    // "bind": "0.0.0.0"
  }
}

3.2 Gateway 认证

重大变更(v2026.3.3):当同时配置了 token 和 password 时,Gateway 认证现在要求显式设置 gateway.auth.mode。

{
  "gateway": {
    "auth": {
      // 当 Gateway 暴露到非回环地址时,必须启用认证
      "mode": "token",                     // "token" | "password"
      "token": "${GATEWAY_AUTH_TOKEN}"     // 至少 32 位随机字符
    }
  }
}

生成安全 token:

# 生成 64 字符随机 token
openssl rand -hex 32
# 输出类似:a1b2c3d4...(64 字符)

3.3 远程访问:用 Tailscale 而不是公开端口

对于远程访问,使用 Tailscale 创建加密的私有 mesh 网络。

{
  "gateway": {
    "bind": "127.0.0.1",     // 仅本地
    "tailscale": {
      "serve": true           // 通过 Tailscale 内网暴露(端到端加密)
      // "funnel": true       // ← 这是公开暴露,只在你知道后果时使用
    }
  }
}

3.4 文件权限

收紧文件权限以保护敏感文件:将 OpenClaw 目录权限设为 chmod 700 ~/.openclaw。将配置文件权限限制为 chmod 600

# 锁定目录权限
chmod 700 ~/.openclaw
chmod 600 ~/.openclaw/openclaw.json

# 验证
ls -la ~/.openclaw/
# drwx------  openclaw.json  (仅所有者可读写)

3.5 专用用户

永远不要以 root 用户运行 Gateway——创建一个专用的非 root 系统用户来降低安全风险。

# 创建专用用户
sudo useradd -r -m -s /bin/bash openclaw
sudo su - openclaw

# 后续所有操作都在 openclaw 用户下执行

4. 第二层:DM 与群组访问控制

将 dmPolicy 设为 “open” 同样有风险。任何能联系到 Bot 的人都能给它发消息。使用 “pairing” 或显式白名单。

4.1 DM 策略

{
  "channels": {
    "telegram": {
      "dm": {
        // ✅ 推荐:配对模式——新用户需要输入配对码才能对话
        "policy": "pairing"

        // ⚠️ 白名单模式——仅允许指定用户
        // "policy": "allowlist",
        // "allowFrom": ["telegram:123456789"]

        // ❌ 危险:任何人都能控制你的 Agent
        // "policy": "open"
      }
    }
  }
}

4.2 群组策略

群组安全在很大程度上取决于谁被允许与 Bot 互动,因为开放的群组策略或公开部署会大幅增加攻击面。任何成员或新加入的攻击者都可以发送精心构造的 Prompt,触发一系列工具调用。

{
  "channels": {
    "discord": {
      "groups": {
        // 仅在被 @提及 时响应(避免群聊中的 Prompt 注入)
        "requireMention": true,
        // 限制可交互的群组
        "allowFrom": ["guild-id-123"]
      }
    }
  }
}

4.3 DM 会话隔离

安全警告:如果你的 Agent 可以接收多人 DM,你应该强烈考虑启用安全 DM 模式。否则所有用户共享同一个对话上下文,可能导致用户之间的私人信息泄露。

{
  "session": {
    "dmScope": "per-channel-peer"    // 每个用户独立会话,隔离上下文
  }
}

5. 第三层:Exec 安全策略——命令审批机制

这是最关键的安全层。exec 工具让 Agent 执行 Shell 命令——这意味着它能做你在终端里能做的一切。

5.1 三种安全级别

exec 安全配置选项有 “deny”、“allowlist”、“full”。警告:只有在你理解风险的情况下才使用 security: "full"。Agent 可以运行任意 Shell 命令。

级别 说明 风险
"deny" 禁止所有 exec 命令 🟢 最安全,但功能受限
"allowlist" 仅允许白名单中的命令,其余需审批 🟡 推荐默认值
"full" Agent 可执行任意命令 🔴 极度危险,仅用于完全受控环境

5.2 推荐配置:allowlist + ask

Exec 安全默认为 “allowlist” 模式——命令需要显式审批,除非安全策略被修改。每个新命令模式都会出现"允许一次 / 始终允许 / 不允许"对话框,直到被加入白名单。

{
  "tools": {
    "exec": {
      "security": "allowlist",
      "allowlist": [
        "git *",          // Git 操作
        "npm *",          // npm 命令
        "ls *",           // 列出文件
        "cat *",          // 读取文件
        "echo *",         // 输出文本
        "python3 *",      // 运行 Python
        "node *"          // 运行 Node.js
      ],
      "ask": "on-miss",       // 不在白名单中的命令弹出审批
      "askFallback": "deny"   // 超时未审批 = 拒绝
    }
  }
}

5.3 审批流细化

security: "deny" 默认阻止所有命令。ask: "off" 信任白名单不提示。ask: "on-miss" 如果命令不在白名单中则提示。ask: "always" 每个命令都提示。askFallback: "deny" 意味着未应答的提示默认拒绝。autoAllowSkills 控制 ClawHub Skills 是否自动受信任。

⚠️ 特别注意 autoAllowSkills:Exec 审批漂移——security=fullautoAllowSkills、没有 strictInlineEval 的解释器白名单:宿主机 exec 的安全护栏是否还在按你认为的方式工作?


6. 第四层:Tool Policy——工具级权限控制

不是每个 Agent 都需要所有工具。

6.1 全局工具策略

{
  "tools": {
    // 全局工具白名单
    "allow": ["read", "write", "web_search", "web_fetch", "memory_search"],
    // 全局工具黑名单
    "deny": ["browser", "exec", "apply_patch"]
  }
}

6.2 Per-Agent 工具策略

在更大的设置中,OpenClaw 支持在 agents.list 下定义多个 Agent,每个有自己的工作空间、工具策略和模型。销售助手 Agent 可能启用 CRM 工具。DevOps Bot 可能允许服务器脚本。权限设计上是分离的。

{
  "agents": {
    "list": [
      {
        "id": "research",
        "tools": {
          "allow": ["read", "web_search", "web_fetch", "memory_search"],
          "deny": ["exec", "write", "browser", "apply_patch"]
        }
      },
      {
        "id": "devops",
        "tools": {
          "allow": ["exec", "read", "write"],
          "deny": ["browser"]
        }
      }
    ]
  }
}

6.3 核心原则

Sandbox 应该对任何面向公众的 Agent 开启(sandbox.mode: "non-main""all"),且工具白名单(tools.allow)应该是显式的。如果 Agent 不需要 exec,它就不应该有 exec。


7. 第五层:Sandbox——Docker 沙箱隔离

Gateway 留在宿主机上;当启用时,工具执行在隔离的沙箱中运行。这不是完美的安全边界,但当模型做蠢事时,它实质性地限制了文件系统和进程访问。

7.1 沙箱模式

agents.defaults.sandbox.mode 控制何时使用沙箱:"all" 表示每个会话都在沙箱中运行。默认值是 non-main,意味着群聊和次要线程在隔离容器中运行,而你的主会话留在宿主机上。

{
  "agents": {
    "defaults": {
      "sandbox": {
        // "off"      → 不隔离(危险)
        // "non-main" → 群组/次要会话隔离(推荐起步)
        // "all"      → 所有会话都隔离(最安全)
        "mode": "non-main",

        // 容器粒度
        "scope": "agent",      // "session" | "agent" | "shared"

        // 工作空间访问
        "workspaceAccess": "rw",  // "rw" | "ro" | "none"

        "docker": {
          // 网络隔离
          "network": "none",     // ← 默认无网络!最安全
          // "network": "bridge"  // ← 需要网络时显式启用

          // 读写控制
          "readOnlyRoot": true,  // 根文件系统只读

          // 资源限制
          "cpus": 2,
          "memory": "2g"
        }
      }
    }
  }
}

7.2 三层权限门(沙箱模式下)

OpenClaw 有一个多层安全模型:沙箱工具策略与 Agent 工具 allow/deny 是分开的——即使你把 web_search 加入了 agents.list[].tools.allow,沙箱有自己的工具过滤器。沙箱网络默认禁用——Docker 容器以 network: 'none' 运行除非显式配置。环境变量不会继承到沙箱中——宿主机上设置的 API Key 在沙箱容器内不可见。

// 完整的沙箱 Agent 配置示例
{
  "agents": {
    "list": [{
      "id": "research",
      "sandbox": {
        "mode": "all",
        "scope": "agent",
        "workspaceAccess": "rw",
        "docker": {
          "network": "bridge"          // ← 需要网络!否则 web 工具无法使用
        }
      },
      "tools": {
        "allow": ["read", "write", "web_search", "web_fetch"],  // ← 第 1 层
        "deny": ["exec", "browser", "apply_patch"]
      }
    }]
  },
  "tools": {
    "sandbox": {
      "tools": {
        "allow": ["group:fs", "group:sessions", "group:web"]    // ← 第 2 层
      }
    }
  }
}

7.3 构建沙箱镜像

默认 Docker 镜像:openclaw-sandbox:bookworm-slim。注意默认镜像不包含 Node。如果 Skill 需要 Node(或其他运行时),要么构建自定义镜像,要么通过 sandbox.docker.setupCommand 安装(需要网络出口 + 可写根 + root 用户)。

# 构建默认沙箱镜像
./scripts/sandbox-setup.sh

# 或使用功能更全的自定义镜像
# 设置:agents.defaults.sandbox.docker.image = "openclaw-sandbox-common:bookworm-slim"

7.4 禁止危险挂载

OpenClaw 阻止危险的 bind 源(例如 docker.sock、/etc、/proc、/sys、/dev)。敏感挂载(密钥、SSH keys、服务凭证)应为 :ro 除非绝对必要。


8. 第六层:Elevated Mode——宿主机逃逸通道

有一个刻意设计的逃逸通道。标记为 elevated 的工具始终在宿主机上运行,即使 Agent 被沙箱化。这是有意的。一些 Shell 命令需要直接宿主机访问。Elevated 模式不会绕过你的工具策略。它只是让那些特定命令逃出容器。工具可用性本身由白名单控制。

8.1 四种 Elevated 级别

/elevated on 在 Gateway 宿主机上运行并保留 exec 审批。/elevated full 在 Gateway 宿主机上运行并自动审批 exec(跳过审批)。/elevated ask 在 Gateway 宿主机上运行但保留 exec 审批(与 on 相同)。on/ask 不会强制 exec.security=full;配置的安全/ask 策略仍然适用。

级别 执行位置 审批 风险
off 沙箱内 N/A 🟢 最安全
on / ask 宿主机 ✅ 保留审批 🟡 有控制的逃逸
full 宿主机 ❌ 跳过审批 🔴 极度危险

8.2 安全配置

tools.elevated 是全局基线。agents.list[].tools.elevated 可以进一步限制每个 Agent 的 elevated(两者都必须允许)。

{
  "tools": {
    "elevated": {
      "enabled": true,
      // 仅允许特定用户使用 elevated
      "allowFrom": {
        "telegram": ["+15555550123"],
        "discord": ["user-id-123"]
      }
    }
  },
  "agents": {
    "defaults": {
      // 默认 elevated 级别
      "elevatedDefault": "ask"    // "off" | "on" | "ask" | "full"
    }
  }
}

8.3 关键安全规则

工具策略拒绝优先:如果工具被全局策略阻止,/elevated 无法覆盖。Elevation 只改变工具在哪里运行以及审批流程。

🚨 你知道 Elevated: AskElevated: Full 的区别吗?提示:其中一个给 Bot 静默的 root 访问权限。


9. 第七层:SecretRef——凭证永不落盘

OpenClaw 支持 SecretRef,使凭证无需以明文存储在配置中。明文仍然可用。SecretRef 是按凭证逐个选择启用的。

9.1 为什么需要 SecretRef

不要让 Agent 读取你的 SSH keys。优先使用 ssh-agent 和 per-project keys。使用有限范围的 token(尽可能只读)。优先使用短期凭证。把密钥从 Agent 能随意读取的 .env 文件中移走。如果有"记忆"功能,确保它永远不在记忆中存储密钥。

9.2 三种 SecretRef Provider

架构采用了 SecretRef Provider 模型,有三种传输方式:env、file 和 exec。

Provider 1: env(环境变量)

{
  "secrets": {
    "providers": {
      "default": {
        "source": "env",
        "allowlist": ["ANTHROPIC_*", "TELEGRAM_*", "DISCORD_*"]
      }
    }
  }
}

Provider 2: file(JSON 文件)

{
  "secrets": {
    "providers": {
      "key_file": {
        "source": "file",
        "path": "/secure/openclaw-keys.json",
        "mode": "json"
      }
    }
  }
}

Provider 3: exec(外部密钥管理器)

exec Provider 是通向任何外部密钥管理器的桥梁。

// HashiCorp Vault 集成
{
  "secrets": {
    "providers": {
      "vault": {
        "source": "exec",
        "command": "vault",
        "args": ["kv", "get", "-field=token", "secret/openclaw/anthropic"]
      }
    }
  }
}

9.3 在配置中引用 SecretRef

{
  "channels": {
    "telegram": {
      "accounts": [{
        "token": {
          "source": "ref",
          "provider": "vault",
          "id": "telegram-bot-token"
        }
      }]
    }
  }
}

9.4 安全管理命令

# 审计当前密钥存储状态
openclaw secrets audit

# 交互式配置 SecretRef Provider
openclaw secrets configure

# 应用迁移计划(明文 → SecretRef)
openclaw secrets apply --from plan.json

# 试运行(查看会做什么,不实际执行)
openclaw secrets apply --from plan.json --dry-run

# 重新加载密钥快照(后端密钥轮转后)
openclaw secrets reload

9.5 安全行为

密钥解析在激活期间是急切的,而不是在请求路径上延迟解析。当有效活跃的 SecretRef 无法解析时,启动会快速失败。重新加载使用原子交换:完全成功,或保留上一个已知良好的快照。


10. 第八层:Skill 供应链安全

这是最容易被忽视的攻击面。

10.1 ClawHavoc 事件

如果你读过我之前的 Skills 开发文章,你已经知道 Skills 本质上就是可执行指令。安装一个 Skill 基本上就是安装特权代码。

检查 ~/.openclaw/skills/ 中的恶意或拼写近似的 Skills。过去的攻击(如 ClawHavoc)引入了 clawhubbauto-updater-agent 等有害 Skill 来窃取凭证。删除任何可疑 Skill 并立即轮转所有 API Key。

10.2 安装前检查清单

因为这些特性,OpenClaw 应该被视为带有持久凭证的不可信代码执行。

安装任何社区 Skill 前的安全检查:

1. ✅ 阅读 SKILL.md 全文
   → 是否有可疑的 curl | bash 命令?
   → 是否要求你在聊天中粘贴 API Key?
   → 是否有 base64 编码或混淆的代码?

2. ✅ 检查来源
   → GitHub 仓库有多少 star?
   → 作者是否可信?
   → ClawHub 上的评价如何?

3. ✅ 检查权限声明
   → requires.bins 和 requires.env 是否合理?
   → 一个"天气查询" Skill 为什么需要 exec 权限?

4. ✅ 查看 ClawHub 安全分析
   → 是否标记了网络请求、文件写入、凭证处理?

5. ✅ 限制 Skill 的 autoAllowSkills
   → 不要自动信任所有 Skill 的命令

10.3 限制内置 Skills

{
  "skills": {
    // 仅加载白名单中的内置 Skill
    "allowBundled": ["github", "memory", "web-search"],

    // 禁用特定 Skill
    "entries": {
      "suspicious-skill": { "enabled": false }
    }
  }
}

11. 安全审计:自动化检查与监控

11.1 内置安全审计

OpenClaw 提供安全审计命令:openclaw security auditopenclaw security audit --deepopenclaw security audit --fixopenclaw security audit --json。它标记常见的安全陷阱(Gateway 认证暴露、浏览器控制暴露、elevated 白名单、文件系统权限、宽松的 exec 审批、开放频道的工具暴露)。

# 基本审计
openclaw security audit

# 深度审计(包含实时 Gateway 探测)
openclaw security audit --deep

# 自动修复可修复的问题
openclaw security audit --fix

# JSON 输出(CI/CD 集成)
openclaw security audit --json

11.2 沙箱策略验证

使用 openclaw sandbox explain(或 --session)来验证任何 Agent 会话的有效沙箱和策略。

# 查看某个 Agent 的实际生效策略
openclaw sandbox explain --agent research

11.3 日常审计流程

这些工具应该成为你的常规流程:每次配置变更或新 Skill 安装后运行审计。

# 建议加入 cron 定期执行
#!/bin/bash
echo "=== OpenClaw 安全审计 $(date) ===" > ~/security-report.txt
openclaw security audit --deep >> ~/security-report.txt 2>&1

# 检查端口暴露
if ss -tlnp | grep -q "0.0.0.0:18789"; then
  echo "🔴 严重:端口 18789 暴露到互联网" >> ~/security-report.txt
fi

# 检查容器是否以 root 运行
docker exec openclaw-agent id 2>/dev/null | grep -q "uid=0" && \
  echo "🔴 严重:容器以 root 运行" >> ~/security-report.txt

12. 完整加固配置模板

以下是一份经过验证的安全加固配置模板,覆盖所有八个安全层。从这个模板开始,根据实际需要逐步放宽权限。

// ~/.openclaw/openclaw.json — 安全加固模板
{
  // ===== 第 1 层: Gateway 网络 =====
  "gateway": {
    "bind": "127.0.0.1",
    "port": 18789,
    "auth": {
      "mode": "token",
      "token": { "source": "ref", "provider": "env", "id": "GATEWAY_AUTH_TOKEN" }
    },
    "controlUi": {
      "allowedOrigins": ["http://127.0.0.1:18789"]  // 不要用 ["*"]
    }
  },

  // ===== 第 2 层: 访问控制 =====
  "channels": {
    "telegram": {
      "dm": { "policy": "pairing" }
    },
    "discord": {
      "dm": { "policy": "pairing" },
      "groups": { "requireMention": true }
    }
  },
  "session": {
    "dmScope": "per-channel-peer"    // 用户间会话隔离
  },

  // ===== 第 3 层: Exec 安全 =====
  // ===== 第 4 层: 工具策略 =====
  "tools": {
    "exec": {
      "security": "allowlist",
      "allowlist": [
        "git *", "npm *", "ls *", "cat *", "echo *",
        "python3 *", "node *", "curl *"
      ],
      "ask": "on-miss",
      "askFallback": "deny",
      "autoAllowSkills": false      // ← 不自动信任 Skill 的命令
    },
    "elevated": {
      "enabled": true,
      "allowFrom": {
        "telegram": ["你的-telegram-id"]
      }
    },
    // 沙箱内工具策略
    "sandbox": {
      "tools": {
        "allow": ["group:fs", "group:sessions"]
        // 不包含 group:web 和 group:runtime
      }
    }
  },

  // ===== 第 5 层: 沙箱 =====
  "agents": {
    "defaults": {
      "sandbox": {
        "mode": "non-main",
        "scope": "agent",
        "workspaceAccess": "rw",
        "docker": {
          "network": "none",
          "readOnlyRoot": true,
          "cpus": 2,
          "memory": "2g"
        }
      },
      "elevatedDefault": "ask",     // 默认 ask 模式
      "model": {
        "primary": "anthropic/claude-sonnet-4-20250514"
      }
    }
  },

  // ===== 第 7 层: 凭证管理 =====
  "secrets": {
    "providers": {
      "default": {
        "source": "env",
        "allowlist": ["ANTHROPIC_*", "OPENAI_*", "GATEWAY_*"]
      }
    }
  },

  // ===== 第 8 层: Skill 供应链 =====
  "skills": {
    "allowBundled": [
      "github", "memory", "web-search", "todoist"
    ],
    "load": {
      "watch": false    // 生产环境关闭自动重载
    }
  }
}

文件权限锁定脚本

#!/bin/bash
# secure-openclaw.sh — 一键锁定文件权限

echo "🔒 正在锁定 OpenClaw 文件权限..."

# 目录权限
chmod 700 ~/.openclaw
chmod 700 ~/.openclaw/credentials 2>/dev/null
chmod 700 ~/.openclaw/memory 2>/dev/null

# 配置文件权限
chmod 600 ~/.openclaw/openclaw.json
chmod 600 ~/.openclaw/auth-profiles.json 2>/dev/null

# 可选:使用 chattr 防止配置被修改(Linux)
# sudo chattr +i ~/.openclaw/openclaw.json
# ⚠️ 注意:锁定后 OpenClaw 也无法修改配置
# 修改前需先 sudo chattr -i 解锁

echo "✅ 权限锁定完成"
echo ""
echo "验证:"
ls -la ~/.openclaw/

13. 常见安全陷阱与排查

陷阱 1:Gateway 绑定 0.0.0.0

# 检查是否暴露
ss -tlnp | grep 18789
# 如果显示 0.0.0.0:18789 → 🔴 立即修复!
# 应显示 127.0.0.1:18789

陷阱 2:tools.elevated.allowFrom.discord 回退

Discord 权限:如果你没有定义 tools.elevated.allowFrom.discord,系统会回退到你的 channels.discord.dm.allowFrom 列表。建议显式设置 tools.elevated.allowFrom.discord 以避免混淆。

// 即使设为空数组,也比不设好——阻止回退
"elevated": {
  "allowFrom": {
    "discord": []  // ← 显式空 = 没有人可以用 elevated
  }
}

陷阱 3:沙箱环境变量不继承

宿主机上设置的 API Key(如 BRAVE_API_KEY)在沙箱容器内不可见。

需要在沙箱配置中显式传递环境变量,或使用 tools.web.search.apiKey 直接在配置中设置。

陷阱 4:denyCommands 的匹配局限

gateway.nodes.denyCommands 模式匹配是精确命令名匹配(例如 system.run),不检查 Shell 文本内容。

这意味着 deny rm 不会阻止 find / -delete。对于真正的命令安全,依赖 exec allowlist + sandbox,而不是 denyCommands。

陷阱 5:沙箱中的 Skill 依赖缺失

默认沙箱镜像不包含 Node。如果 Skill 需要 Node 或其他运行时,需要构建自定义镜像或通过 sandbox.docker.setupCommand 安装。

陷阱 6:配置被 Agent 自身修改

一旦 openclaw.json 被锁定(chattr +i),OpenClaw 自身也无法更新文件——升级或配置变更会因 “Operation not permitted” 失败。修改前先用 sudo chattr -i 解锁,改完后重新锁定。

永远不要锁定 exec-approvals.json——引擎需要在运行时向其写入元数据。

陷阱 7:Prompt 注入攻击

# 检查最近 7 天的 Prompt 注入尝试
find ~/.openclaw/agents/*/sessions -name "*.jsonl" -mtime -7 -exec \
  grep -iH "IGNORE PREVIOUS\|SYSTEM:\|DISREGARD\|NEW INSTRUCTIONS" {} \; 2>/dev/null

对于在公共频道中运行且接收不可信输入的 Agent,即使 Agent 的 API Key 有更广的权限,也要在工具 allow/deny 配置中拒绝 exec 和 webhook 工具。


📋 安全加固检查清单

🔴 必须做(立即):
  □ Gateway 绑定 127.0.0.1(不是 0.0.0.0)
  □ 启用 Gateway 认证(token ≥ 32 字符)
  □ dmPolicy 设为 "pairing"(不是 "open")
  □ 文件权限 700/600
  □ 不以 root 运行

🟡 强烈推荐:
  □ exec.security = "allowlist"(不是 "full")
  □ 启用沙箱(sandbox.mode: "non-main" 起步)
  □ 显式工具白名单(tools.allow)
  □ 会话隔离(dmScope: "per-channel-peer")
  □ autoAllowSkills = false

🟢 进阶加固:
  □ SecretRef 替代明文密钥
  □ Skill allowBundled 白名单
  □ elevated.allowFrom 显式配置
  □ 定期 openclaw security audit --deep
  □ Prompt 注入监控
  □ 配置文件 chattr +i 锁定



# 一键审计命令
openclaw security audit --deep

# 定期运行(建议加入 crontab)
0 3 * * * /usr/local/bin/openclaw security audit --deep --json >> /var/log/openclaw/audit.json

📚 参考资料


如果觉得有帮助,欢迎 点赞 👍 收藏 ⭐ 关注 🔔,有问题评论区见!

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐