Pi / 05

安全模型深入:容器化隔离的实际边界

为什么这个问题值得关注

01 篇已经说明了 Pi 不内置权限系统的设计选择。但”把安全交给容器”是一句话,落到生产环境里要回答更具体的问题:容器隔离的实际边界在哪里?什么场景下这个假设会失效?当它失效时,补救方案的成本有多高?

这不是理论讨论。一个 Agent 拥有 Shell 执行能力意味着它可以做任何操作系统用户能做的事。隔离方案的选择直接决定了”模型幻觉”的最大爆炸半径。

Pi 的显式声明

Pi 的 README 明确列出了它不限制的四类访问:

  • 文件系统:可以读写任何路径
  • 进程:可以启动、终止任何进程
  • 网络:可以访问任何端口和地址
  • 凭据:可以读取环境变量、配置文件中的 secrets

这不是缺陷列表,而是接口契约。Pi 告诉你:如果你需要约束这些行为,请在 Pi 外部解决。

三种容器化方案

Gondolin micro-VM

最强隔离级别。每个 Agent 会话运行在独立的轻量虚拟机中,拥有独立的内核、文件系统和网络栈。

  • 隔离强度:硬件虚拟化级别,宿主机攻击面极小
  • 启动开销:百毫秒级,比传统 VM 快但比容器慢
  • 适合场景:多租户 SaaS、处理不受信任的代码、需要合规审计的企业环境
  • 代价:资源占用高,宿主机资源共享需要调度,调试困难(无法直接 attach 到 VM 内部进程)

Docker 容器

大多数团队的默认选择。文件系统和网络通过 namespace 隔离,进程通过 cgroup 限制资源。

  • 隔离强度:操作系统级别,共享宿主内核
  • 启动开销:秒级,CI/CD 流水线中可接受
  • 适合场景:开发环境、CI/CD、中等信任级别的自动化
  • 代价:共享内核意味着内核漏洞可以逃逸,需要定期更新宿主机

典型配置示例:

services:
  pi-agent:
    image: pi-agent:latest
    read_only: true
    tmpfs: ["/tmp"]
    network_mode: "none"  # 禁止网络访问
    volumes:
      - ./workspace:/workspace  # 只挂载工作目录
    cap_drop: ["ALL"]

network_mode: noneread_onlycap_drop ALL 三重限制,把爆炸半径控制在挂载的 workspace 目录内。

OpenShell sandbox

轻量级进程沙箱,通过 seccomp 和 namespace 限制系统调用。

  • 隔离强度:进程级别,比容器弱
  • 启动开销:毫秒级,几乎无感
  • 适合场景:本地实验、快速原型、信任度较高的场景
  • 代价:隔离粒度粗,绕过可能性更高,不适合多租户

容器隔离 vs 内置权限:工程 tradeoff

两种安全路线的核心差异不是”哪个更安全”,而是安全成本在哪里支付。

维度 容器化隔离(Pi) 内置权限系统(Claude Code)
安全检查时机 部署前一次性配置 每次工具调用前检查
运行时开销 零(隔离已在环境层生效) 每次操作增加审批延迟
粒度 粗——按文件系统/网络/进程整体控制 细——可以区分读/写/删/某个具体目录
安全基线维护者 运维团队(Dockerfile、VM 配置) 框架维护者 + 用户配置
扩展开发负担 无需考虑权限声明 每个工具必须声明所需权限
用户理解成本 需要理解容器化概念 需要理解权限规则语法

关键观察:容器化方案的运行时开销为零,但前置投入高。内置权限方案的前置投入低(框架已实现),但每次交互都有成本。对于高频自动化(CI/CD 中每天跑几百次 Agent 任务),零运行时开销的优势显著。对于低频人工交互(开发者偶尔使用 Agent 辅助编码),审批延迟可以接受。

容器化假设什么时候失效

Pi 的安全模型建立在一个核心假设上:Agent 所需的一切资源都可以在容器内提供。以下场景会打破这个假设:

需要宿主机硬件资源

GPU 直通(模型推理、CUDA 编译验证)、USB 设备、特定物理端口。Docker 的 --gpus--device 可以映射设备,但映射就意味着打破隔离——容器可以通过 GPU 驱动访问宿主机内存。

需要宿主机网络服务

Agent 需要访问宿主机上运行的本地数据库、API 网关或 VPN 隧道。network_mode: host 直接废掉网络隔离。端口映射虽然更安全,但增加了配置复杂度。

团队缺乏容器化运维能力

容器配置看起来简单,但生产环境中的容器安全需要:镜像扫描、基础镜像更新、密钥注入(非环境变量)、日志收集、资源限制调优。如果团队没有这些能力,容器反而成为安全盲区——配置错误比没有隔离更危险,因为它给出虚假的安全感。

需要细粒度操作审批

“允许读 src/ 但不允许写 src/core/”——容器做不到这个粒度。文件系统 mount 是目录级别的,不支持读写分离的路径控制。如果你的合规要求需要这种粒度,容器化方案不够用,需要在容器内部加一层权限代理,这等于回到了内置权限路线。

BreachWeave:容器隔离的天然适配场景

BreachWeave 是腾讯云黑客松冠军项目,一个基于 Pi 的多 Agent 渗透测试系统。它的架构说明了什么时候容器化隔离不是”够用”,而是”最优解”:

  • 渗透测试 Agent 需要执行恶意代码片段来验证漏洞——这正是容器隔离的最佳用途
  • 每个攻击向量的探索运行在独立容器中,互不干扰
  • 容器销毁后痕迹消失,不需要清理
  • 网络隔离可以精确控制 Agent 的攻击范围(只能触达目标网段)

这个场景下,内置权限系统反而是负担——你不会想让渗透测试 Agent 每次执行 exploit 都弹审批对话框。

与 DSH 策略平面的对比

DeepSeek Harness 的安全方案是策略平面:Approval 插件 + Sandbox 插件 + Policy 引擎。三者可以独立替换。

维度 Pi 容器化 DSH 策略平面
安全边界定义位置 运行环境(Docker/VM 配置) 代码中(Policy DSL)
可编程性 低——容器配置是声明式的 高——可以写任意审批逻辑
动态调整 需要重启容器 运行时热加载策略
审计能力 依赖外部日志系统 内置(Decision Log)
适合 边界固定、高频自动化 边界动态变化、需要审计追溯

DSH 的策略平面更灵活,但复杂度也更高。Pi 的方案更粗暴但运维模型更简单——如果你的安全边界不需要运行时动态调整,容器配置就足够了。

实践建议

  1. 裸机绝对不要跑不受信任的 Agent 任务。无论用 Pi 还是其他框架,Agent + Shell 执行 + 无隔离 = 灾难等待发生。
  2. Docker 是默认起点。read_only + network_mode: none + 最小化 volume mount 覆盖 80% 场景。
  3. 细粒度需求出现时再加层。不要预先设计复杂的权限体系。观察实际需要的控制粒度,按需引入。
  4. 安全配置要版本化。Dockerfile 和 compose 文件进仓库,和代码一样 review。

小结

Pi 的容器化安全模型是一个”该 tradeoff”而非”该回避”的设计选择。它在容器化环境成熟、安全边界固定、运行频率高的场景下是最优解。它在需要细粒度控制、缺乏运维能力、边界动态变化的场景下会失效。

判断它是否适合你的关键问题不是”容器安全吗”,而是”你的安全需求能不能用容器边界表达”。


下一篇:社区生态:Fork、移植与跨框架兼容