本页内容

本页内容

网关

工具和代理权限

Control 平面工具

仍有两个内置工具对控制平面敏感:

  • gateway 使用 config.schema.lookup / config.get 读取配置,并使用 update.run 启动所有者请求的 OpenClaw 更新。它没有配置写入或独立重启操作;更新重新启动和完成通知是自动的。
  • cron 创建在原始 chat/task 结束后继续运行的计划作业。

gateway 工具仅供所有者使用,因为配置读取可能会暴露机密和主机拓扑,并且 update.run 会更改正在运行的安装。更新需要明确的用户请求。代理通过 openclaw 委托工具请求其他持久配置或生命周期更改。 OpenClaw 将它们映射到键入的操作并应用请求运行的有效权限策略:完全访问,包括默认(完全访问),授权允许的更改,无需批准提示;限制运行需要人工批准。独立工具、文件系统、沙箱和操作限制仍然适用,并且主机在执行之前重新验证实时权限。请参见会话权限模式和OpenClaw设置代理。

对于任何处理不受信任内容的 agent/surface,默认拒绝这些:

json5
{  tools: {    deny: ["gateway", "cron", "sessions_spawn", "sessions_send"],  },}

commands.restart=false 禁用 /restart 和外部 SIGUSR2 重启请求。 gateway 代理工具没有重新启动操作。

跨提供商消息传递

默认情况下,具有消息工具访问权限的代理可以跨对话和渠道提供商发送。例如,WebChat 会话可以发送到配置的 Discord 通道,而无需选择跨提供商传送。工具访问、消息操作白名单、channel/account 策略和提供商自己的权限仍然适用。

tools.message.crossContext.allowAcrossProviders 默认为 true。省略设置时升级采用此默认值;显式 false 继续阻止受保护的消息操作跨越绑定的源提供程序。如果您的部署依赖于该限制,请将其设置为 false。

allowWithinProvider 也默认为 true 并独立控制针对同一提供商上的另一个对话的操作。要将受保护的消息操作限制在当前绑定的对话中,请将两个选项设置为 false:

json5
{  tools: {    message: {      crossContext: {        allowWithinProvider: false,        allowAcrossProviders: false,      },    },  },}

要将此策略应用于一个代理,请将相同的 message 块放在 agents.entries.<agentId>.tools 下。每个代理值会覆盖匹配的全局设置;省略的字段继承它们。

这些控件保护消息突变,例如发送、回复、编辑、删除和线程创建。它们并不限制每个通道操作:读取和管理操作具有单独的权限。它们也不会在没有绑定源对话的情况下限制 CLI 调用,也不会替换文件系统、shell 或沙箱限制。相关控制请参见工具策略和每代理访问配置文件。

Node 执行 (system.run)

如果一个 macOS 节点已配对,Gateway 可以在其上调用 system.run——这就是在该 Mac 上的远程代码执行。

  • 需要节点配对(批准+令牌)。配对建立节点identity/trust并发行代币;它不是每个命令的批准表面。
  • Gateway 通过 gateway.nodes.commands.allow / gateway.nodes.commands.deny 应用粗粒度的全局节点命令策略。拒绝列表仅匹配精确的节点命令名称(例如 system.run),不会匹配命令负载中的 shell 文本——如果重新连接的节点声明了不同的命令列表,只要 Gateway 全局策略和节点自身的执行批准仍然强制执行边界,这本身并不是漏洞。
  • 每个节点的 system.run 策略由节点自身的执行批准文件(exec.approvals.node.*)决定,可在 Mac 上通过“设置 -> 执行批准”(安全性 + 询问 + 允许列表)进行控制;它可以比 Gateway 的全局命令 ID 策略更严格,也可以更宽松。
  • 运行在 security="full" 且 ask="off" 配置下的节点遵循默认的受信任操作者模型——这是预期行为,而不是错误,除非你的部署需要更严格的安全策略。
  • Approval 模式绑定精确的请求上下文,并在可能的情况下绑定一个具体的本地 script/file 操作数。如果 OpenClaw 无法准确识别 interpreter/runtime 命令的一个直接本地文件,则批准支持的执行将被拒绝,而不是承诺完整的语义覆盖。
  • 对于 host=node,批准支持的运行还存储准备好的 systemRunPlan;稍后批准转发重用该存储的计划,并且网关验证在创建批准请求后拒绝调用者对 command/cwd/session 上下文的编辑。
  • 如需完全禁用远程执行:将安全策略设置为 deny,并移除该 Mac 的节点配对。

