在安全沙箱中运行 Codex 或编码智能体

在安全沙箱中运行 Codex 或编码智能体

通过为编码智能体提供限定的仓库工作空间、受控的终端执行路径、显式的文件权限、网络和包安装策略、隔离的密钥、命令日志、工件,以及在合并或部署前对高风险变更的清晰审批路径,在沙箱中运行它。无论智能体是 Codex 风格、IDE 连接、CI 触发,还是嵌入在你自己的开发者平台中,这种模式都适用:模型可以规划和编辑,但沙箱决定它能接触什么、能运行什么、能获取什么,以及审查者会收到哪些证据。

什么是编码智能体沙箱?

编码智能体沙箱是一个隔离的运行时环境,AI 系统可以在其中检查代码、编辑文件、运行终端命令、在策略允许时安装依赖、执行测试、启动预览服务器,并返回可审查的差异,而无需获得对开发者机器或生产环境的广泛访问权限。

重要的转变在于:沙箱不仅仅是模型的聊天外壳。它是工作的操作边界。模型提出操作建议;沙箱强制执行工作空间、工具、权限和证据追踪。

对于简单的代码助手,本地检出和手动复制粘贴可能就足够了。但对于能够运行命令或持续多步的智能体,你需要更强的边界:

  • 为每个任务或会话提供专用的工作空间。
  • 已知的仓库状态和分支。
  • 带有风险操作审批的命令执行接口。
  • 针对 npmpipcargoapt 及类似工具的包安装策略。
  • 针对注册表、文档、API 和预览访问的网络出口规则。
  • 作用域限定于任务且尽可能对日志隐藏的密钥。
  • 捕获的 stdout、stderr、退出码、文件变更、生成的工件和预览 URL。
  • 在合并、部署或外部发布之前的审查关卡。

这就是为什么“在沙箱中运行 Codex”应被理解为基础架构模式,而非单一的 CLI 标志或某个供应商集成。Codex CLI 本身被文档化为在本地计算机上运行的编码智能体,OpenAI 的 Codex 文档描述了一种面向终端的工作流程。如果你为团队、CI 系统或产品工作流程操作这类智能体,那么周围的执行环境就成了控制平面。

编码智能体沙箱架构

最清晰的架构将模型循环与执行边界分离:

职责 需要回答的问题
智能体接口 将用户意图转化为计划、文件编辑、工具调用和审查摘要 使用哪个模型或编码智能体?提示、上下文和工具模式如何管理?
工作空间管理器 创建沙箱、检出仓库、设置分支并挂载允许的文件 每个任务是否隔离?基础提交是否已知?工作空间能否重置?
终端运行器 执行已批准的指令并将结果流式传输回智能体 哪些命令自动运行、需要审批或已被阻止?
策略层 控制文件系统范围、密钥、网络出口、包安装、运行时限制和清理 智能体能否获取包?能否访问公共互联网?能否读取凭据?
证据层 存储日志、差异、测试结果、预览和工件 审查者能否在不依赖模型摘要的情况下重建发生的情况?
审查关卡 在合并、发布或部署前需要人工或可信的自动化步骤 谁批准风险变更?必须首先通过哪些检查?

在实践中,单一平台可能会组合这些层中的多个。架构仍然重要,因为它让产品选择保持诚实。如果一个工具给智能体提供终端,但无法显示命令日志、文件差异或出口策略,那么它可能便于原型开发,但对于生产环境审查而言过于薄弱。

编码智能体沙箱中终端访问应该如何工作?

终端是编码智能体在操作上变得有用且危险的场所。它可以运行测试、构建资产、检查生成的文件、启动本地服务器和诊断故障。它也可以删除文件、泄露环境变量、运行意外的安装脚本或消耗大量计算资源。

一个好的终端模型包含三个部分。

首先,定义命令类别。安全的只读命令(如 lssedrggit diff 和测试状态命令)通常可以自动运行。构建和测试命令(如 npm testpytestcargo testnpm run build)可以允许但设置超时。破坏性或外部影响命令(如 rm -rfgit pushgh pr merge、部署 CLI、包发布、数据库迁移或云资源变更)应要求显式批准或完全阻止。

其次,以结构化方式流式传输结果。智能体和审查者应看到命令、工作目录、开始时间、退出码、stdout、stderr、超时状态以及截断输出策略。终端截图是不够的;系统应保留机器可读的日志。

第三,有意地处理长时间运行的会话。编码智能体通常需要后台开发服务器、监视器、浏览器自动化进程或集成测试栈。将长时间运行的进程视为带句柄的资源:启动它们,流式传输日志,仅暴露所需的预览端口,并在清理时停止它们。不要让后台进程成为聊天会话中未跟踪的副作用。

针对智能体变更的仓库隔离和分支控制

