安全模型与最佳实践

DM Pairing、Sandbox、openclaw doctor 与生产部署安全清单

20 min read Part of OpenClaw 龙虾篇 · Ch. 9

🦞 强默认、不牺牲能力 —— OpenClaw 的安全哲学。

安全模型与最佳实践

flowchart LR
  A["安全模型与最佳实践"]
  A --> B["分类:OpenClaw"]
  A --> C["关键词:OpenClaw"]
  A --> D["关键词:安全"]
  A --> E["关键词:DM Pairing"]
  A --> F["关键词:Sandbox"]

前文介绍了多平台客户端与消息接入。到了真正部署阶段,安全就不再是“额外配置”,而是系统是否可用、是否敢长期运行的前提。

OpenClaw 的特殊之处在于:它不是一个只会回复文本的 Bot,而是一个会读写文件、调用工具、执行命令、接触模型密钥、连接消息渠道的 Agent。也因此,它的安全问题不是单点问题,而是一个完整的执行链问题:谁能触发它、它在什么环境里运行、能访问什么、哪些能力会越过隔离、出了问题如何发现与收敛。

这篇文章聚焦四件事:

  1. 谁能和 Bot 建立可信交互:DM Pairing
  2. 工具到底在宿主机还是沙箱里跑:Sandbox
  3. 哪些配置会绕开你的预期:Main session、elevated、工具策略
  4. 生产部署前,应该用什么清单把风险压到可接受范围

本文不会把 OpenClaw 写成“绝对安全”的系统。更准确的说法是:它试图提供强默认值、显式风险边界、以及尽量不牺牲能力的分层防护

安全哲学:默认收紧,但不假装万能

OpenClaw 的安全哲学可以概括成先看定义:

strong defaults without killing capability

这句话的重点不在“默认安全”,而在后半句:不为了安全把系统阉割成一个几乎不可用的玩具

这背后其实是典型的 Agent 系统权衡:

  • 如果默认全开,系统很好用,但一旦暴露到不可信入口,风险会迅速放大。
  • 如果默认全关,系统很安全,但用户会不断手动绕过限制,最终形成更差的“影子配置”。
  • 真正合理的做法,是把高风险能力保留为显式选择,把危险配置变成可见、可检查、可告警的状态。

所以 OpenClaw 的安全设计更像一套分层约束,而不是一个“只要开了某个开关就安全”的结论:

  • 入口控制:谁能向 Bot 发起有效请求
  • 执行隔离:请求进来之后,工具在什么环境里运行
  • 能力边界:哪些工具可用,哪些能力被显式禁止
  • 逃逸通道管理:哪些机制会绕开沙箱或主策略
  • 运维校验:配置是否偏离了安全预期

这也是理解后文的关键:不要把任何单一机制当成银弹。

第一层:DM Pairing —— 先解决“谁能说话”

对于消息型 Agent,最容易被低估的风险不是模型本身,而是入口默认开放

很多人第一次部署时,脑中默认前提是“反正只有我自己会用”。但只要系统接到了一个真实消息平台,问题就变成:

  • 陌生账号能不能给它发消息?
  • 群里有人@一下,它会不会开始调用工具?
  • 如果某个渠道 ID 配错,是不是相当于把 Agent 暴露给了错误的人?

OpenClaw 的默认做法是 DM Pairing。也就是:未知发件人先拿到一个配对码,Bot 不处理其消息;只有你批准配对后,这个发件人才会进入 allowlist,后续消息才会正常路由。配对码为 8 位、1 小时过期;默认每个渠道待处理配对请求有上限,超过后新的请求会被忽略,避免被滥用刷爆待处理队列。(OpenClaw)

DM Pairing 的工作方式

状态行为
未配对用户发消息收到配对码,Bot 不处理原始消息
查看待处理请求openclaw pairing list <channel>
批准配对openclaw pairing approve <channel> <code>
配对后发送者进入 allowlist,消息正常路由

从工程角度看,Pairing 解决的不是“认证很强”这个问题,而是更朴素也更重要的问题:把“谁可以驱动 Agent”从隐式状态变成显式批准。

这一步很关键,因为在 Agent 系统里,“能发起一次自然语言请求”本身就已经接近能力边界了。哪怕模型没有被完全越狱,一个不受控的入口也足以带来:

  • 配额消耗
  • 敏感信息探测
  • 工具链误触发
  • 社工式提示注入
  • 利用长上下文慢慢逼近危险操作