动态技能(watcher / 远程节点)

OpenClaw 可以在会话中刷新技能列表:当 SKILL.md 更改时,技能观察器会在下一个代理回合更新快照,并且连接 macOS 节点可以使 macOS- 只有技能符合资格(基于 bin 检查)。将技能文件夹视为可信代码并限制谁可以修改它们。

插件

插件与 Gateway 在同一进程中运行——请将它们视为受信任的代码。

  • 仅从您信任的来源安装;更喜欢明确的 plugins.allow 允许名单;在启用之前检查插件配置。插件代码、元数据或发现根更改后重新启动网关。使用默认的混合重新加载模式,普通配置和启用会更改热重新加载,除非插件声明重新启动触发前缀。
  • Installing/updating 插件运行可执行代码:
    • 安装路径是活动插件安装根目录下的每个插件目录。
    • ClawHub 软件包和 OpenClaw 的 bundled/official 目录是可信来源。新的任意 npm、npm-pack:、git、本地 path/archive 或市场源在安装前发出警告;在您查看并信任该来源后,非交互式安装需要 --force。 --force 确认出处并允许覆盖;它不会绕过 security.installPolicy 或剩余的安装安全检查。更新重用已选择的源。
    • OpenClaw 在 install/update. 期间不运行内置本地危险代码阻止使用 security.installPolicy 进行操作员拥有的本地 allow/warn/block 决策,使用 openclaw security audit --deep 进行诊断扫描。
    • npm 和 git 插件安装仅在显式 install/update 流程期间运行包管理器依赖项收敛。本地路径和档案被视为独立的包; OpenClaw copies/references 它们无需运行 npm install。
    • 优先使用固定的精确版本(@scope/[email protected]),并在启用前检查解压后的代码。
    • security.installPolicy 允许操作员运行受信任的本地命令来返回 allow、warn 或 block 进行技能和插件安装。它在源材料准备好之后但在安装继续之前运行,并且也适用于 ClawHub 技能。
    • A warn 结果在提交之前停止。交互式 CLI 命令要求操作员使用与可疑 ClawHub 版本相同的措辞键入插件或技能名称,然后在继续之前重新评估策略。超过 4,000 个字符的渲染审查会在提示之前阻止安装。在检查该命令调用中的每个警告后,拒绝的和非交互式直接 CLI 命令可以使用 --acknowledge-install-policy-warning 作为明确批准。 Control UI 通过 Install 无论如何 公开相同的调用范围批准用于插件安装。其他网关支持的自动安装在没有操作员确认流程时仍会被阻止。每个批准的警告都会在继续之前重新评估。 block 和策略失败仍然是最终的。 --force 和已弃用的插件 install/update 标志 --dangerously-force-unsafe-install 都不批准策略警告。

详细信息:插件

沙箱

专门文档:沙箱

两种互补的方法:

  • Docker 中的完整网关(容器边界):Docker
  • 工具沙箱(agents.defaults.sandbox;主机网关 + 沙箱隔离工具;内置 Docker 和 Podman 后端):沙箱

沙箱内的代理工作区访问(agents.defaults.sandbox.workspaceAccess):

  • "none"(默认):工具会看到位于 ~/.openclaw/sandboxes 下的沙箱工作区;代理工作区不可访问。
  • "ro":将代理工作区以只读方式挂载到 /agent(禁用 write/edit/apply_patch)。
  • "rw":将代理工作区 read/write 安装在 /workspace 处。

额外的 sandbox.docker.binds 根据已解析符号链接的规范化源路径进行验证。阻止路径拒绝列表涵盖 /etc、/private/etc、/proc、/sys、/dev、/root、/boot 以及通常包含或别名 Docker 套接字的目录(/run、/var/run 和 docker.sock 位于其下),加上 HOME 凭证子路径(.aws、.cargo、.config、.docker、 .gnupg、.netrc、.npm、.ssh)。父符号链接技巧和主目录别名是通过现有祖先解析并重新检查的,因此如果它们解析为阻止的根,它们仍然会被拒绝。