仓库状态是可审查编码智能体工作流程的支柱。除非用户明确选择那种模式,否则智能体不应在不明确的文件夹中使用未知的本地编辑。

对于团队工作流程,从已知的仓库 URL、基础分支和提交 SHA 开始每个任务。创建任务分支或分离的工作空间。保持用户更改与智能体更改隔离,并在审查前捕获确切的差异。如果沙箱支持持久会话,则有意保留工作空间;不要依赖偶然的进程状态。

默认模式如下所示:

1. 为 task-123 创建隔离的工作空间。
2. 在 main@<base_sha> 检出仓库。
3. 创建分支 agent/task-123。
4. 根据策略运行依赖安装。
5. 让智能体检查、编辑、测试和迭代。
6. 捕获 git diff、测试输出、生成的工件和预览 URL。
7. 打开拉取请求或将补丁交给人工审查者。
8. 根据保留策略拆除或归档工作空间。

关键细节是步骤 6。一个有用的编码智能体不仅仅说“我修好了”。它返回更改的文件、每个更改存在的原因、运行了哪些验证、哪些失败了以及哪些仍未验证。

沙箱编码智能体的命令、包和网络策略

包安装是编码智能体沙箱中最困难的部分之一。许多实际任务需要依赖项。许多供应链事件也始于依赖获取、安装后脚本或不透明的二进制文件。

一个实用的策略不是“永远不安装包”,而是“仅通过已知路径安装包,并记录日志和范围”。

控制项 实际实现
包管理器 根据语言和仓库类型决定哪些包管理器可用。
注册表访问 允许已批准的注册表;在任务不需要时阻止任意包源。
锁定文件 优先使用现有锁定文件和可重现的安装命令。
安装后脚本 决定生命周期脚本是可以自动运行还是需要批准。
系统包 aptbrew 和操作系统包安装视为比项目依赖安装更高的风险。
缓存 在需要速度和可重现性时使用受控的包缓存。
日志记录 存储包名、版本、注册表 URL、可能的校验和以及安装输出。

网络策略应同样明确。编码智能体可能需要阅读公共文档、调用测试 API、下载包或暴露本地预览。这些与不受限制的互联网访问不同。将出站的包获取、网页浏览、API 调用、webhook 投递和预览入口分离。如果你的产品处理敏感代码或数据,请询问 DNS、代理日志和注册表镜像是否与 HTTP 流量受相同策略覆盖。

智能体工作空间的密钥、日志和审计追踪

密钥应限定在最小的有用范围内。编码智能体通常不需要生产凭据。它可能需要只读的 Git 令牌、包注册表令牌、测试 API 密钥或预览部署令牌。每个密钥都应是任务范围的、尽可能有时间限制的,并且不对不需要它的命令可用。

除非任务确实需要,否则避免将密钥放置在智能体可以读取的文件中。优先使用代理访问:沙箱可以执行操作,但模型看不到原始凭据。当环境变量必要时,日志应编辑已知的密钥模式,并且审查者工件不应包含完整的环境转储。

对于审计追踪,存储的内容应超过最终的补丁:

  • 用户请求和任务元数据。
  • 仓库 URL、基础提交、分支和最终提交或差异。
  • 请求、批准、阻止和执行的命令。
  • 命令输出、退出码和超时。
  • 平台能够捕获的文件读取和写入。
  • 策略支持级别的网络和包获取记录。
  • 预览 URL 和生成的工件路径。
  • 人工审批和合并决策。

这不是官僚主义。这是审查者区分真实修复和貌似合理故事的方式。

合并前的差异、预览和审查关卡

编码智能体最有用的输出是一组可审查的变更集。这意味着沙箱应产生细心工程师从拉取请求中期望的相同工件:

  • 有重点的差异。
  • 已运行的测试或构建命令。
  • 仍然存在的失败。
  • 屏幕截图、预览 URL 或可下载文件(当 UI 或生成的资产发生更改时)。
  • 对预期行为变更的简短解释。

将最终的合并或部署保留在人工控制的关卡之后,除非你的组织已针对该确切仓库和风险级别构建了单独的信任自动化策略。当变更涉及身份验证、计费、数据访问、网络调用、基础设施、依赖版本、生成的迁移或用户可见内容时,人工审查尤其重要。

预览处理应有自己的规则:仅暴露审查所需的服务和端口。启动 Web 应用的沙箱应给审查者提供一个限定范围的预览 URL,而不是对工作空间的广泛网络访问。

长时间运行智能体会话的清理和重置策略

每个沙箱都需要一个生命周期。没有生命周期,长时间运行的编码智能体基础设施将变成一堆陈旧的工作空间、泄露的日志和仍在运行的进程。

对于短任务,临时模型效果不错:创建沙箱,运行作业,提取工件,然后销毁。对于较大的任务,持久化可能很有价值:智能体可能需要暂停、等待审查、从同一分支恢复,或在审查会话期间保持开发服务器运行。持久化应是一个显式的产品功能,带有过期时间、所有者和保留规则。

