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