用微虚拟机隔离执行 AI 生成代码
文章介绍通过 DigitalOcean Harness Runtime,为不可信代码创建独立 Firecracker 微虚拟机,并给出上传与执行示例。强调出站网络默认开放,应配置允许列表、缩小凭据权限,并按用户或工作负载划分会话。
AI 深度解读
LLM 生成的代码能运行,不代表适合直接放进服务器执行。原文给出的方案是:用独立的硬件隔离环境执行代码,再收紧网络出口、凭证权限和会话边界。它介绍的具体产品是仍处于公开预览阶段的 DigitalOcean Managed Agents。
这篇值得看的地方,是把「有沙箱就安全」拆成了几个独立问题。尤其是网络默认放行、同一会话共享凭证、任务结束后仍可能计费,这些都需要调用方主动处理。
只想执行代码,不必启动完整 Agent
DigitalOcean Managed Agents 通过 Harness Runtime,为每个会话分配一台 Firecracker microVM。按原文描述,会话之间以及会话与宿主机之间的隔离,由虚拟机监控器(hypervisor)执行,而不是依靠容器命名空间。
大白话理解:不同会话各有自己的运行环境,隔离边界放在虚拟机这一层。
如果应用已经生成了代码,只需要找个地方执行,就可以配置 harness: none。它保留相同的 microVM 环境,但里面不运行 Agent。
下面的配置创建一个名为 untrusted-run 的沙箱,并声明网络出口:
name: untrusted-run
harness: none
egress: [pypi.org, files.pythonhosted.org]
重点看 harness: none:执行代码与运行 Agent 是两件可以分开的事。egress 的实际放行范围还包含平台默认项,不能只看这两行域名。
创建、上传和执行的流程如下:
doctl harness-runtime create --spec ./sandbox.yaml
doctl harness-runtime upload untrusted-run --local-file ./generated.py --workspace-path generated.py
doctl harness-runtime exec untrusted-run -- python3 generated.py
注意最后一行:这个例子明确执行的是 Python 文件。原文没有给出 Node 运行时、依赖安装方式或版本信息,不能据此直接承诺 JavaScript 项目也能照搬。
隔离了机器,还要限制代码能访问什么
硬件隔离解决运行边界,网络和凭证决定代码仍能做多少事。
原文最关键的提醒是:沙箱默认允许出站网络访问。没有 egress 字段时,生成的代码可以访问任意主机,也就可能把工作区内容发送出去。沙箱不接受来自互联网的入站连接,但这阻止不了代码主动外传数据。
声明一个主机就会启用允许列表,拒绝其他目标。不过,平台还会加入 GitHub、DigitalOcean registry 和模型端点,具体行为受团队策略约束。因此,上面的配置不能理解成「只允许访问两个 Python 包域名」。
凭证也要单独处理。作者要求把密钥声明在 secrets 下,而不是 env 下,由平台在会话启动时注入,避免值进入配置文件和日志。但注入之后,沙箱里的任何进程都能读取它。
所以,secrets 解决的是密钥如何交付,不能代替密钥自身的权限控制。每个密钥仍应在提供方那里限制到任务所需的最小范围。
对于第三方工具,原文推荐 Action Gateway,在工具执行时代理凭证,让沙箱不持有密钥。如果代码由 Agent 编写,还可以增加默认 ask 的权限策略,并拒绝 rm -rf * 之类的命令。不过,原文明确说执行效果因适配器而异,不能把这层策略当成统一生效的保证。
多用户应用要把会话当作隔离单位
同一个沙箱里的进程共享文件和凭证。因此,即使任务属于不同用户,只要放在同一会话里,也没有获得原文描述的用户间隔离。
作者建议每个用户或工作负载使用独立会话,并维护外部用户标识与 DigitalOcean session ID 的关联。对接应用时,这个映射决定了任务、结果和清理操作应该落到哪个环境。
生命周期同样需要应用负责。没有 Agent 的沙箱会持续计费,直到暂停或删除。原文建议先下载结果,再删除会话;只等脚本执行完毕,并不等于资源已经释放。
我的判断
这篇最有价值的是边界划分:microVM、网络出口、凭证权限、Agent 命令策略各管一层。把其中任何一层当成完整安全方案,都会漏掉其他入口。
但它更像产品使用指南。作者没有提供攻击测试、容器与 microVM 的对照数据,也没有给出启动耗时、并发容量或成本数据。「如何配置」有明确步骤,「相比其他方案好多少」没有证据。
相比自行维护容器执行环境,托管 microVM 提供了不同的隔离机制;是否值得切换,还要结合运行时需求、延迟和费用验证。服务仍在公开预览,原文也没讲清平台默认网络目标能否进一步收紧。这些都应在接入前核实。
能拿来做什么
- 如果应用只需要执行 LLM 生成的脚本,可以先按
harness: none验证最小流程,确认创建、上传、执行和结果下载都能完成。 - 给执行环境声明明确的
egress,同时核对平台额外放行的目标,检查敏感工作区内容可能通过哪些出口离开。 - 多用户 AI 编程服务应按用户或工作负载建立独立会话,并保存用户标识与 session ID 的映射,避免文件和凭证混用。
- 把结果下载、暂停或删除纳入任务生命周期;使用
secrets注入凭证时,仍要在凭证提供方限制权限。