定义针对以下内容的清理:

  • 后台进程和开放端口。
  • 临时文件和构建输出。
  • 包缓存和下载的归档。
  • 任务范围的密钥。
  • 日志和工件。
  • 已被替代的分支或工作树。

重置同样重要。审查者应能够从基础提交或最终分支重新运行智能体的验证。如果结果仅因为长期会话中不可见的状态而有效,那么工作流程就难以信任。

Novita Agent Sandbox 在此工作流程中的位置

Novita Agent Sandbox 专为智能体基础设施而设计,其中代码执行、浏览器自动化、计算机使用风格工作流程、数据分析、评估和较长时间运行的智能体工作流程需要隔离的运行时。Novita Agent Sandbox 文档 将该产品描述为一个有状态环境,用于运行智能体工作负载,提供 SDK 和 CLI 路径来处理沙箱生命周期、文件、命令、浏览器会话及相关工作流程原语。

对于已经使用 Novita AI 模型 API 的团队,沙箱层可以缩小模型推理与动作执行之间的差距。模型可以推理、调用工具和规划代码更改;沙箱可以提供隔离的工作空间,用于执行、记录、预览和审查这些操作。

在设计工作流程时使用保守的产品边界:

  • 将 Novita Agent Sandbox 视为执行环境,而非全面的安全保障。
  • 将密钥、包安装、出口和发布操作保留在自己的策略控制之下。
  • 在将其硬编码到生产自动化中之前,从 Novita 文档中验证当前的 SDK、CLI、定价和账户限制细节。
  • 在信赖任何沙箱用于生产之前,根据自身策略评估隔离边界、第三方智能体兼容性和合规性要求。

这种分离使得实现指南即使在智能体层发生变化时仍然有用。你可以使用 Codex 风格的智能体、内部编码智能体、浏览器智能体或评估工作器,同时保持相同的沙箱控制问题。

编码智能体沙箱实现检查清单

在将编码智能体沙箱从原型阶段推进之前,使用此检查清单。

领域 最低限度的生产环境问题
工作空间 每个任务是否获得限定的文件系统和已知的仓库基础提交?
分支 智能体更改是否隔离在审查者可以检查的分支或补丁上?
终端 命令是否记录工作目录、输出、退出码和超时?
审批 哪些命令自动运行、需要审批或已被阻止?
依赖安装是否可重现并记录?
网络 出口是否按包获取、文档浏览、API 调用和预览访问进行分离?
密钥 凭据是否为任务范围并从日志中编辑?
预览 预览端口是否明确且易于关闭?
工件 生成的文件、屏幕截图、报告和日志是否附加到审查中?
持久化 会话暂停/恢复是否是刻意的,并有所有者和过期时间?
清理 进程、端口、临时文件、密钥和陈旧工作空间是否被移除?
审查 对于风险变更,是否有人员批准合并、发布或部署?

如果你当前的设置无法回答其中几个问题,请将工作流程保留在原型轨道中。智能体可能仍有帮助,但不应该获得广泛的仓库、网络或凭据访问权限。

常见问题

我可以在云沙箱中运行 Codex 本身吗?

从概念上讲,可以:如果环境支持终端编码智能体所需的操作系统、身份验证路径、终端 I/O、文件系统访问和网络访问,则可以将其运行在隔离的工作空间中。除非沙箱提供商和智能体提供商为你确切设置记录了官方集成或完全兼容性,否则不要假设这一点。

Docker 对编码智能体沙箱来说就足够了吗?

Docker 对于本地开发、CI 作业和可重现环境很有用,但“足够”取决于你的威胁模型。询问共享哪个内核、存在哪些文件挂载、如何控制网络出口、密钥是否暴露给容器,以及如何处理逃逸或依赖包妥协。对于敏感工作负载,安全团队通常会评估更强的隔离边界和更严格的出口控制。

编码智能体应该具有互联网访问权限吗?

只有在任务需要时,并且通过你可以解释的策略。文档查阅、包注册表访问、测试 API 调用和任意浏览是不同的权限。记录智能体获取了什么,保持包安装可重现,并避免向通用编码会话授予生产网络访问权限。

审查者在合并智能体生成的代码之前应查看什么?

审查差异、运行的命令、测试/构建输出、依赖变更、生成的工件、预览行为以及任何跳过的验证。特别注意身份验证、权限、数据处理、网络调用、迁移、安装脚本和密钥。

Novita 如何帮助编码智能体沙箱?

Novita Agent Sandbox 为代码执行、浏览器自动化、计算机使用风格任务、数据分析、评估和较长时间运行的工作流程等工作负载提供隔离的智能体运行时。在构建编码智能体工作流程时,请将其与显式的仓库、命令、包、网络、密钥和审查策略配对。

推荐文章