跳到正文

沙箱隔离方案

置信度:第二级——官方 Docker 文档 + 已验证的供应商文档阅读时间:约 10 分钟范围:在隔离环境中安全运行 Claude Code


速览

方案隔离级别本地/云端最适合
Docker 沙箱microVM(虚拟机监控程序)本地最高安全性,需要 Docker-in-Docker
Claude Code 原生沙箱进程(Seatbelt/bubblewrap)本地轻量级日常开发,受信任代码
Fly.io SpritesFirecracker microVM云端API 驱动的智能体工作流
E2BFirecracker microVM云端多框架 AI 应用
Vercel 沙箱Firecracker microVM云端Next.js / Vercel 生态系统
Cloudflare Sandbox SDK容器云端基于 Workers 的无服务器架构

快速开始:

Bash
docker sandbox run claude ~/my-project

1. 问题:安全自主性

Claude Code 的权限系统可以保护您免受意外操作的影响,但它产生了一个矛盾:

  • --dangerously-skip-permissions 移除所有护栏——Claude 可以不经询问执行 rm -rfgit push --forceDROP TABLE。在裸机上,这很危险。
  • 权限疲劳——批准每个文件编辑和 shell 命令会拖慢自主工作流。对于大型重构或 CI 流水线,交互式审批是不切实际的。
  • 差距:如何在自主且安全的情况下运行 Claude Code?

答案:隔离执行环境。让智能体在沙箱内自由运行,在那里影响范围是受控的。沙箱是安全边界,而非权限系统。


2. 隔离方式

🖼️ 此处为飞书内嵌白板(需在飞书中查看)


3. Docker 沙箱

来源docs.docker.com/ai/sandboxes/要求:Docker Desktop 4.58+(macOS 或 Windows)

Docker 沙箱在您本地机器上以基于 microVM 的隔离运行 AI 编码智能体。每个沙箱有自己独立的 Docker 守护进程和文件系统。沙箱不会出现在 docker ps 中——它们是虚拟机,不是容器。

快速开始

Bash
# 创建并运行带有您项目的沙箱
docker sandbox run claude ~/my-project

# 以自主模式运行(在沙箱内安全)
docker sandbox run claude ~/my-project -- --dangerously-skip-permissions

# 直接传入提示词
docker sandbox run claude ~/my-project -- "将 auth 模块重构为使用 JWT"

# 继续之前的会话
docker sandbox run my-sandbox -- --continue

架构

Plain
┌──────────────────────────────────────────────────────────┐
│                       主机                               │
│                                                          │
│  ┌────────────────────────────────────────────────────┐  │
│  │             Docker 沙箱(microVM)                  │  │
│  │                                                    │  │
│  │  ┌──────────────┐  ┌───────────────────────────┐  │  │
│  │  │  Claude Code  │  │  独立 Docker 守护进程      │  │  │
│  │  │  (--dsp 模式) │  │  (与主机隔离)             │  │  │
│  │  └──────────────┘  └───────────────────────────┘  │  │
│  │                                                    │  │
│  │  ┌──────────────────────────────────────────────┐  │  │
│  │  │  工作区:~/my-project(与主机同步)            │  │  │
│  │  │  与主机相同的绝对路径                          │  │  │
│  │  └──────────────────────────────────────────────┘  │  │
│  │                                                    │  │
│  │  基础环境:Ubuntu、Node.js、Python 3、Go、Git、    │  │
│  │            Docker CLI、GitHub CLI、ripgrep、jq     │  │
│  │  用户:拥有 sudo 权限的非 root 'agent'             │  │
│  └────────────────────────────────────────────────────┘  │
│                                                          │
│  主机 Docker 守护进程:沙箱内不可访问                    │
│  主机文件系统:不可访问(工作区除外)                    │
└──────────────────────────────────────────────────────────┘

关键特性:

  • 工作区同步:主机目录在沙箱内以相同绝对路径挂载
  • 完全隔离:智能体无法访问主机 Docker 守护进程、主机容器或工作区外的文件
  • 独立 Docker:每个沙箱拥有自己的 Docker 守护进程用于构建/运行容器
  • Claude 以 --dangerously-skip-permissions 运行:这是有意为之——沙箱是安全边界

