跳到主要内容

沙箱

CubePlex 通过 OpenSandbox 在隔离的沙箱中执行由代理生成的代码。沙箱提供了一个安全环境,代理可以在其中运行代码、安装软件包并与文件交互,而不会影响你的主机基础设施。

沙箱配置分布在两个管理页面中:Admin > Sandbox/admin/sandbox)用于配置策略,Admin > Sandbox Environment/admin/sandbox-env)用于配置环境变量和密钥。

本页介绍组织级管理。面向用户的操作——从工作区设置中列出、重启和删除自己的沙箱——请参阅管理沙箱

沙箱可运行的内容

代理通过单个基于 shell 的 execute 工具在沙箱中运行代码——它会执行 shell 命令、通过 heredoc 写入文件,以及运行脚本(例如 python script.py)。它并不局限于固定的编程语言列表。

实际可用的语言和工具取决于为组织配置的沙箱镜像(沙箱策略中的 default_image)。该镜像中安装的任何内容——Python、Node.js 以及其他运行时或 CLI 工具——都是代理可以使用的内容。如需支持额外语言或库,请配置一个包含它们的沙箱镜像。

沙箱策略

策略控制沙箱允许执行的操作,尤其是网络访问相关操作。

配置网络访问

  1. 前往 Admin > Sandbox
  2. 设置默认网络操作:选择 Allow(默认允许所有出站流量)或 Deny(默认阻止所有出站流量)。
  3. 添加特定规则以覆盖默认设置:
    • Allow 规则——允许访问特定主机或 IP 范围的流量(默认设置为 Deny 时很有用)。
    • Deny 规则——阻止访问特定目标的流量(默认设置为 Allow 时很有用)。
  4. 点击 Save

示例:严格限制的沙箱

将默认操作设置为 Deny,然后只为代理所需的主机添加允许规则:

规则操作目标
默认Deny所有出站流量
规则 1Allowpypi.org, files.pythonhosted.org
规则 2Allowregistry.npmjs.org
规则 3Allowapi.your-internal-service.com

这样可确保代理能够安装软件包并调用你的内部 API,但无法访问其他任何目标。

沙箱网络策略,默认拒绝并允许访问软件包注册表

命令规则

除网络规则外,沙箱策略还可以匹配代理尝试执行的 shell 命令,并应用以下三种操作之一:

  • Allow——允许匹配该模式的命令。
  • Deny——阻止匹配该模式的命令。
  • Confirm——暂停代理,并要求人工在命令运行前批准或拒绝该命令。

对于需要人工确认的敏感操作,请使用 Confirm;对于绝不能执行的命令,请使用 Deny

备注

每次沙箱运行也都具有执行超时限制:长时间运行的命令会被自动终止,避免卡住的进程无限期占用沙箱。

环境变量和密钥

你可以在运行时向沙箱注入环境变量和密钥。这样,代理代码便可访问 API 密钥、数据库 URL 或配置值,而无需将它们硬编码。

作用域级别

环境变量可以限定在三个级别:

作用域可见范围管理位置
组织所有工作区、所有用户Admin > Sandbox Environment
工作区该工作区内的所有用户工作区自身的设置
用户仅限该工作区中该用户的沙箱会话工作区自身的设置

当同一个变量名同时存在于多个作用域时,范围更窄的作用域优先:用户覆盖工作区,工作区覆盖组织。

Admin > Sandbox Environment 页面仅管理组织作用域的变量——它们会被注入到每个工作区的沙箱中。工作区和用户作用域变量需要从各自工作区内添加,而不是在此管理页面中添加。

添加组织环境变量

  1. 前往 Admin > Sandbox Environment
  2. 点击 Add Variable
  3. 输入变量名称和值。
  4. 若要存储凭据,请将其标记为 secret。密钥的处理方式与普通值截然不同(请参阅密钥如何不进入沙箱)——你还需要指定允许将密钥发送到哪些主机,以及可选的适用请求header 名称
  5. 点击 Save。密钥的值会被加密,保存后不会再次显示。

密钥如何不进入沙箱

对于任何敏感信息——API 密钥、令牌、数据库密码——请使用密钥条目,而非普通变量。CubePlex 的设计确保真实密钥值永远不会存在于沙箱内,以防代理编写的代码(或其日志)泄露它。两类条目的行为不同:

  • 普通变量(未标记为密钥)会以其字面值注入到沙箱环境中。请将其用于非敏感配置(Base URL、区域名称、功能开关)。代码可直接读取它们,它们也可能出现在输出和日志中。
  • 密钥绝不会以真实值注入。沙箱接收的是不透明的占位符令牌(例如 cbxref_…)。你的代码使用该占位符的方式与使用真实密钥完全相同——例如,将它放入 Authorization header。沙箱发起出站请求时,CubePlex 的出口代理会在网络边界将占位符替换为真实密钥,但仅在同时满足以下条件时才会替换:
    • 目标主机是你为该密钥允许的主机之一;并且
    • 占位符出现在允许的 header 名称之一中(若已配置 header 名称)。

该设计带来的结果:

  • 真实密钥永远不会存在于沙箱中。 代码、文件和执行日志只会看到占位符——因此密钥不会出现在代理输出或运行日志中。
  • 替换在沙箱外部进行,由出口代理完成,因此密钥绝不会写入任何沙箱进程或日志。
  • 静态加密。 密钥值存储在凭据保险库中,只有代理在请求时、针对已验证的沙箱和允许的主机,才由代理解密。
  • 泄露的占位符没有价值。 它仅对自身沙箱及允许的主机有效,且会在运行结束时被撤销。

常见使用场景

  • 供代理代码直接调用的外部服务的 API 密钥(不是通过 MCP 调用)。
  • 用于数据分析任务的数据库连接字符串
  • 因工作区而异的功能开关或配置值。