1149 字
6 分钟
给 AI Agent 选沙箱:先决定是否共享内核

给 AI Agent 选择沙箱时,我不会先比较启动时间或 API 数量,而会先问:能否接受它与宿主机共享内核? 这个答案会同时影响隔离、启动、资源、存储和调度。

如果没有先回答这个问题,参数表很容易把不同安全模型的产品放在一起比较,最后选到一个“启动很快”,但无法满足威胁模型的方案。

沙箱隔离的四种设计思路

四类方案不是四个性能档次#

常见方案可以按隔离位置理解:

方案隔离主要发生在哪里主要优势主要代价
容器namespace、cgroup、capability启动快、生态完整与宿主共享内核
gVisor用户态系统调用拦截缩小宿主内核暴露面系统调用兼容与性能成本
microVM独立 Guest Kernel 与虚拟硬件内核边界清晰启动、内存和调度更重
Wasm受限指令与能力接口体积小、能力边界明确不能直接运行任意 Linux 程序

它们不是从低到高的统一档次,而是四种取舍。需要运行任意二进制、浏览器和编译器时,Wasm 通常不适合;执行不可信代码且后果较高时,共享宿主内核的容器又可能不够。

所以第一步不是选产品,而是写清威胁模型:

  • 代码来自内部受控逻辑,还是任意用户输入;
  • 是否接触凭证、私有代码和生产网络;
  • 逃逸后的影响范围是单任务、单节点还是整个租户;
  • 是否需要完整 Linux ABI。

隔离确定后,再比较七个工程角度#

确定隔离模型后,再比较其他工程指标:

角度需要回答的问题
启动创建、恢复和可执行分别需要多久
资源CPU、内存和 PID 是软限制还是硬边界
存储工作区如何持久化、复用和回收
调度是否依赖 KVM、专用节点或本地状态
网络出口策略能否按域名、身份和租户控制
镜像环境如何分层、缓存和按需加载
观测能否定位创建、执行、暂停和销毁阶段

这些问题在不同隔离方案中会得到不同答案。例如 microVM 的 Snapshot 可以减少 Guest Boot,却不能省掉节点选择和资源分配;Warm Pool 可以降低冷启动,却会增加容量管理与空闲成本。

因此,单个指标很少能够独立决定选型。详细机制分别放在后续专题中:资源模型存储与 Warm Pool镜像分层网络出口调度观测

我的选择:先固定合同,再替换引擎#

生产平台不应让业务代码直接依赖某个 Sandbox SDK。我更倾向于在上层保留统一合同:

Create → Ready → Execute → Pause / Resume → Destroy

合同至少要统一 Workspace 身份、资源规格、网络策略、执行结果、TTL 和销毁语义。底层可以根据任务风险选择容器、gVisor 或 microVM。

这种 Facade 不是为了隐藏所有差异。KVM 依赖、网络能力和文件一致性仍需要显式暴露;它的作用是让差异停留在平台边界,不进入每个 Agent 的业务逻辑。

我的默认判断是:

  1. 内部受控任务优先选择容器,换取启动速度与生态;
  2. 不可信代码或高价值凭证场景,提高到 gVisor 或 microVM;
  3. 能力封闭、运行形态固定时,再评估 Wasm;
  4. 在真实工作负载上验证冷启动、系统调用、文件和网络行为。

最终选型不是“哪个引擎最好”,而是:

在目标威胁模型下,哪种隔离边界足够可靠,并且平台愿意承担它的启动与运营成本。

实现依据:为什么其他指标受隔离模型影响
  • 容器共享宿主内核,创建成本主要来自 namespace、cgroup、文件层和进程启动。
  • gVisor 增加系统调用拦截层,安全收益与兼容成本集中在 syscall 路径。
  • microVM 需要 Guest Kernel、虚拟设备和 KVM,调度时还要确认节点能力。
  • Wasm 通过能力接口访问宿主资源,运行边界清晰,但无法无条件兼容现有 Linux 工具链。

因此启动、资源和调度并不是独立参数,而是隔离边界在不同工程阶段的表现。