网络策略

控制沙箱可以访问的网络资源。

Bash
# 查看网络活动
docker sandbox network log my-sandbox

# 设置拒绝列表模式(阻断所有,允许特定)
docker sandbox network proxy my-sandbox \
  --policy deny \
  --allow-host api.anthropic.com \
  --allow-host "*.npmjs.org" \
  --allow-host "*.pypi.org" \
  --allow-host github.com

# 设置允许列表模式(允许所有,阻断特定)
docker sandbox network proxy my-sandbox \
  --policy allow \
  --block-host "*.malicious-domain.com" \
  --block-cidr "192.168.0.0/16"
模式默认行为使用场景
允许列表(默认)允许大多数流量,阻断特定目标一般开发
拒绝列表阻断所有流量,仅允许指定目标高安全性环境

默认阻断范围:私有 CIDR(10.0.0.0/8127.0.0.0/8172.16.0.0/12192.168.0.0/16169.254.0.0/16)及其 IPv6 等效地址。

模式匹配:精确(example.com)、指定端口(example.com:443)、通配符(*.example.com 仅匹配子域名)。最具体的模式优先。

安全注意事项:域名过滤不会检查流量内容。宽泛的允许(如 github.com)会允许访问用户生成内容。旁路模式下不进行 HTTPS 检查。

配置存储:每个沙箱存储于 ~/.docker/sandboxes/vm/[name]/proxy-config.json。策略在重启后持久保存。

自定义模板

对于需要特定工具的可复现环境的团队:

Dockerfile
FROM docker/sandbox-templates:claude-code

USER root

# 安装项目特定依赖
RUN apt-get update && apt-get install -y \
    postgresql-client \
    redis-tools

# 安装全局 npm 包
RUN npm install -g pnpm turbo

USER agent

构建和使用:

Bash
# 构建模板
docker build -t my-team-sandbox:v1 .

# 使用自定义模板创建沙箱
docker sandbox create my-sandbox \
  --template my-team-sandbox:v1 \
  --load-local-template ~/my-project

适合使用自定义模板的场景:团队环境、特定工具版本、重复配置、复杂配置。简单的一次性工作请使用默认设置,让智能体安装所需内容。

命令参考

命令说明
docker sandbox run <agent> <path>创建并启动沙箱
docker sandbox create <name>创建不启动
docker sandbox ls列出所有沙箱
docker sandbox run <name> -- "提示词"传入提示词
docker sandbox run <name> -- --continue继续上次会话
docker sandbox run <name> -- --dsp--dangerously-skip-permissions 的简写
docker sandbox network proxy <name>配置网络策略
docker sandbox network log <name>查看网络活动

认证

方式 1:API 密钥(推荐用于无头模式)

~/.bashrc~/.zshrc 中设置 ANTHROPIC_API_KEY。沙箱守护进程从这些文件读取,而非当前 shell 会话。更改后重启守护进程,沙箱重建后仍持久保存。

方式 2:交互式登录(每次会话)

未找到凭证时自动触发。在 Claude Code 中使用 /login 手动触发。沙箱销毁时认证不会持久保存。

支持的智能体

智能体提供商状态
Claude CodeAnthropic完全支持
Codex CLIOpenAI支持
Gemini CLIGoogle支持
cagentDocker支持
KiroAWS支持

限制

  • 仅支持 macOS 和 Windows 的 microVM 模式。Linux 使用基于容器的旧版沙箱(Docker Desktop 4.57+)。
  • 需要 Docker Desktop——标准 Docker Engine 不支持。社区替代方案如 dclaude(Patrick Debois)将 Claude Code 包装在标准 Docker 容器中,适用于仅有 Docker Engine 的环境,但使用容器隔离(非 microVM),且挂载主机 Docker socket——安全边界较弱。
  • 沙箱内尚不支持 MCP Gateway
  • 无 GPU 直通——不适用于 ML 训练工作负载。
  • 工作区同步是单向的:沙箱内的变更会传播到主机,但同时在主机上编辑可能产生冲突。

4. Claude Code 原生沙箱

来源code.claude.com/docs/en/sandboxing要求:macOS(内置)或 Linux/WSL2(bubblewrap + socat)功能:Claude Code v2.1.0+

