安全性
Deno Sandbox 专为不受信任或 AI 生成的工作负载设计。每个虚拟机都是 短暂存在的,在虚拟机管理程序(hypervisor)级别隔离,并受严格的出站 策略管理。这让你能够运行任意代码,同时保障组织数据和 基础设施的安全。
密钥编辑和替换 Jump to heading
密钥永远不会进入沙箱环境变量。相反,Deno Deploy 仅在沙箱发起对批准主机的出站请求时替换密钥。创建沙箱时配置密钥:
await using sandbox = await Sandbox.create({
secrets: {
OPENAI_API_KEY: {
hosts: ["api.openai.com"],
value: process.env.OPENAI_API_KEY,
},
ANTHROPIC_API_KEY: {
hosts: ["api.anthropic.com"],
value: process.env.ANTHROPIC_API_KEY,
},
},
});
在沙箱内部,环境变量保存的是占位符:
echo $ANTHROPIC_API_KEY
# <placeholder>
这确认用户代码无法读取真实密钥。这阻止了最常见的 AI 攻击路径——通过提示注入后窃取密钥,同时允许你的自动化安全调用第三方 API。
出站网络控制 Jump to heading
默认情况下,Deno Sandbox 允许无限制的出站网络访问。使用
allowNet 选项限制流量到特定主机:
await using sandbox = await Sandbox.create({
allowNet: ["api.openai.com", "*.anthropic.com"],
});
支持的模式包括:
| 模式 | 匹配 |
|---|---|
example.com |
精确主机名,任意端口 |
example.com:443 |
仅精确主机名的 443 端口 |
*.example.com |
example.com 的任意子域 |
192.0.2.1 |
精确 IPv4 地址 |
[2001:db8::1] |
精确 IPv6 地址 |
当提供了 allowNet 时,任何到非允许列表主机的出站请求都会被阻止。未提供 allowNet 时,允许所有出站请求。将它与
密钥选项结合使用,确保即使代码被诱导调用意外端点,也不会发送凭据。
文件系统隔离与清理 Jump to heading
- MicroVM 从干净的磁盘镜像启动。你上传的任何文件仅在沙箱生命周期内存在,除非你显式挂载卷。
- 当对沙箱的最后引用被释放(或调用了
sandbox.kill()),虚拟机被销毁且磁盘被清理,防止残留状态。 - 卷提供共享存储,但每个沙箱访问必须明确授权,且可按需挂载为只读。
审计和可观测性 Jump to heading
- 每个命令、HTTP 请求和 SSH 会话都可以在 Deno Deploy 仪表盘追踪,给你代理行为的凭证和记录。
- 创建沙箱时附加元数据(如
metadata: { owner: "agent" }),使日志和追踪清楚显示是谁发起的活动。