从工程上看,Pairing 首先防的不是黑客式入侵,而是“任何能说话的人都在试图编排你的 Agent”

配对信息也是敏感状态

配对状态和 allowlist 会落在本地状态目录中,待处理请求与已批准列表都应当视为敏感信息,因为它们实际上定义了“谁拥有对你助手的控制入口”。(OpenClaw)

这意味着两件事:

  1. 不要把这些状态目录随意同步、备份到公共位置
  2. 出现异常时,不要只排查模型和工具,也要排查 allowlist 是否被误改

很多安全事故不是因为系统“被打穿”,而是因为信任边界悄悄漂移了

开放 DM:不是不能用,而是要知道自己在放开什么

如果你确实希望“任何人都能私聊 Bot 并立刻使用”,可以显式配置开放策略,例如将 dmPolicy 设为 open,并让 allowFrom 包含 "*"。当前配置示例文档也明确要求:当 dmPolicy: "open" 时,匹配的 allowFrom 列表必须包含 "*"。(OpenClaw)

但这里最值得强调的不是配置方式,而是它的真实含义

开放 DM 并不只是“方便一点”,而是把系统从“已知用户驱动的个人 Agent”切换成“对任意可达账号开放的消息入口”。

这会带来几个工程上的变化:

  • 你的 threat model 变了:从“防误触发”变成“面对不可信输入”
  • 你的成本模型变了:模型调用、工具调用、日志量都会被外部流量放大
  • 你的运营要求变了:速率限制、监控、账号封禁、审计都会更重要
  • 你的提示词风险变了:每一条消息都应默认视作潜在对抗输入

所以,open 不是错误配置,而是另一种产品定位。 如果你只是做个人助手或小范围团队助手,开放 DM 通常不是一个值得默认采用的选择。

这也是为什么 openclaw doctor 会对开放 DM 策略给出安全告警。(OpenClaw)

第二层:Sandbox —— 限制“它能做什么”和“在哪里做”

入口控制解决的是“谁能触发”。 Sandbox 解决的是“触发之后,它到底在什么环境里执行”。

这是 Agent 系统与普通聊天系统最大的不同:很多风险不是来自模型回答错了,而是来自模型有机会把“错”落到真实环境里。

OpenClaw 支持把工具执行放进 Docker sandbox。启用后,Gateway 进程仍然在宿主机上,但工具执行会在隔离容器中运行。官方文档也明确强调:这不是完美的安全边界,但它能在模型做出愚蠢决策时,显著限制文件系统和进程访问范围。(OpenClaw)

这句话很重要,因为它避免了一个常见误区:沙箱不是“安全完成”,而是“把事故半径缩小”。

Sandbox 解决的核心问题

对于 Agent 来说,风险往往不是“执行了一个危险命令”,而是“危险命令在哪里执行”。

比如同样是:

