- 启用沙箱并选择沙箱化命令的批准方式
- 配置命令可以到达的路径和网络域
- 将沙箱与权限规则和权限模式结合
- 在整个组织中强制执行沙箱使用托管设置
要比较其他隔离方法,如开发容器、自定义容器和虚拟机,请参阅 Sandbox environments。要减少 Bash 以外工具的权限提示,请参阅 permission modes。
入门
沙箱内置于 Claude Code 中,在 macOS、Linux 和 WSL2 上运行。不支持原生 Windows。在 Windows 上,在 WSL2 发行版内运行 Claude Code。 在 macOS 上,无需安装任何内容:沙箱使用内置的 Seatbelt 框架。在 Linux 和 WSL2 上,沙箱依赖两个包,详见 Set up Linux and WSL2。即使你还没有安装它们,你也可以从/sandbox 开始,因为它的面板显示是否缺少任何内容。
运行 /sandbox
启动 Claude Code 会话并运行 这会打开沙箱面板,有三个选项卡:
/sandbox 命令:- Mode:选择沙箱化命令的批准方式,在下一步中介绍
- Overrides:选择在沙箱下失败的命令是否可以回退到运行非沙箱化。这是
allowUnsandboxedCommands设置 - Config:查看已解析的沙箱设置
/sandbox。选择一个模式
在 Mode 选项卡上,选择自动允许或常规权限。自动允许在不提示的情况下运行沙箱化命令,常规权限即使在命令沙箱化时也保持常规权限提示。有关在自动允许模式下仍会提示哪些命令,请参阅 Sandbox modes。
运行 Bash 命令
要求 Claude 运行一个命令,例如构建或测试套件。默认情况下,沙箱内的命令只能写入工作目录。命令第一次需要新的网络域时,Claude Code 会提示批准。无法沙箱化运行的命令会回退到常规权限流程。要扩大或缩小这些边界,请参阅 Configure sandboxing。
.claude/settings.local.json,这些设置适用于当前项目,不会检入 git。要在所有项目中启用沙箱,请在 ~/.claude/settings.json 的用户设置中将 sandbox.enabled 设置为 true。要为组织中的每个开发者强制执行沙箱,请使用 managed settings。
设置 Linux 和 WSL2
在 Linux 和 WSL2 上,沙箱依赖两个包:bubblewrap:无特权沙箱工具,强制执行文件系统隔离socat:用于通过沙箱代理路由网络流量的中继
- Ubuntu/Debian
- Fedora
/sandbox 中的 Dependencies 选项卡显示 ripgrep、bubblewrap、socat 和 seccomp 过滤器是否在你的平台上可用。Ripgrep 与原生 Claude Code 二进制文件捆绑在一起。seccomp 过滤器是可选的,添加 Unix 域套接字阻止。如果缺少,请使用 npm install -g @anthropic-ai/sandbox-runtime 安装它。
当缺少必需的依赖项时,Dependencies 选项卡是唯一显示的选项卡,直到你安装它。依赖项检查在启动时运行,因此在安装包后重启 Claude Code,以便 /sandbox 检测到它们。
Ubuntu 24.04 及更高版本:允许 bubblewrap 创建用户命名空间
Ubuntu 24.04 及更高版本:允许 bubblewrap 创建用户命名空间
在 Ubuntu 24.04 及更高版本上,默认 AppArmor 策略阻止 bubblewrap 创建隔离所需的用户命名空间。要检查你的环境(包括 WSL2 内)是否强制执行此限制,请运行 该配置文件仅适用于
sysctl kernel.apparmor_restrict_unprivileged_userns。如果密钥不存在或返回 0,请跳过此步骤。如果返回 1,请添加一个 AppArmor 配置文件,授予 bwrap 此功能:bwrap 本身,不适用于在沙箱内运行的命令。重新加载 AppArmor 以应用它:WSL2 注意事项
WSL2 注意事项
使用 PowerShell 中的
wsl -l -v 检查你的 WSL 版本。如果你看到 Sandboxing requires WSL2,你的发行版运行的是 WSL1。将其升级到 WSL2 或在没有沙箱的情况下运行 Claude Code。在 WSL2 上,沙箱化命令无法启动 Windows 二进制文件,例如 cmd.exe、powershell.exe 或 /mnt/c/ 下的任何内容。WSL 通过 Unix 套接字将这些交给 Windows 主机,沙箱会阻止这些。如果命令需要调用 Windows 二进制文件,请将其添加到 excludedCommands,以便它在沙箱外运行。沙箱模式
Claude Code 提供两种沙箱模式: 自动允许模式:Bash 命令将尝试在沙箱内运行,并自动允许而无需权限。无法沙箱化的命令(例如需要访问非允许主机的网络访问的命令)会回退到常规权限流程,其中 Claude Code 检查你的 permission rules 并为这些规则不允许的任何命令提示你。 即使在自动允许模式下,以下仍然适用:- 显式 deny rules 始终被尊重
- 针对
/、你的主目录或其他关键系统路径的rm或rmdir命令仍会触发权限提示 - Ask rules 适用于回退到常规权限流程的命令
dangerouslyDisableSandbox 参数重试命令。重试的命令在沙箱外运行,因此它通过常规权限流程进行,需要你的批准。
你可以通过在 sandbox settings 中设置 "allowUnsandboxedCommands": false 来禁用此逃生舱。禁用时,/sandbox Overrides 选项卡显示为 Strict sandbox mode,dangerouslyDisableSandbox 参数被完全忽略,所有命令必须沙箱化运行或在 excludedCommands 中明确列出。
自动允许模式独立于你的权限模式设置工作。即使你不在”接受编辑”模式中,启用自动允许时沙箱化的 Bash 命令也会自动运行。这意味着在沙箱边界内修改文件的 Bash 命令将执行而不提示,即使文件编辑工具通常需要批准。
配置沙箱
通过settings.json 文件自定义沙箱行为。有关完整的配置参考,请参阅 Settings。
默认情况下,沙箱化命令只能写入当前工作目录。如果子进程命令(如 kubectl、terraform 或 npm)需要在项目目录外写入,请使用 sandbox.filesystem.allowWrite 向特定路径授予访问权限:
excludedCommands 将工具从沙箱中排除。
当在多个 settings scopes 中定义相同的文件系统数组时,数组被合并:来自每个范围的路径被组合,而不是替换。
路径前缀控制路径的解析方式:
| 前缀 | 含义 | 示例 |
|---|---|---|
/ | 从文件系统根目录的绝对路径 | /tmp/build 保持 /tmp/build |
~/ | 相对于主目录 | ~/.kube 变为 $HOME/.kube |
./ 或无前缀 | 对于项目设置相对于项目根目录,或对于用户设置相对于 ~/.claude | .claude/settings.json 中的 ./output 解析为 <project-root>/output |
//path 表示绝对路径,/path 表示项目相对路径。沙箱文件系统路径使用标准约定:/tmp/build 是绝对路径。
你也可以使用 sandbox.filesystem.denyWrite 和 sandbox.filesystem.denyRead 拒绝写入或读取访问,以及使用 sandbox.filesystem.allowRead 重新允许被拒绝区域内的特定路径。
下面的示例阻止从整个主目录读取,同时仍允许从当前项目读取。将其放在你的项目的 .claude/settings.json 中,因为相对路径 . 仅在配置位于项目设置中时才解析为项目根目录:
allowRead 中的 . 解析为项目根目录,因为此配置位于项目设置中。如果你将相同的配置放在 ~/.claude/settings.json 中,. 将解析为 ~/.claude,项目文件将保持被 denyRead 规则阻止。
沙箱如何工作
文件系统隔离
沙箱化 Bash 工具将文件系统访问限制在特定目录:- 默认写入行为:对当前工作目录及其子目录的读写访问
- 默认读取行为:对整个计算机的读取访问,除了某些被拒绝的目录。注意此默认仍允许读取凭证文件,例如
~/.aws/credentials和~/.ssh/。将它们添加到denyRead以阻止它们。 - 被阻止的访问:无法在没有明确权限的情况下修改当前工作目录外的文件,包括 shell 配置文件(例如
~/.bashrc)和/bin/中的系统二进制文件 - Git worktrees:当工作目录是链接的 git worktree 时,沙箱还允许写入主存储库的共享
.git目录,以便git commit等命令可以更新引用和索引。对该目录内的hooks/和config的写入仍然被拒绝。 - 可配置:通过设置定义自定义允许和拒绝的路径
sandbox.filesystem.allowWrite 向其他路径授予写入访问权限。这些限制在操作系统级别强制执行,因此它们适用于所有子进程命令,包括 kubectl、terraform 和 npm 等工具,而不仅仅是 Claude 的文件工具。
网络隔离
网络访问通过在沙箱外运行的代理服务器进行控制:- 域名限制:没有预先允许的域名。命令第一次需要新的域名时,Claude Code 会提示批准。使用
allowedDomains预先允许域名以避免提示。 - 托管锁定:如果在托管设置中设置了
allowManagedDomainsOnly,非允许的域名会自动被阻止而不是提示,只有来自托管设置的allowedDomains被尊重。 - 自定义代理支持:高级用户可以在出站流量上实现自定义规则
- 全面覆盖:限制适用于所有脚本、程序和由命令生成的子进程
内置代理基于请求的主机名强制执行允许列表,不会终止或检查 TLS 流量。有关此设计的含义,请参阅 Security limitations,如果你的威胁模型需要 TLS 检查,请参阅 Custom proxy configuration。
操作系统级强制执行
沙箱化 Bash 工具利用操作系统安全原语:- macOS:使用 Seatbelt 进行沙箱强制执行
- Linux:使用 bubblewrap 进行隔离
- WSL2:使用 bubblewrap,与 Linux 相同
@anthropic-ai/sandbox-runtime 包提供,Sandbox environments 页面将其作为包装整个 Claude Code 进程的单独方法进行介绍。
沙箱如何与权限和权限模式相关
沙箱、permission rules 和 permission modes 是互补的层。下面的部分介绍沙箱如何与每个交互。权限规则
权限规则和沙箱控制不同的事物:- 权限规则控制 Claude Code 可以使用哪些工具,在任何工具运行之前进行评估。它们适用于所有工具:Bash、Read、Edit、WebFetch、MCP 和其他工具。
- 沙箱提供操作系统级强制执行,限制 Bash 命令在文件系统和网络级别可以访问的内容。它仅适用于 Bash 命令及其子进程。
| 设置或规则 | 它做什么 |
|---|---|
sandbox.filesystem.allowWrite | 向工作目录外的路径授予子进程写入访问权限 |
sandbox.filesystem.denyWrite 和 sandbox.filesystem.denyRead | 阻止子进程访问特定路径 |
sandbox.filesystem.allowRead | 重新允许读取被 denyRead 区域内的特定路径 |
Edit 允许规则 | 授予对特定路径的写入访问权限,与 sandbox.filesystem.allowWrite 相同 |
Read 和 Edit 拒绝规则 | 阻止访问特定文件或目录 |
WebFetch 允许和拒绝规则 | 控制域名访问 |
沙箱 allowedDomains | 控制 Bash 命令可以到达的域名 |
沙箱 deniedDomains | 阻止特定域名,即使更广泛的 allowedDomains 通配符会允许它们 |
sandbox.filesystem 设置和权限规则的路径被合并到最终沙箱配置中。
claude-code repository 的示例目录包括常见部署场景的启动设置配置,包括沙箱特定的示例。使用这些作为起点,并根据你的需求调整它们。
权限模式
/sandbox 不是 permission mode。权限模式决定工具调用是否运行以及是否首先提示你,而沙箱限制 Bash 命令运行后可以访问的内容。它们在控制的内容和替换每个操作提示的内容上有所不同:
| 它控制什么 | 替换提示的内容 | |
|---|---|---|
/sandbox | Bash 命令运行后可以访问的内容 | 沙箱边界本身,在 auto-allow mode 中 |
| Auto mode | 每个工具调用是否运行 | 审查操作的分类器 |
--dangerously-skip-permissions | 每个工具调用是否运行 | 无。Protected path 检查也被跳过;仅删除 / 或你的主目录仍会提示 |
为你的组织配置沙箱
管理员可以为每个用户要求沙箱,防止开发者扩大策略,并通过公司代理路由沙箱流量。使用托管设置强制执行沙箱
要为每个开发者要求沙箱,通过 managed settings 提供sandbox 密钥,可以是由你的 MDM 管理的文件,也可以是通过 Claude.ai 上的 server-managed settings。
以下托管设置配置启用沙箱,如果沙箱无法初始化则拒绝启动 Claude Code,并防止模型在沙箱外重试命令:
enabled 的两个密钥控制沙箱无法运行命令时会发生什么:
failIfUnavailable:缺少的依赖项(例如 Linux 上的 bubblewrap)会阻止 Claude Code 启动,而不是显示警告并回退到非沙箱化执行allowUnsandboxedCommands: false:dangerouslyDisableSandbox逃生舱被忽略,因此在沙箱下失败的命令无法在其外重试
excludedCommands。为凭证目录(例如 ~/.aws 和 ~/.ssh)添加 denyRead 条目,默认读取策略仍允许这些。
沙箱不在原生 Windows 上运行,因此如果你的队伍包括 Windows 主机,请将此配置的范围限制在 macOS 和 Linux,或让这些用户在 WSL2 或容器内运行 Claude Code。
防止开发者扩大策略
对于布尔密钥(例如enabled 和 failIfUnavailable),Claude Code 使用托管值并忽略开发者在本地设置的任何内容。对于数组密钥(例如 excludedCommands 和 allowRead),Claude Code 合并来自每个范围的条目,因此开发者可以追加扩大策略的条目。
在托管设置中将 allowManagedReadPathsOnly 设置为 true,以便仅尊重来自托管设置的 allowRead 条目。用户、项目和本地 allowRead 条目被忽略。这防止开发者扩大读取访问权限超过组织批准的路径。要以相同的方式将网络域锁定到托管值,请设置 allowManagedDomainsOnly。
excludedCommands 没有等效的仅托管锁定,因此开发者总是可以追加在沙箱外运行其他命令的条目。保持托管列表狭窄。
自定义代理配置
对于需要高级网络安全的组织,你可以实现自定义代理以:- 解密和检查 HTTPS 流量
- 应用自定义过滤规则
- 记录所有网络请求
- 与现有安全基础设施集成
故障排除
某些命令在沙箱内失败,即使它们在沙箱外工作。下面的修复涵盖最常见的情况。- 命令因主机不允许错误而失败:许多 CLI 工具需要到达特定的主机。在提示时授予权限会将主机添加到你的允许列表,以便该工具在将来在沙箱内运行。
jest挂起或失败:watchman与沙箱不兼容。改为运行jest --no-watchman。- Go 基础 CLI 在 macOS 上 TLS 验证失败:
gh、gcloud和terraform等工具在 Seatbelt 下可能无法进行 TLS 验证。在excludedCommands中列出这些工具以在沙箱外运行它们。如果你使用httpProxyPort与 MITM 代理和自定义 CA,请改为将enableWeakerNetworkIsolation设置为true。 docker命令失败:docker与沙箱不兼容。将docker *添加到excludedCommands以在沙箱外运行它。- Bubblewrap 在容器内启动失败:在无特权容器中,bubblewrap 无法挂载新的
/proc文件系统。将enableWeakerNestedSandbox设置为true,以便内部沙箱绑定挂载容器的现有/proc。仅在外部容器已提供你需要的隔离边界时使用此设置,因为它向沙箱化命令公开进程信息,而新的/proc挂载会隐藏这些信息。 - Linux 上的 Seccomp 过滤器:seccomp 过滤器需要阻止 Unix 域套接字。
/sandbox中的 Dependencies 选项卡显示它是否可用。如果缺少,请运行npm install -g @anthropic-ai/sandbox-runtime以安装助手。 --dangerously-skip-permissions以 root 身份失败:当在 Linux 和 macOS 上以 root 身份或通过 sudo 运行时,此标志被阻止,因为 root 访问加上没有权限提示可以修改系统上的任何文件或服务。检查在识别的沙箱内自动跳过。要在容器中自主运行,请使用 dev container 配置,它以非 root 用户身份运行 Claude Code。
限制
沙箱降低风险,但不是完整的隔离边界。在依赖它作为硬安全控制之前,请查看下面的限制。安全限制
- 网络过滤:网络过滤系统通过限制进程允许连接的域来运行。内置代理不会终止或对出站流量执行 TLS 检查,因此不会检查加密连接的内容。你负责确保只有受信任的域在你的策略中被允许。
- 通过 Unix 套接字的权限提升:
allowUnixSockets配置可能会无意中授予对可能导致沙箱绕过的强大系统服务的访问权限。例如,允许访问/var/run/docker.sock有效地通过 Docker 套接字授予对主机系统的访问权限。仔细考虑你通过沙箱允许的任何 Unix 套接字。 - 文件系统权限提升:过于宽泛的文件系统写入权限可能导致权限提升攻击。允许写入包含
$PATH中的可执行文件、系统配置目录或用户 shell 配置文件(例如.bashrc或.zshrc)的目录可能导致当其他用户或系统进程访问这些文件时在不同的安全上下文中执行代码。 - Linux 沙箱强度:Linux 实现提供强大的文件系统和网络隔离,但包括一个
enableWeakerNestedSandbox模式,使其能够在 Docker 环境中工作而无需特权命名空间,或在禁用无特权用户命名空间的 Linux 主机上。此选项大大削弱了安全性,应仅在其他隔离被强制执行时使用。 - 设置文件受保护:沙箱自动拒绝对 Claude Code 的
settings.json文件在每个范围和托管设置目录的写入访问,因此沙箱化命令无法修改其自己的策略。
平台和工具兼容性
- 平台支持:支持 macOS、Linux 和 WSL2。不支持 WSL1 和原生 Windows。
- 性能开销:最小,但某些文件系统操作可能稍慢。
- 工具兼容性:某些需要特定系统访问模式的工具可能需要配置调整,或可能需要在沙箱外运行。
范围
沙箱隔离 Bash 子进程。其他工具在不同的边界下运行:- 内置文件工具:Read、Edit 和 Write 直接使用权限系统,而不是通过沙箱运行。请参阅 permissions。
- 计算机使用:当 Claude 打开应用程序并控制你的屏幕时,它在你的实际桌面上运行,而不是在隔离的环境中。每个应用程序的权限提示控制每个应用程序。请参阅 CLI 中的计算机使用 或 Desktop 中的计算机使用。
- 环境变量:沙箱化 Bash 命令默认继承父进程环境,包括在那里设置的任何凭证。要从子进程中删除 Anthropic 和云提供商凭证,请设置
CLAUDE_CODE_SUBPROCESS_ENV_SCRUB。 - 子代理:subagents 在与父会话相同的进程中运行,并使用相同的沙箱配置。当在父会话中启用沙箱时,子代理内的 Bash 命令被沙箱化。
另请参阅
- Sandbox environments:比较内置沙箱与开发容器、容器和虚拟机
- Security:全面的安全功能和最佳实践
- Permissions:权限配置和访问控制
- Settings:完整的配置参考
- CLI reference:命令行选项