Claude Code 内置原生沙箱,使用操作系统级原语进行进程级隔离。无需 Docker。

架构

Plain
┌──────────────────────────────────────────────────────┐
│                       主机                           │
│                                                      │
│  Claude Code(主进程)                               │
│       │                                              │
│       ├─ 派生 bash 命令                              │
│       │                                              │
│       ▼                                              │
│  沙箱包装器(Seatbelt/bubblewrap)                   │
│       │                                              │
│       ├─ 文件系统:读取全部,仅写入当前工作目录       │
│       ├─ 网络:SOCKS5 代理、域名过滤                 │
│       ├─ 进程:隔离环境                              │
│       │                                              │
│       ▼                                              │
│  命令在限制下执行                                    │
│       │                                              │
│       └─ 违规在操作系统级别被阻断                    │
│                                                      │
└──────────────────────────────────────────────────────┘

与 Docker 沙箱的关键区别

方面原生沙箱Docker 沙箱
隔离级别进程(Seatbelt/bubblewrap)microVM(虚拟机监控程序)
内核与主机共享每个沙箱独立内核
配置0 依赖(macOS),2 个包(Linux)Docker Desktop 4.58+
开销极小(约 1-3% CPU)中等(约 5-10% CPU,+200MB 内存)
Docker-in-Docker❌ 不支持✅ 独立 Docker 守护进程
使用场景日常开发、受信任代码不受信任代码、最高隔离性

操作系统原语

macOS:使用 Seatbelt(TrustedBSD 强制访问控制)

  • 内置,开箱即用
  • 内核级系统调用过滤

Linux/WSL2:使用 bubblewrap(Linux 命名空间 + seccomp)

  • 需要安装:sudo apt-get install bubblewrap socat
  • 为每个命令创建隔离命名空间

WSL1:❌ 不支持(bubblewrap 需要 WSL1 转换层中不可用的内核功能)

Windows 原生:⏳ 计划中(尚未可用)

快速开始

Bash
# 启用沙箱(交互菜单)
/sandbox

# 仅 Linux/WSL2:先安装依赖
sudo apt-get install bubblewrap socat  # Ubuntu/Debian
sudo dnf install bubblewrap socat      # Fedora

两种模式

  1. 自动允许模式:Bash 命令在沙箱内自动批准(推荐用于日常开发)
  2. 常规权限模式:所有命令需要审批(用于高安全性场景)

配置示例

JSON
{
  "sandbox": {
    "autoAllowMode": true,
    "network": {
      "policy": "deny",
      "allowedDomains": [
        "api.anthropic.com",
        "registry.npmjs.com",
        "github.com"
      ]
    }
  },
  "permissions": {
    "deny": [
      "Read(~/.ssh/**)", "Read(~/.aws/**)",
      "Edit(~/.ssh/**)", "Edit(~/.aws/**)"
    ]
  }
}

何时使用原生沙箱 vs Docker 沙箱

使用原生沙箱的场景

  • ✅ 受信任团队的日常开发
  • ✅ 轻量级配置(无 Docker Desktop)
  • ✅ 优先考虑低开销
  • ✅ 代码基本可信
  • ✅ 不需要 Docker-in-Docker

使用 Docker 沙箱的场景

  • ✅ 运行不受信任的代码
  • ✅ 最高安全隔离(防内核漏洞利用)
  • ✅ 需要沙箱内的独立 Docker 守护进程
  • ✅ 测试 AI 生成的脚本
  • ✅ 处理敏感工作负载的生产 CI/CD

决策树

Plain
日常开发?
├─ 受信任代码 + 团队 → 原生沙箱(轻量)
└─ 不受信任脚本 → Docker 沙箱(最高隔离性)

需要 Docker-in-Docker?
├─ 是 → Docker 沙箱(唯一选择)
└─ 否 → 两者均可,简单起见选原生沙箱

最高安全性?
├─ 是(防内核漏洞利用)→ Docker 沙箱
└─ 标准(进程隔离足够)→ 原生沙箱

安全局限性