rm -rf temp/*

在不同环境里,含义完全不同:

  • 在独立的会话级 sandbox 里,可能只是删掉该会话的临时工作目录
  • 在挂载了真实工作区的沙箱里,可能删掉项目文件
  • 在宿主机上执行,影响范围就取决于宿主机权限和路径结构

所以,Sandbox 的本质不是把所有命令变安全,而是把同样的错误,尽量约束在更小、更可恢复的边界里

sandbox.mode:理解 offnon-mainall

OpenClaw 的 agents.defaults.sandbox.mode 决定何时使用沙箱:

模式含义
off不使用沙箱,工具在宿主机执行
non-main仅非主会话进入沙箱
all所有会话都进入沙箱

其中最常用的是:

agents.defaults.sandbox.mode: "non-main"

这是一个非常实用的折中:你自己的主会话继续保留完整能力,其他会话默认进入隔离环境。

但这里有一个很容易被误解的点:non-main 判断依据不是 agent ID,而是 session 的 mainKey(默认是 "main")。群组、频道会话通常都有自己的 session key,因此会被视为 non-main,并进入沙箱。(OpenClaw)

这意味着:

  • “是不是 main session”是会话维度,不是“这个 Agent 是不是主 Agent”
  • 群聊即使绑定的是同一个 Agent,也很可能走的是不同的安全路径
  • 在排查“为什么这个会话被沙箱了”时,应该先看 session key 和 sandbox explain,而不是只看 agent 名称

为什么 non-main 往往是最现实的默认值

这是 OpenClaw 单用户设计的体现。

对于个人使用者而言,主会话通常就等价于“我自己在本机直接使用这个系统”。在这种场景下,把主会话继续留在宿主机执行,能保留最完整的操作能力和最顺畅的体验。

而把群聊、外部会话、跨平台入口放进沙箱,则是一个很自然的风险分层:

  • 主会话:高信任、高能力
  • 非主会话:较低信任、较小事故半径

这不是绝对安全,而是一种很符合真实使用方式的默认分级。

第三层:工具策略比沙箱更基础

很多人会把 Sandbox 理解成“最大的安全开关”,但在 OpenClaw 里,更基础的其实是工具允许/拒绝策略

原因很简单:

  • 沙箱决定“在哪运行”
  • 工具策略决定“能不能运行”

如果某个工具已经被全局或每个 agent 的工具策略拒绝,沙箱不会把它“重新放出来”。相反,哪怕启用了沙箱,只要某些能力被显式允许,它们依然可能在你配置的边界内发挥作用。官方文档也明确写到:工具 allow/deny 策略先于沙箱生效。(OpenClaw)

这背后的工程含义是:

不要把“启用沙箱”当成“工具权限设计”的替代品。

更稳妥的做法是:

  1. 先决定哪些工具在什么场景根本不该用
  2. 再决定剩余工具是在宿主机还是沙箱里用
  3. 最后再处理那些必须跨边界的例外能力

这意味着,安全设计顺序应该是:

入口 → 工具能力 → 执行环境 → 例外通道

而不是反过来。

Sandbox 默认策略:重点不是“能做什么”,而是“不能顺手做什么”

很多部署会把非 main session 的工具能力压缩到一组基础工具,例如读写、编辑、进程与会话相关工具,而禁用浏览器、Canvas、节点、Cron、网关类能力。

这种策略的价值,不只是减少“显眼的危险功能”,更重要的是避免系统在低信任入口上拥有过多横向扩展能力

为什么浏览器、节点、Gateway、定时任务这类能力风险更高?

因为它们往往意味着:

  • 可以访问新的外部环境
  • 可以跨会话、跨节点传播状态
  • 可以把一次消息触发扩展成持续行为
  • 可以从“单次应答”升级为“长期编排”

从安全视角看,这些能力危险,不是因为它们“功能强”,而是因为它们会让系统的影响范围从当前会话扩展到外部系统

因此,一个常见且合理的默认原则是:

  • 非 main session 只保留完成单次任务所需的最小工具集
  • 高风险、跨边界、可持续化的能力默认关闭
  • 真要开放,应该按 agent、按入口、按场景逐步加,而不是一次性全开

Main session:为什么它默认更强,也为什么这不是“后门”

很多初学者看到“main session 直接在 host 上执行”时,会本能地觉得不安全。这个直觉不完全错,但如果忽略使用场景,也容易误判。

在 OpenClaw 的设计里,main session 默认代表的是系统所有者自己。在单用户、终端优先的场景下,这相当于你通过一个更高层的自然语言接口去驱动本来就属于你的本机能力。

从这个角度看,main session 不被默认沙箱化,并不是偷偷留了一个后门,而是承认这样一个事实:

如果我是机器的拥有者,我本来就可以在这台机器上执行同样的操作。

真正的问题不在于“main session 为什么这么强”,而在于:

  • 你是否真的把 main session 只暴露给自己?
  • 你的主会话入口是否与外部消息渠道混在一起?
  • 你是否把群聊、共享账号、公开机器人也当成“main”来用?

一旦答案变成“不是”,那么默认的单用户信任前提就不成立了。这时你应该考虑的不是继续解释 main session,而是:

  • 把更多入口切到 sandbox.mode: "all"
  • 缩小 allowFrom
  • 减少高风险工具
  • 把 elevated、浏览器、外部节点等能力单独收紧

这意味着,main session 强权限本身不是 bug,把不该拥有主权限的入口伪装成 main,才是问题。

第四层:elevated 是显式逃逸通道,不应被误当成普通工具

OpenClaw 还有一个必须单独理解的概念:elevated mode

当 agent 运行在沙箱内时,普通 exec 会在沙箱环境里执行;而 elevated mode 允许它显式跳出沙箱,在 Gateway 宿主机上执行命令,并带有额外的门控与审批语义。对于未启用沙箱的 agent,elevated 不会带来额外隔离变化,因为 exec 本来就在宿主机上执行。(OpenClaw)

这件事的重要性在于:它告诉你 Sandbox 不是封死的盒子,而是可以被显式穿透的系统边界

这在工程上是必要的。因为现实里总会有少数任务必须落到宿主机:

  • 安装依赖
  • 访问本机目录
  • 调用宿主机特有工具
  • 与宿主机上的其他服务集成

但从安全角度看,这种“必要例外”必须被当成高风险能力来管理,而不是“偶尔方便一下”的小开关。

正确的心智模型应该是:

  • Sandbox 是默认执行面
  • elevated 是受控例外
  • 能不用就不用
  • 要用就必须知道它绕过了什么

如果你的系统已经依赖 elevated 才能完成日常任务,那么通常不是因为 elevated 很好,而是因为你的工作区挂载、镜像、依赖管理、工具策略还没有设计好。

第五层:工作区访问与绑定挂载,是真实风险所在

很多人启用了 Docker sandbox 之后,会下意识认为“现在应该很安全了”。但实际风险往往藏在两个地方:

  1. workspaceAccess
  2. docker.binds

workspaceAccess 决定沙箱能看到多少真实内容

OpenClaw 的 workspaceAccess 支持 nonerorw

配置含义
none默认,只看到沙箱工作区
ro只读挂载 agent 工作区
rw读写挂载 agent 工作区

这三个值并不是“方便程度”的选择,而是事故后果大小的选择。(OpenClaw)

  • none 最保守:模型犯错时,主要破坏的是沙箱内临时内容
  • ro 适合阅读真实项目、但不允许改写
  • rw 则意味着模型可以在真实工作区产生持久修改

很多实践里,ro 是一个非常值得重视的中间层。因为大量任务其实只需要“看见代码和文档”,并不需要直接修改它们。 如果你一上来就给 rw,你得到的只是更高的便利性,同时也把“误改真实工程文件”的概率提了上去。

docker.binds 不是小技巧,而是在重新定义边界

绑定挂载是沙箱配置里最容易被低估、也最容易把安全边界掏空的部分。

例如:

"/var/run/docker.sock:/var/run/docker.sock"
"/home/user/.ssh:/root/.ssh:ro"
"/secrets:/secrets:ro"

这些配置技术上很常见,但安全含义完全不同于普通目录挂载。

原因在于:bind mount 不是在“补充沙箱能力”,而是在“把宿主机的某部分重新暴露给沙箱”。

文档也明确提醒,敏感挂载(例如 docker.sock、密钥、SSH 密钥)应极度谨慎,必要时至少只读。(OpenClaw)

真实工程里,最常见的误区有三个:

  1. 为了方便调试,把整个项目目录直接 rw 挂进去 这样确实方便,但沙箱已经不再只是“临时执行环境”。

  2. 为了让 agent 能构建镜像,把 docker.sock 暴露进去 一旦做到这一步,容器与宿主机边界基本已经非常薄。

  3. 把密钥目录、SSH 目录、云凭证挂进去,认为“反正模型不会乱用” 这是把“行为约束”误当成“权限约束”。

对 Agent 系统而言,权限边界应优先由运行环境保证,而不是寄希望于提示词足够听话。

默认无网络:一个很有价值,但容易误解的设计

OpenClaw 的沙箱容器默认没有网络出口,需要显式通过 sandbox.docker.network 覆盖。(OpenClaw)

这件事非常重要,因为它能明显降低几类风险:

  • 模型把本地内容直接外传
  • 下载并执行额外内容
  • 对外部服务进行未预期访问
  • 在沙箱里临时安装依赖后做更多横向操作

但它也带来一个常见困惑: 为什么某些依赖安装、包下载、联网工具、甚至某些 Skill 初始化会失败?

答案通常不是系统坏了,而是你的沙箱仍然处于一个更保守的默认态。

这就引出一个很实际的工程原则:

不要为了让某一步“顺利跑通”,立刻把网络、写权限、root、挂载全部放开。 应该先确认任务真正需要的最小权限是什么。

很多安全配置走偏,都是从“先放开,能跑再说”开始的。

openclaw doctor:不是锦上添花,而是配置演化期的必要工具

Agent 系统的安全问题很少来自“你完全不懂安全”,更多时候来自:

  • 版本升级后配置语义变化
  • 老配置键还在,但含义已迁移
  • 某个本地状态目录权限不对
  • 启用了开放 DM、却没有意识到
  • 沙箱镜像、服务、认证状态和你想象的不一致

这也是为什么 openclaw doctor 很重要。它不仅是一个“体检工具”,更接近修复 + 迁移 + 风险提示的运维入口:会规范化旧配置、迁移遗留键、检查权限、提醒开放 DM、检查本地 Gateway 认证、必要时修复沙箱镜像与运行时问题。(OpenClaw)

最基础的用法是:

openclaw doctor

如果是自动化或无人值守环境,还可以使用:

openclaw doctor --yes
openclaw doctor --repair

但从实践上说,真正值得建立的是一个习惯:

  • 每次升级后跑一次
  • 每次改安全相关配置后跑一次
  • 每次你觉得“怎么和我想的不一样”时跑一次

因为 OpenClaw 的安全配置不是静态文件问题,而是配置、状态、运行时、服务安装方式共同决定的结果

openclaw sandbox explain:排查“为什么会这样”的首选工具

相比 doctor 偏向“系统健康与修复”,openclaw sandbox explain 更适合回答一个非常常见的问题:

这个会话为什么进了沙箱? 这个工具为什么被拒绝? 到底是谁覆盖了谁?

在有全局配置、每 agent 覆盖、工具策略、sandbox mode、workspaceAccess、bind mount、elevated 等多层因素共同作用时,人脑很容易靠想象得出错误结论。

这类问题最好不要凭记忆排查,而应该直接看系统解释当前生效结果。官方文档也明确建议用它来理解实际生效的沙箱模式与工具策略。(OpenClaw)

这其实是安全运维里很重要的一点: 可解释的配置结果,比“我记得我这样配过”更可信。

频道级安全:消息平台不是中立通道,而是边界的一部分

不同渠道接入 OpenClaw 时,很多人会把它们视作“只是一个 transport”。但在安全视角下,消息平台本身就是权限边界的一部分。

常见做法包括:

频道关键安全机制
WhatsAppallowFrom 白名单
TelegramallowFrom;群组可结合 requireMention
DiscordallowFrom;按 guilds 控制范围
SlackallowFrom 白名单

这里最核心的原则不是“支持哪些字段”,而是:

把所有 inbound message 默认视为不可信输入。

这意味着你不应该因为“这是团队常用频道”就默认信任,也不应该因为“只有同事知道这个 Bot”就放松 allowlist。

尤其是群聊场景,还需要额外考虑几个失败模式:

1. 误触发不是小问题

在群里被随手提及、被转发、被引用,或者 mention 规则过宽,都会让系统在非预期上下文中启动。

这类问题的危险不在于一次错误回答,而在于:

  • 群上下文常常混杂、噪音大
  • 模型容易误解当前真正的操作者是谁
  • 多人可见环境会放大误操作影响

所以 requireMention 这类机制的价值,不是“形式上更严格”,而是减少系统对模糊群体输入的响应概率。

2. 渠道 ID 配错,安全边界会直接错位

allowFrom 看起来像简单白名单,但现实里最常见的问题不是“完全没配”,而是“配了错的 ID 格式或对象”。

例如:

  • 把用户名当成平台内部 ID
  • 把群 ID 当成用户 ID
  • 复制了测试环境的白名单到生产环境
  • 以为 provider 之间 ID 规则一致

这类错误不会总是立刻报错,但会直接导致边界失真: 你以为只允许 A,实际上允许了 B;你以为禁止了外部人,实际上某个群入口仍然能触发。

所以对每个平台,都应该以平台官方 ID 语义为准,而不是靠肉眼猜测格式。配置示例文档也明确提醒,不同 provider 的 ID 规则不同。(OpenClaw)

Tailscale:方便不等于天然安全

OpenClaw 在 Tailscale 场景下通常很顺手,但这不意味着“接上 Tailscale 就自动安全”。

需要区分至少两种模式:

模式安全含义
serve依赖 tailnet 内身份
funnel暴露到公网,风险模型显著变化

官方安全文档说明,针对本地回环上的 Tailscale 请求,OpenClaw 会结合 x-forwarded-* 头与本地 Tailscale 身份解析来验证来源。(OpenClaw)

这带来的工程意义是:

  • 在 tailnet 内部,身份可以更自然地继承到访问控制里
  • 但一旦是 funnel,你就已经进入“公网入口”模型,不能再沿用“这是我自己网络里的东西”这种心态

所以如果你使用 funnel

  • 必须启用额外认证,而不是裸暴露
  • 不要把 main session 权限直接挂到公网入口
  • 不要把开放 DM、宽白名单、强工具能力与公网暴露叠加

真正危险的往往不是某一个开关,而是多个“只是图方便”的决定叠在一起。

生产部署最常见的误区

讲完机制,再总结几类很常见、也最值得避免的误区。

误区一:把沙箱当银弹

启用了 Docker sandbox,不等于你就获得了完整隔离。

如果你同时:

  • 把工作区 rw 挂进去了
  • 暴露了 docker.sock
  • 开了 elevated
  • 放开了网络
  • 开放了大量高风险工具

那你获得的是“形式上有容器”,而不是“实质上有边界”。

误区二:只防恶意,不防误操作

很多人配置安全时,只盯着“外部攻击者”。 但对个人或小团队部署来说,更常见的事故是:

  • 自己在错误会话里下了命令
  • 模型基于错误上下文改了真实文件
  • 群聊里别人无意触发了高权限 Agent
  • 旧状态没有清理,导致错误入口继续有效

所以安全设计不仅是防恶意者,也是防高能力系统在模糊输入下的正常失误

误区三:先把权限放开,之后再慢慢收

这是最常见、也最危险的运维习惯。

因为现实是:一旦系统“能用了”,后续很少有人主动回头把权限收紧。 于是测试期的宽配置,很容易直接遗留到长期生产环境。

更稳妥的做法是反过来:

  • 先从保守配置起步
  • 明确记录每一次放开的理由
  • 哪个能力是真需求,哪个只是临时方便,要区分清楚

误区四:把“我信任这个人”误当成“我信任这个入口”

你也许信任某个同事,但不代表你就该信任:

  • 他所在的整个群聊
  • 他转发来的外部内容
  • 这个渠道上的所有上下文
  • 这个入口未来不会被更多人看到

信任应尽量绑定到可验证的身份与可控的入口,而不是抽象的人际判断。

一份更实用的生产部署安全清单

下面这份清单比“有没有打开某个功能”更强调实际边界。

检查项建议
DM 策略默认使用 pairing,除非你明确要做开放式 Bot
allowFrom每个频道单独配置并核对 ID 语义,不偷懒用过宽匹配
群聊触发需要时启用 requireMention,避免群组噪音误触发
Sandbox 模式至少让非主会话使用 sandbox.mode: "non-main";共享或公网场景优先考虑更严格策略
workspaceAccess默认从 none 开始;只读优先于读写
docker.binds谨慎挂载真实目录;避免把 docker.sock、SSH、密钥目录随手暴露进去
网络出口不因一时方便就放开沙箱网络;先确认是否真需要
elevated视为高风险例外能力,单独收紧,不作为日常默认路径
工具策略先设计 allow/deny,再谈沙箱;高风险工具默认关闭
Tailscale funnel公网暴露必须叠加认证,不要裸开
gateway.bind使用 Serve/Funnel 时保持 loopback,避免额外暴露面
openclaw doctor部署前、升级后、改配置后都跑一次
openclaw sandbox explain遇到“为什么它这样运行”时优先使用
配置与密钥模型 API Key 不入仓库,使用环境变量或受控配置文件
状态目录权限本地配置与认证文件权限保持最小化,避免被其他进程或用户误读
变更管理每次放开权限都记下原因,避免测试期宽配置沉积到生产

如果只想记住一句话,可以记这句:

先收紧入口,再收紧工具,再看执行环境,最后才允许少量可审计的例外。

一个足够稳妥的起点

如果你要的是一个“个人可用、同时不至于太松”的默认起点,可以从下面的心智模型开始:

  • 私聊默认 pairing
  • 各频道明确 allowFrom
  • 群聊默认保守触发
  • 非 main session 进入 sandbox
  • workspaceAccessnonero 起步
  • 不默认开放 elevated
  • 不默认给沙箱网络与敏感挂载
  • 每次改完配置都跑 openclaw doctor

它不是最强安全配置,但对多数个人部署和小范围使用来说,已经比“先跑起来再说”可靠得多。

小结

OpenClaw 的安全,不是某个单独功能的名字,而是一套边界协作:

  • DM Pairing 解决谁能触发系统
  • allowFrom / requireMention 解决哪些入口被信任
  • Sandbox 解决工具在哪里运行、事故半径有多大
  • 工具策略 解决哪些能力根本不该出现
  • elevated 处理少数必须跨边界的例外
  • doctor / sandbox explain 解决配置演化和运维可解释性

真正成熟的部署,通常不是“把所有能力都开出来”,而是:

让高能力只出现在高信任入口,让低信任入口拥有更小的事故半径。

这也是 OpenClaw 安全模型最值得理解的一点: 它并不试图否认 Agent 的危险性,而是承认危险性,并把能力、入口与运行环境拆开,尽量让你在可控前提下使用它。