子代理委派防护

如果你允许会话工具,请将委派的子代理运行视为另一项边界决策:

  • 除非代理确实需要委派,否则拒绝 sessions_spawn。
  • 将 agents.defaults.subagents.allowAgents 以及任何针对代理的 agents.entries.*.subagents.allowAgents 覆盖项限制为已知安全的目标代理。
  • 对于必须保持沙盒状态的工作流程,请使用 sandbox: "require" 调用 sessions_spawn(默认为 "inherit");当目标子运行时未沙箱化时,"require" 会快速失败。

只读模式

通过将 agents.defaults.sandbox.workspaceAccess: "ro"(或 "none",无工作区访问权限)与阻止 write、edit、apply_patch、exec、process 等的工具 allow/deny 列表相结合,构建只读配置文件。

  • tools.exec.applyPatch.workspaceOnly: true(默认):即使关闭沙箱,也将 apply_patch 和 writing/deleting 保留在工作区目录之外。仅当您有意希望 apply_patch 接触工作区之外的文件时才设置 false。
  • tools.fs.workspaceOnly: true(可选):将 read/write/edit/apply_patch 路径以及原生提示图片自动加载路径限制在工作区目录内。
  • 保持文件系统根目录狭窄 - 避免像 agent/sandbox 工作空间的主目录那样宽的根目录,这可能会将敏感的本地文件(例如 ~/.openclaw 下的 state/config)暴露给文件系统工具。

每个代理的访问配置文件(多代理)

每个代理可以有自己的沙箱+工具策略:完全访问、只读或无访问。请参阅 Multi-Agent Sandbox 和 Tools 了解优先规则。

常见模式:个人代理(完全访问,无沙箱)、family/work 代理(沙盒 + 只读工具)、公共代理(沙盒 + 无 filesystem/shell 工具)。

工具配置文件不会缩小会话工具的范围,沙箱仅将沙箱调用者限制在其生成树上;非沙盒代理仍然可以读取沙盒代理的会话。会话可见性是网关范围内的,并且默认情况下处于开启座席到座席消息传递的状态,因此当一个网关上的座席不应互相看到或发送消息时,请将角色配置文件与 tools.sessions.visibility 和 tools.agentToAgent 配对(请参阅下面的最后一个示例)。

要允许没有跨代理历史记录访​​问的请求,请缩小可见性并将请求者的 agents.entries.<agentId>.tools.agentToAgent.send 设置为选定的目标 ID 或 * 模式。这仅授予 sessions_send 和授权回合的回复,而不授予读取、状态、会话控制或其他隐藏的监视访问权限。它不会覆盖全局代理到代理的限制或仅生成沙箱的限制。请参阅 仅发送示例和信任限制 。

完全访问(无沙箱)

json5
{  agents: {    entries: {      personal: {        workspace: "~/.openclaw/workspace-personal",        sandbox: { mode: "off" },      },    },  },}

只读工具 + 只读工作区

json5
{  agents: {    entries: {      family: {        workspace: "~/.openclaw/workspace-family",        sandbox: { mode: "all", scope: "agent", workspaceAccess: "ro" },        tools: {          allow: ["read"],          deny: ["write", "edit", "apply_patch", "exec", "process", "browser"],        },      },    },  },}

无 filesystem/shell 访问权限(允许提供者消息传递)

json5
{  // The default "all" covers every session on the Gateway, including other agents' and other users' transcripts.  // Explicit tree scope limits non-main callers to current + spawned sessions.  // Use visibility: "self" for strict current-session access, including main.  tools: { sessions: { visibility: "tree" } }, // self | tree | agent | all  agents: {    entries: {      public: {        workspace: "~/.openclaw/workspace-public",        sandbox: { mode: "all", scope: "agent", workspaceAccess: "none" },        tools: {          allow: [            "sessions_list",            "sessions_history",            "sessions_send",            "sessions_spawn",            "session_status",            "discord",            "slack",            "telegram",            "whatsapp",          ],          deny: [            "apply_patch",            "browser",            "canvas",            "cron",            "edit",            "exec",            "gateway",            "image",            "nodes",            "process",            "read",            "write",          ],        },      },    },  },}
本页有帮助吗?