⚠️ 原生沙箱局限性(详情参见 「guide/sandbox-native.md」):

  1. 共享内核:易受内核漏洞利用(Docker microVM 可防护)
  2. 域名前置:基于 CDN 的绕过可行(Cloudflare、Akamai)
  3. Unix 套接字:配置不当可能授予意外权限
  4. 文件系统:过于宽泛的写权限可能导致权限提升

对于不受信任的代码,Docker 沙箱提供更强的隔离性。

开源运行时

沙箱实现作为开源 npm 包提供:

Bash
# 直接使用沙箱运行时
npx @anthropic-ai/sandbox-runtime <要沙箱化的命>

# 示例:沙箱化一个 MCP 服务器
npx @anthropic-ai/sandbox-runtime node mcp-server.js

仓库github.com/anthropic-experimental/sandbox-runtime

深入了解

完整技术细节、配置示例、故障排除和安全分析:

「原生沙箱指南」

涵盖:操作系统原语、网络代理架构、沙箱模式、逃生舱、安全局限性、最佳实践。


5. 云端沙箱概览

Fly.io Sprites

来源sprites.dev

基于 Firecracker microVM 构建的硬件隔离执行环境,由 Fly.io 提供。

  • 隔离性:Firecracker microVM,完全硬件隔离
  • 持久性:完全可变的 ext4 文件系统,自动 100GB 分区
  • 检查点/恢复:约 300ms 实时检查点(写时复制),1 秒内恢复
  • HTTP 访问:每个 Sprite 独立 URL,按请求自动激活(冷启动 < 1 秒)
  • 网络:第 3 层出口策略,公有/私有切换
  • 资源:每个 Sprite 最多 8 个 CPU、16GB 内存
  • API:CLI(sprite 命令)、REST API、JavaScript 和 Go 客户端库
  • 定价:按使用量付费(CPU 0.07 美元/小时,内存 0.04 美元/GB/小时)。30 美元试用积分。

Cloudflare Sandbox SDK

来源developers.cloudflare.com/sandbox/

基于 Cloudflare Workers 平台构建的安全代码执行隔离容器。

  • 隔离性:Cloudflare 无服务器运行时上的容器(非 microVM)
  • 语言:Python、JavaScript/TypeScript、shell 命令
  • 持久性:R2 存储桶作为本地文件系统路径挂载
  • API:TypeScript SDK(getSandbox()exec()runCode()、文件操作、WebSocket)
  • 集成:Claude 生成代码,沙箱执行,结果以文本/可视化形式返回
  • 定价:需要 Workers 付费计划,基于容器平台定价。
  • 教程developers.cloudflare.com/sandbox/tutorials/claude-code/

Vercel 沙箱

来源vercel.com/docs/vercel-sandbox/

用于 AI 智能体和代码生成的临时 Linux microVM,2026-01-30 正式发布(GA)。

  • 隔离性:Firecracker microVM,与环境变量、数据库和云资源隔离
  • 性能:亚秒级初始化,任务完成后自动终止
  • 超时:默认 5 分钟,Hobby 最长 45 分钟,Pro/Enterprise 最长 5 小时
  • SDKSandboxCommandSnapshot 类。文件系统快照可加速重复运行。
  • 认证:Vercel OIDC 令牌(推荐)或外部 CI/CD 的访问令牌
  • 集成:与 Claude Agent SDK 配合,用于自主智能体任务

E2B

来源e2b.dev

用于 AI 智能体和大语言模型应用的开源沙箱平台。

  • 隔离性:Firecracker microVM(与 AWS Lambda 相同的技术)
  • 性能:约 150ms 冷启动,25ms 以内备用恢复
  • 自定义镜像:最大 10GB,2 秒内启动(Blueprints)
  • 快照:捕获和恢复完整虚拟机状态
  • 语言:Python、JavaScript、Ruby、C++,Linux 上任何语言。与大语言模型无关。
  • 集成:LangChain、LangGraph、LlamaIndex、Vercel/Next.js、Ollama
  • 部署:云托管、BYOC(AWS/GCP/Azure)、本地/VPC 自托管
  • 定价:免费层(100 美元积分,最长 1 小时),Pro 起价 150 美元/月(最长 24 小时)

Claude Code 原生沙箱模式

来源code.claude.com/docs/en/sandboxing

Claude Code 内置的进程级沙箱(「架构」中的第 4 层)。

  • 无外部依赖:开箱即用
  • 进程隔离:限制 Claude 可以执行的命令
  • 可配置:通过 settings 中的 allowedTools 配置
  • 局限性:非完整虚拟机隔离——与主机共享内核和文件系统

适用场景:Docker 不可用、轻量级隔离足够,或希望配合沙箱实现纵深防御。


6. 对比矩阵

标准Docker 沙箱原生 Claude CodeFly.io SpritesCloudflare SDKE2BVercel 沙箱
隔离级别microVM(虚拟机监控程序)进程(Seatbelt/bubblewrap)Firecracker microVM容器Firecracker microVMFirecracker microVM
内核隔离✅ 独立内核❌ 共享内核✅ 独立内核部分✅ 独立内核✅ 独立内核
本地运行否(云端)否(云端)否(云端)否(云端)
配置Docker Desktop 4.58+0 依赖(macOS),2 个包(Linux)API 密钥Workers 付费API 密钥SDK
Docker-in-Docker✅ 独立守护进程❌ 不支持支持不支持支持支持
网络控制允许/拒绝列表允许/拒绝列表(SOCKS5)第 3 层出口策略未详细说明未详细说明未详细说明
平台macOS、Windows(WSL2)macOS、Linux、WSL2任意(API)任意(Workers)任意(API/SDK)任意(SDK)
开销中等(约 5-10% CPU)极小(约 1-3% CPU)云端云端云端云端
免费层Docker Desktop免费30 美元积分Workers 付费100 美元积分是(有限)
最适合最高安全性,需要 Docker日常开发,受信任代码API 驱动智能体无服务器架构多框架Next.js/Vercel

7. 安全自主工作流

模式:Docker 沙箱 + --dangerously-skip-permissions

推荐的本地自主开发模式:

Bash
# 1. 为您的项目创建沙箱
docker sandbox create my-feature ~/my-project

# 2. 配置网络(可选,推荐用于安全)
docker sandbox network proxy my-feature \
  --policy deny \
  --allow-host api.anthropic.com \
  --allow-host "*.npmjs.org" \
  --allow-host github.com

# 3. 自主运行 Claude(在沙箱内安全)
docker sandbox run my-feature -- --dangerously-skip-permissions \
  "重构 auth 模块以使用 JWT。完成前运行所有测试。"

# 4. 在主机上审查变更(工作区自动同步)
cd ~/my-project && git diff

# 5. 如果满意则提交,否则丢弃或重新运行
git add -A && git commit -m "feat: JWT 认证(沙箱生成)"

模式:使用沙箱的 CI/CD 流水线

GitHub Actions 示例草图:

YAML
jobs:
  agent-task:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: 在 E2B 沙箱中运行 Claude
        uses: e2b-dev/e2b-github-action@v1
        with:
          api-key: ${{ secrets.E2B_API_KEY }}
          command: |
            claude --dangerously-skip-permissions \
              -p "运行完整测试套件并修复任何失败"

对于 CI/CD,云端沙箱(E2B、Vercel、Sprites)通常比 Docker 沙箱更好,因为它们不需要 Docker Desktop。


8. 反模式

反模式危险原因应该怎么做
无沙箱使用 --dangerously-skip-permissions智能体对主机文件系统、网络和 Docker 有不受限制的访问使用沙箱作为安全边界
假设容器 = 虚拟机容器共享主机内核,容器逃逸会暴露主机对强隔离使用基于 microVM 的方案(Docker 沙箱、E2B、Sprites)
将整个文件系统挂载到沙箱破坏隔离目的,智能体可访问凭证、SSH 密钥等仅挂载项目工作区目录
在网络策略中允许 *智能体可以向任何端点外泄数据使用拒绝列表模式并明确指定允许项
沙箱运行后跳过 git diff 审查自主智能体可能做出意外变更提交沙箱生成的代码前始终审查差异
以沙箱为借口跳过代码审查隔离保护主机,不保证代码质量沙箱 + 代码审查是互补的,不是替代关系

另见


来源:飞书 · AI Spark 知识库 | 原文(最新版):https://lcnniolukk80.feishu.cn/wiki/Lc4pwYz8IicDxekMTIhcm03fnhd | 归档:2026-06-04