2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt2> Fetch the complete documentation index at: https://code.claude.com/docs/llms.txt
3> Use this file to discover all available pages before exploring further.3> Use this file to discover all available pages before exploring further.
4 4
5# Sandboxing5# 配置沙箱化 Bash 工具
6 6
7> 了解 Claude Code 的沙箱 bash 工具如何提供文件系统和网络隔离,以实现更安全、更自主的代理执行。7> 了解 Claude Code 的沙箱化 Bash 工具如何提供文件系统和网络隔离,以实现更安全、更自主的代理执行。
8 8
9## 概述9Bash 沙箱让 Claude 可以运行大多数 shell 命令,而无需停下来请求权限。与其批准每个命令不同,你定义命令可以接触哪些文件和网络域,操作系统为每个 Bash 命令及其子进程强制执行该边界。
10 10
11Claude Code 具有原生沙箱功能,为代理执行提供更安全的环境,同时减少了对持续权限提示的需求。Claude Code 不是要求对每个 bash 命令进行权限批准,而是预先创建定义的边界,使 Claude Code 能够以降低的风险更自由地工作。11本页涵盖如何:
12 12
13沙箱 bash 工具使用操作系统级原语来强制执行文件系统和网络隔离。13* [启用沙箱](#get-started)并选择沙箱化命令的批准方式
14* [配置](#configure-sandboxing)命令可以到达的路径和网络域
15* [将沙箱与权限规则和权限模式结合](#how-sandboxing-relates-to-permissions-and-permission-modes)
16* [在整个组织中强制执行沙箱](#configure-the-sandbox-for-your-organization)使用托管设置
14 17
15## 为什么沙箱很重要18<Note>
16 19 要比较其他隔离方法,如开发容器、自定义容器和虚拟机,请参阅 [Sandbox environments](/zh-CN/sandbox-environments)。要减少 Bash 以外工具的权限提示,请参阅 [permission modes](/zh-CN/permission-modes)。
17传统的基于权限的安全性需要对 bash 命令进行持续的用户批准。虽然这提供了控制,但可能导致:20</Note>
18
19* **批准疲劳**:重复点击"批准"可能导致用户对他们批准的内容关注度降低
20* **生产力降低**:持续的中断会减慢开发工作流程
21* **自主性受限**:当等待批准时,Claude Code 无法高效工作
22
23沙箱通过以下方式解决这些挑战:
24
251. **定义清晰的边界**:精确指定 Claude Code 可以访问的目录和网络主机
262. **减少权限提示**:沙箱内的安全命令不需要批准
273. **维护安全性**:尝试访问沙箱外的资源会触发立即通知
284. **启用自主性**:Claude Code 可以在定义的限制内更独立地运行
29
30<Warning>
31 有效的沙箱需要**同时**进行文件系统和网络隔离。没有网络隔离,被破坏的代理可能会泄露敏感文件,如 SSH 密钥。没有文件系统隔离,被破坏的代理可能会后门系统资源以获得网络访问权限。配置沙箱时,重要的是确保配置的设置不会在这些系统中创建绕过。
32</Warning>
33 21
34## 工作原理22<h2 id="get-started">
23 入门
24</h2>
35 25
36### 文件系统隔离26沙箱内置于 Claude Code 中,在 macOS、Linux 和 WSL2 上运行。不支持原生 Windows。在 Windows 上,在 WSL2 发行版内运行 Claude Code。
37 27
38沙箱 bash 工具将文件系统访问限制在特定目录:28在 macOS 上,无需安装任何内容:沙箱使用内置的 Seatbelt 框架。在 Linux 和 WSL2 上,沙箱依赖两个包,详见 [Set up Linux and WSL2](#set-up-linux-and-wsl2)。即使你还没有安装它们,你也可以从 `/sandbox` 开始,因为它的面板显示是否缺少任何内容。
39 29
40* **默认写入行为**:对当前工作目录及其子目录的读写访问30<Steps>
41* **默认读取行为**:对整个计算机的读取访问,除了某些被拒绝的目录31 <Step title="运行 /sandbox">
42* **被阻止的访问**:无法在没有明确权限的情况下修改当前工作目录外的文件32 启动 Claude Code 会话并运行 `/sandbox` 命令:
43* **可配置**:通过设置定义自定义允许和拒绝的路径
44 33
45您可以使用设置中的 `sandbox.filesystem.allowWrite` 向其他路径授予写入访问权限。这些限制在操作系统级别强制执行(macOS 上的 Seatbelt,Linux 上的 bubblewrap),因此它们适用于所有子进程命令,包括 `kubectl`、`terraform` 和 `npm` 等工具,而不仅仅是 Claude 的文件工具。34 ```text theme={null}
35 /sandbox
36 ```
46 37
47### 网络隔离38 这会打开沙箱面板,有三个选项卡:
48 39
49网络访问通过在沙箱外运行的代理服务器进行控制:40 * **Mode**:选择沙箱化命令的批准方式,在下一步中介绍
41 * **Overrides**:选择在沙箱下失败的命令是否可以回退到运行非沙箱化。这是 [`allowUnsandboxedCommands`](/zh-CN/settings#sandbox-settings) 设置
42 * **Config**:查看已解析的沙箱设置
50 43
51* **域名限制**:只能访问批准的域名44 如果面板仅显示 Dependencies 选项卡,则缺少必需的包。按照 [Set up Linux and WSL2](#set-up-linux-and-wsl2) 中的说明安装它,重启 Claude Code,然后再次运行 `/sandbox`。
52* **用户确认**:新的域名请求会触发权限提示(除非启用了 [`allowManagedDomainsOnly`](/zh-CN/settings#sandbox-settings),它会自动阻止非允许的域名)45 </Step>
53* **自定义代理支持**:高级用户可以在出站流量上实现自定义规则
54* **全面覆盖**:限制适用于所有脚本、程序和由命令生成的子进程
55 46
56### 操作系统级强制执行47 <Step title="选择一个模式">
48 在 Mode 选项卡上,选择自动允许或常规权限。自动允许在不提示的情况下运行沙箱化命令,常规权限即使在命令沙箱化时也保持常规权限提示。有关在自动允许模式下仍会提示哪些命令,请参阅 [Sandbox modes](#sandbox-modes)。
49 </Step>
57 50
58沙箱 bash 工具利用操作系统安全原语:51 <Step title="运行 Bash 命令">
52 要求 Claude 运行一个命令,例如构建或测试套件。默认情况下,沙箱内的命令只能写入工作目录。命令第一次需要新的网络域时,Claude Code 会提示批准。
59 53
60* **macOS**:使用 Seatbelt 进行沙箱强制执行54 无法沙箱化运行的命令会回退到常规权限流程。要扩大或缩小这些边界,请参阅 [Configure sandboxing](#configure-sandboxing)。
61* **Linux**:使用 [bubblewrap](https://github.com/containers/bubblewrap) 进行隔离55 </Step>
62* **WSL2**:使用 bubblewrap,与 Linux 相同56</Steps>
63 57
64不支持 WSL1,因为 bubblewrap 需要仅在 WSL2 中可用的内核功能。58在面板中选择一个模式会写入你的项目的本地设置 `.claude/settings.local.json`,这些设置适用于当前项目,不会检入 git。要在所有项目中启用沙箱,请在 `~/.claude/settings.json` 的用户设置中将 [`sandbox.enabled`](/zh-CN/settings#sandbox-settings) 设置为 `true`。要为组织中的每个开发者强制执行沙箱,请使用 [managed settings](#enforce-sandboxing-with-managed-settings)。
65 59
66这些操作系统级限制确保由 Claude Code 命令生成的所有子进程都继承相同的安全边界。60<Warning>
61 默认情况下,如果沙箱因缺少依赖项或不支持的平台而无法启动,Claude Code 会显示警告并在没有沙箱的情况下运行命令。要使其成为硬失败,请将 [`sandbox.failIfUnavailable`](/zh-CN/settings#sandbox-settings) 设置为 `true`。这适用于需要沙箱作为安全门的托管部署。
62</Warning>
67 63
68## 入门64<h3 id="set-up-linux-and-wsl2">
65 设置 Linux 和 WSL2
66</h3>
69 67
70### 前置条件68在 Linux 和 WSL2 上,沙箱依赖两个包:
71 69
72在 **macOS** 上,沙箱使用内置的 Seatbelt 框架开箱即用。70* [`bubblewrap`](https://github.com/containers/bubblewrap):无特权沙箱工具,强制执行文件系统隔离
71* [`socat`](http://www.dest-unreach.org/socat/):用于通过沙箱代理路由网络流量的中继
73 72
74在 **Linux 和 WSL2** 上,首先安装所需的包:73使用你的发行版的包管理器安装它们:
75 74
76<Tabs>75<Tabs>
77 <Tab title="Ubuntu/Debian">76 <Tab title="Ubuntu/Debian">
87 </Tab>86 </Tab>
88</Tabs>87</Tabs>
89 88
90WSL1 不支持沙箱,因为它缺少所需的 Linux 命名空间原语。如果您看到 `Sandboxing requires WSL2`,请将您的发行版升级到 WSL2 或在没有沙箱的情况下运行 Claude Code。89安装后,`/sandbox` 中的 Dependencies 选项卡显示 `ripgrep`、`bubblewrap`、`socat` 和 seccomp 过滤器是否在你的平台上可用。Ripgrep 与原生 Claude Code 二进制文件捆绑在一起。seccomp 过滤器是可选的,添加 Unix 域套接字阻止。如果缺少,请使用 `npm install -g @anthropic-ai/sandbox-runtime` 安装它。
91 90
92在 WSL2 上,沙箱化命令无法启动 Windows 二进制文件,例如 `cmd.exe`、`powershell.exe` 或 `/mnt/c/` 下的任何内容。WSL 通过 Unix 套接字将这些交给 Windows 主机,沙箱会阻止这些。如果命令需要调用 Windows 二进制文件,请将其添加到 [`excludedCommands`](/zh-CN/settings#sandbox-settings),以便它在沙箱外运行。91当缺少必需的依赖项时,Dependencies 选项卡是唯一显示的选项卡,直到你安装它。依赖项检查在启动时运行,因此在安装包后重启 Claude Code,以便 `/sandbox` 检测到它们。
93 92
94### 启用沙箱93<AccordionGroup>
94 <Accordion title="Ubuntu 24.04 及更高版本:允许 bubblewrap 创建用户命名空间">
95 在 Ubuntu 24.04 及更高版本上,默认 AppArmor 策略阻止 bubblewrap 创建隔离所需的用户命名空间。
95 96
96您可以通过运行 `/sandbox` 命令来启用沙箱:97 要检查你的环境(包括 WSL2 内)是否强制执行此限制,请运行 `sysctl kernel.apparmor_restrict_unprivileged_userns`。如果密钥不存在或返回 `0`,请跳过此步骤。如果返回 `1`,请添加一个 AppArmor 配置文件,授予 `bwrap` 此功能:
97 98
98```text theme={null}99 ```bash theme={null}
99/sandbox100 sudo tee /etc/apparmor.d/bwrap > /dev/null <<'EOF'
100```101 abi <abi/4.0>,
102 include <tunables/global>
103
104 profile bwrap /usr/bin/bwrap flags=(unconfined) {
105 userns,
106 include if exists <local/bwrap>
107 }
108 EOF
109 ```
101 110
102这会打开一个菜单,您可以在其中选择沙箱模式。如果缺少所需的依赖项(例如 Linux 上的 `bubblewrap` 或 `socat`),菜单会显示您平台的安装说明。111 该配置文件仅适用于 `bwrap` 本身,不适用于在沙箱内运行的命令。重新加载 AppArmor 以应用它:
103 112
104默认情况下,如果沙箱无法启动(缺少依赖项或不支持的平台),Claude Code 会显示警告并在没有沙箱的情况下运行命令。要使其成为硬失败,请将 [`sandbox.failIfUnavailable`](/zh-CN/settings#sandbox-settings) 设置为 `true`。这适用于需要沙箱作为安全门的托管部署。113 ```bash theme={null}
114 sudo systemctl reload apparmor
115 ```
116 </Accordion>
117
118 <Accordion title="WSL2 注意事项">
119 使用 PowerShell 中的 `wsl -l -v` 检查你的 WSL 版本。如果你看到 `Sandboxing requires WSL2`,你的发行版运行的是 WSL1。将其升级到 WSL2 或在没有沙箱的情况下运行 Claude Code。
105 120
106### 沙箱模式121 在 WSL2 上,沙箱化命令无法启动 Windows 二进制文件,例如 `cmd.exe`、`powershell.exe` 或 `/mnt/c/` 下的任何内容。WSL 通过 Unix 套接字将这些交给 Windows 主机,沙箱会阻止这些。如果命令需要调用 Windows 二进制文件,请将其添加到 [`excludedCommands`](/zh-CN/settings#sandbox-settings),以便它在沙箱外运行。
122 </Accordion>
123</AccordionGroup>
124
125<h3 id="sandbox-modes">
126 沙箱模式
127</h3>
107 128
108Claude Code 提供两种沙箱模式:129Claude Code 提供两种沙箱模式:
109 130
110**自动允许模式**:Bash 命令将尝试在沙箱内运行,并自动允许而无需权限。无法沙箱化的命令(例如需要访问非允许主机的网络访问的命令)会回退到常规权限流程。显式拒绝规则始终被尊重,针对 `/`、您的主目录或其他关键系统路径的 `rm` 或 `rmdir` 命令仍会触发权限提示。询问规则仅适用于回退到常规权限流程的命令。131**自动允许模式**:Bash 命令将尝试在沙箱内运行,并自动允许而无需权限。无法沙箱化的命令(例如需要访问非允许主机的网络访问的命令)会回退到常规权限流程,其中 Claude Code 检查你的 [permission rules](/zh-CN/permissions) 并为这些规则不允许的任何命令提示你。
132
133即使在自动允许模式下,以下仍然适用:
111 134
112**常规权限模式**:所有 bash 命令都通过标准权限流程,即使是沙箱化的。这提供了更多控制,但需要更多批准。135* 显式 [deny rules](/zh-CN/permissions) 始终被尊重
136* 针对 `/`、你的主目录或其他关键系统路径的 `rm` 或 `rmdir` 命令仍会触发权限提示
137* [Ask rules](/zh-CN/permissions) 适用于回退到常规权限流程的命令
138
139**常规权限模式**:所有 Bash 命令都通过常规权限流程,即使沙箱化也是如此。这提供了更多控制,但需要更多批准。
113 140
114在两种模式中,沙箱都强制执行相同的文件系统和网络限制。区别仅在于沙箱化命令是自动批准还是需要明确权限。141在两种模式中,沙箱都强制执行相同的文件系统和网络限制。区别仅在于沙箱化命令是自动批准还是需要明确权限。
115 142
143某些命令根本无法在沙箱内运行,例如与其不兼容的工具或需要你未允许的主机的工具。与其让任务失败或要求你关闭沙箱,Claude Code 包括一个逃生舱:当命令因沙箱限制而失败时,Claude 分析失败,可能使用 `dangerouslyDisableSandbox` 参数重试命令。重试的命令在沙箱外运行,因此它通过常规权限流程进行,需要你的批准。
144
145你可以通过在 [sandbox settings](/zh-CN/settings#sandbox-settings) 中设置 `"allowUnsandboxedCommands": false` 来禁用此逃生舱。禁用时,`/sandbox` Overrides 选项卡显示为 **Strict sandbox mode**,`dangerouslyDisableSandbox` 参数被完全忽略,所有命令必须沙箱化运行或在 `excludedCommands` 中明确列出。
146
116<Info>147<Info>
117 自动允许模式独立于您的权限模式设置工作。即使您不在"接受编辑"模式中,启用自动允许时沙箱化的 bash 命令也会自动运行。这意味着在沙箱边界内修改文件的 bash 命令将执行而不提示,即使文件编辑工具通常需要批准。148 自动允许模式独立于你的权限模式设置工作。即使你不在"接受编辑"模式中,启用自动允许时沙箱化的 Bash 命令也会自动运行。这意味着在沙箱边界内修改文件的 Bash 命令将执行而不提示,即使文件编辑工具通常需要批准。
118</Info>149</Info>
119 150
120### 配置沙箱151<h2 id="configure-sandboxing">
152 配置沙箱
153</h2>
121 154
122通过 `settings.json` 文件自定义沙箱行为。有关完整的配置参考,请参阅 [Settings](/zh-CN/settings#sandbox-settings)。155通过 `settings.json` 文件自定义沙箱行为。有关完整的配置参考,请参阅 [Settings](/zh-CN/settings#sandbox-settings)。
123 156
124#### 向特定路径授予子进程写入访问权限
125
126默认情况下,沙箱化命令只能写入当前工作目录。如果子进程命令(如 `kubectl`、`terraform` 或 `npm`)需要在项目目录外写入,请使用 `sandbox.filesystem.allowWrite` 向特定路径授予访问权限:157默认情况下,沙箱化命令只能写入当前工作目录。如果子进程命令(如 `kubectl`、`terraform` 或 `npm`)需要在项目目录外写入,请使用 `sandbox.filesystem.allowWrite` 向特定路径授予访问权限:
127 158
128```json theme={null}159```json theme={null}
136}167}
137```168```
138 169
139这些路径在操作系统级别强制执行,因此在沙箱内运行的所有命令(包括其子进程)都尊重它们。当工具需要对特定位置的写入访问时,这是推荐的方法,而不是使用 `excludedCommands` 将工具从沙箱中排除。170这些路径在操作系统级别强制执行,因此在沙箱内运行的所有命令(包括其子进程)都尊重它们。这是推荐的方法,当工具需要对特定位置的写入访问时,而不是使用 `excludedCommands` 将工具从沙箱中排除。
140 171
141当在多个 [settings scopes](/zh-CN/settings#settings-precedence) 中定义 `allowWrite`(或 `denyWrite`/`denyRead`/`allowRead`)时,数组被**合并**,这意味着来自每个范围的路径被组合,而不是替换。例如,如果托管设置允许写入 `/opt/company-tools`,用户在其个人设置中添加 `~/.kube`,则两个路径都包含在最终沙箱配置中。这意味着用户和项目可以扩展列表而无需复制或覆盖由更高优先级范围设置的路径。172当在多个 [settings scopes](/zh-CN/settings#settings-precedence) 中定义相同的文件系统数组时,数组被合并:来自每个范围的路径被组合,而不是替换。
142 173
143路径前缀控制路径的解析方式:174路径前缀控制路径的解析方式:
144 175
145| 前缀 | 含义 | 示例 |176| 前缀 | 含义 | 示例 |
146| :-------- | :---------------------------------- | :-------------------------------------------- |177| :-------- | :------------------------------------ | :---------------------------------------------------------------- |
147| `/` | 从文件系统根目录的绝对路径 | `/tmp/build` 保持 `/tmp/build` |178| `/` | 从文件系统根目录的绝对路径 | `/tmp/build` 保持 `/tmp/build` |
148| `~/` | 相对于主目录 | `~/.kube` 变为 `$HOME/.kube` |179| `~/` | 相对于主目录 | `~/.kube` 变为 `$HOME/.kube` |
149| `./` 或无前缀 | 相对于项目设置的项目根目录,或相对于用户设置的 `~/.claude` | 项目设置中的 `./output` 解析为 `<project-root>/output` |180| `./` 或无前缀 | 对于项目设置相对于项目根目录,或对于用户设置相对于 `~/.claude` | `.claude/settings.json` 中的 `./output` 解析为 `<project-root>/output` |
150 181
151较旧的 `//path` 前缀用于绝对路径仍然有效。如果您之前使用单斜杠 `/path` 期望项目相对解析,请切换到 `./path`。此语法与 [Read and Edit](/zh-CN/permissions#read-and-edit) 权限规则不同,后者使用 `//path` 表示绝对路径,`/path` 表示项目相对路径。沙箱文件系统路径使用标准约定:`/tmp/build` 是绝对路径。182此语法与 [Read and Edit permission rules](/zh-CN/permissions#read-and-edit) 不同,后者使用 `//path` 表示绝对路径,`/path` 表示项目相对路径。沙箱文件系统路径使用标准约定:`/tmp/build` 是绝对路径。
152 183
153您也可以使用 `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` 拒绝写入或读取访问。这些与来自 `Edit(...)` 和 `Read(...)` 权限规则的任何路径合并。要重新允许读取被拒绝区域内的特定路径,请使用 `sandbox.filesystem.allowRead`,它优先于 `denyRead`。当在托管设置中启用 `allowManagedReadPathsOnly` 时,仅尊重托管 `allowRead` 条目;用户、项目和本地 `allowRead` 条目被忽略。`denyRead` 仍然从所有来源合并。184你也可以使用 `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` 拒绝写入或读取访问,以及使用 `sandbox.filesystem.allowRead` 重新允许被拒绝区域内的特定路径。
154 185
155例如,要阻止从整个主目录读取,同时仍允许从当前项目读取,请将此添加到您的项目的 `.claude/settings.json`:186下面的示例阻止从整个主目录读取,同时仍允许从当前项目读取。将其放在你的项目的 `.claude/settings.json` 中,因为相对路径 `.` 仅在配置位于项目设置中时才解析为项目根目录:
156 187
157```json theme={null}188```json theme={null}
158{189{
166}197}
167```198```
168 199
169`allowRead` 中的 `.` 解析为项目根目录,因为此配置位于项目设置中。如果您将相同的配置放在 `~/.claude/settings.json` 中,`.` 将解析为 `~/.claude`,项目文件将保持被 `denyRead` 规则阻止。200`allowRead` 中的 `.` 解析为项目根目录,因为此配置位于项目设置中。如果你将相同的配置放在 `~/.claude/settings.json` 中,`.` 将解析为 `~/.claude`,项目文件将保持被 `denyRead` 规则阻止。
170 201
171<Tip>202<h2 id="how-sandboxing-works">
172 并非所有命令都与沙箱开箱即用兼容。一些可能帮助您充分利用沙箱的注意事项:203 沙箱如何工作
204</h2>
173 205
174 * 许多 CLI 工具需要访问某些主机。当您使用这些工具时,它们会请求访问某些主机的权限。授予权限将允许它们现在和将来访问这些主机,使它们能够在沙箱内安全执行。206<h3 id="filesystem-isolation">
175 * `watchman` 与在沙箱中运行不兼容。如果您运行 `jest`,请考虑使用 `jest --no-watchman`207 文件系统隔离
176 * `docker` 与在沙箱中运行不兼容。考虑在 `excludedCommands` 中指定 `docker *` 以强制其在沙箱外运行。208</h3>
177</Tip>
178 209
179<Note>210沙箱化 Bash 工具将文件系统访问限制在特定目录:
180 Claude Code 包括一个有意的逃生舱机制,允许命令在必要时在沙箱外运行。当命令由于沙箱限制(例如网络连接问题或不兼容的工具)失败时,Claude 会被提示分析失败,并可能使用 `dangerouslyDisableSandbox` 参数重试命令。使用此参数的命令通过需要用户权限执行的常规 Claude Code 权限流程。这允许 Claude Code 处理某些工具或网络操作无法在沙箱约束内运行的边界情况。211
212* **默认写入行为**:对当前工作目录及其子目录的读写访问
213* **默认读取行为**:对整个计算机的读取访问,除了某些被拒绝的目录。注意此默认仍允许读取凭证文件,例如 `~/.aws/credentials` 和 `~/.ssh/`。将它们添加到 `denyRead` 以阻止它们。
214* **被阻止的访问**:无法在没有明确权限的情况下修改当前工作目录外的文件,包括 shell 配置文件(例如 `~/.bashrc`)和 `/bin/` 中的系统二进制文件
215* **Git worktrees**:当工作目录是[链接的 git worktree](/zh-CN/worktrees) 时,沙箱还允许写入主存储库的共享 `.git` 目录,以便 `git commit` 等命令可以更新引用和索引。对该目录内的 `hooks/` 和 `config` 的写入仍然被拒绝。
216* **可配置**:通过设置定义自定义允许和拒绝的路径
217
218你可以使用设置中的 `sandbox.filesystem.allowWrite` 向其他路径授予写入访问权限。这些限制在操作系统级别强制执行,因此它们适用于所有子进程命令,包括 `kubectl`、`terraform` 和 `npm` 等工具,而不仅仅是 Claude 的文件工具。
181 219
182 您可以通过在 [sandbox settings](/zh-CN/settings#sandbox-settings) 中设置 `"allowUnsandboxedCommands": false` 来禁用此逃生舱。禁用时,`dangerouslyDisableSandbox` 参数被完全忽略,所有命令必须沙箱化运行或在 `excludedCommands` 中明确列出。220<h3 id="network-isolation">
221 网络隔离
222</h3>
223
224网络访问通过在沙箱外运行的代理服务器进行控制:
225
226* **域名限制**:没有预先允许的域名。命令第一次需要新的域名时,Claude Code 会提示批准。使用 [`allowedDomains`](/zh-CN/settings#sandbox-settings) 预先允许域名以避免提示。
227* **托管锁定**:如果在托管设置中设置了 [`allowManagedDomainsOnly`](/zh-CN/settings#sandbox-settings),非允许的域名会自动被阻止而不是提示,只有来自托管设置的 `allowedDomains` 被尊重。
228* **自定义代理支持**:高级用户可以在出站流量上实现自定义规则
229* **全面覆盖**:限制适用于所有脚本、程序和由命令生成的子进程
230
231<Note>
232 内置代理基于请求的主机名强制执行允许列表,不会终止或检查 TLS 流量。有关此设计的含义,请参阅 [Security limitations](#security-limitations),如果你的威胁模型需要 TLS 检查,请参阅 [Custom proxy configuration](#custom-proxy-configuration)。
183</Note>233</Note>
184 234
185## 安全优势235<h3 id="os-level-enforcement">
236 操作系统级强制执行
237</h3>
186 238
187### 防止提示注入239沙箱化 Bash 工具利用操作系统安全原语:
188 240
189即使攻击者通过提示注入成功操纵 Claude Code 的行为,沙箱也确保您的系统保持安全:241* **macOS**:使用 Seatbelt 进行沙箱强制执行
242* **Linux**:使用 [bubblewrap](https://github.com/containers/bubblewrap) 进行隔离
243* **WSL2**:使用 bubblewrap,与 Linux 相同
190 244
191**文件系统保护:**245不支持 WSL1,因为 bubblewrap 需要仅在 WSL2 中可用的内核功能。这些操作系统级限制确保由 Claude Code 命令生成的所有子进程都继承相同的安全边界。
192 246
193* 无法修改关键配置文件,如 `~/.bashrc`247这些相同的原语作为独立的 [`@anthropic-ai/sandbox-runtime`](https://github.com/anthropic-experimental/sandbox-runtime) 包提供,[Sandbox environments](/zh-CN/sandbox-environments#sandbox-runtime) 页面将其作为包装整个 Claude Code 进程的单独方法进行介绍。
194* 无法修改 `/bin/` 中的系统级文件
195* 无法读取在您的 [Claude 权限设置](/zh-CN/permissions#manage-permissions) 中被拒绝的文件
196 248
197**网络保护:**249<h2 id="how-sandboxing-relates-to-permissions-and-permission-modes">
250 沙箱如何与权限和权限模式相关
251</h2>
198 252
199* 无法向攻击者控制的服务器泄露数据253沙箱、[permission rules](/zh-CN/permissions) 和 [permission modes](/zh-CN/permission-modes) 是互补的层。下面的部分介绍沙箱如何与每个交互。
200* 无法从未授权的域下载恶意脚本
201* 无法向未批准的服务进行意外的 API 调用
202* 无法联系任何未明确允许的域
203 254
204**监控和控制:**255<h3 id="permission-rules">
256 权限规则
257</h3>
205 258
206* 所有在沙箱外的访问尝试都在操作系统级别被阻止259权限规则和沙箱控制不同的事物:
207* 当边界被测试时,您会收到立即通知
208* 您可以选择拒绝、允许一次或永久更新您的配置
209 260
210### 减少攻击面261* **权限规则**控制 Claude Code 可以使用哪些工具,在任何工具运行之前进行评估。它们适用于所有工具:Bash、Read、Edit、WebFetch、MCP 和其他工具。
262* **沙箱**提供操作系统级强制执行,限制 Bash 命令在文件系统和网络级别可以访问的内容。它仅适用于 Bash 命令及其子进程。
211 263
212沙箱限制了以下可能造成的损害:264这两个层在强制执行方式上也有所不同。Claude Code 在命令运行之前根据命令字符串和(在自动模式下)单独分类器关于命令是否安全的判断来评估权限决定。操作系统在运行的进程上强制执行沙箱边界,因此无论模型选择运行什么,它都成立,即使允许的命令做的比其名称暗示的更多。
213 265
214* **恶意依赖项**:具有有害代码的 NPM 包或其他依赖项266文件系统和网络限制通过沙箱设置和权限规则进行配置:
215* **被破坏的脚本**:具有安全漏洞的构建脚本或工具
216* **社会工程**:欺骗用户运行危险命令的攻击
217* **提示注入**:欺骗 Claude 运行危险命令的攻击
218 267
219### 透明操作268| 设置或规则 | 它做什么 |
269| :------------------------------------------------------------- | :-------------------------------------------------- |
270| `sandbox.filesystem.allowWrite` | 向工作目录外的路径授予子进程写入访问权限 |
271| `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` | 阻止子进程访问特定路径 |
272| `sandbox.filesystem.allowRead` | 重新允许读取被 `denyRead` 区域内的特定路径 |
273| `Edit` 允许规则 | 授予对特定路径的写入访问权限,与 `sandbox.filesystem.allowWrite` 相同 |
274| `Read` 和 `Edit` 拒绝规则 | 阻止访问特定文件或目录 |
275| `WebFetch` 允许和拒绝规则 | 控制域名访问 |
276| 沙箱 `allowedDomains` | 控制 Bash 命令可以到达的域名 |
277| 沙箱 `deniedDomains` | 阻止特定域名,即使更广泛的 `allowedDomains` 通配符会允许它们 |
220 278
221当 Claude Code 尝试访问沙箱外的网络资源时:279来自 `sandbox.filesystem` 设置和权限规则的路径被合并到最终沙箱配置中。
222 280
2231. 操作在操作系统级别被阻止281[claude-code repository 的示例目录](https://github.com/anthropics/claude-code/tree/main/examples/settings)包括常见部署场景的启动设置配置,包括沙箱特定的示例。使用这些作为起点,并根据你的需求调整它们。
2242. 您会收到立即通知
2253. 您可以选择:
226 * 拒绝请求
227 * 允许一次
228 * 更新您的沙箱配置以永久允许它
229 282
230## 安全限制283<h3 id="permission-modes">
284 权限模式
285</h3>
231 286
232* 网络沙箱限制:网络过滤系统通过限制进程允许连接的域来运行。它不会以其他方式检查通过代理的流量,用户负责确保他们只在其策略中允许受信任的域。287`/sandbox` 不是 [permission mode](/zh-CN/permission-modes)。权限模式决定工具调用是否运行以及是否首先提示你,而沙箱限制 Bash 命令运行后可以访问的内容。它们在控制的内容和替换每个操作提示的内容上有所不同:
233 288
234<Warning>289| | 它控制什么 | 替换提示的内容 |
235 用户应该意识到允许广泛域名(如 `github.com`)可能允许数据泄露的潜在风险。此外,在某些情况下,可能可以通过 [domain fronting](https://en.wikipedia.org/wiki/Domain_fronting) 绕过网络过滤。290| :-------------------------------------------------------------------- | :---------------- | :------------------------------------------------------------------------------------ |
236</Warning>291| `/sandbox` | Bash 命令运行后可以访问的内容 | 沙箱边界本身,在 [auto-allow mode](#sandbox-modes) 中 |
292| [Auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) | 每个工具调用是否运行 | 审查操作的分类器 |
293| `--dangerously-skip-permissions` | 每个工具调用是否运行 | 无。[Protected path](/zh-CN/permission-modes#protected-paths) 检查也被跳过;仅删除 `/` 或你的主目录仍会提示 |
237 294
238* 通过 Unix Sockets 的权限提升:`allowUnixSockets` 配置可能会无意中授予对可能导致沙箱绕过的强大系统服务的访问权限。例如,如果它用于允许访问 `/var/run/docker.sock`,这将有效地通过利用 docker socket 授予对主机系统的访问权限。鼓励用户仔细考虑他们通过沙箱允许的任何 unix sockets。295沙箱的 [auto-allow mode](#sandbox-modes) 与 [auto mode](/zh-CN/permission-modes#eliminate-prompts-with-auto-mode) 分开:自动允许批准 Bash 命令,因为沙箱边界包含它们,而自动模式使用分类器审查操作。两者独立工作,可以结合。要为无人值守运行选择隔离边界,请参阅 [Sandbox environments](/zh-CN/sandbox-environments#how-isolation-relates-to-permission-modes)。
239* 文件系统权限提升:过于宽泛的文件系统写入权限可能导致权限提升攻击。允许写入包含 `$PATH` 中的可执行文件、系统配置目录或用户 shell 配置文件(`.bashrc`、`.zshrc`)的目录可能导致当其他用户或系统进程访问这些文件时在不同的安全上下文中执行代码。
240* Linux 沙箱强度:Linux 实现提供强大的文件系统和网络隔离,但包括一个 `enableWeakerNestedSandbox` 模式,使其能够在 Docker 环境中工作而无需特权命名空间。此选项大大削弱了安全性,应仅在其他隔离被强制执行的情况下使用。
241 296
242## 沙箱如何与权限相关297<h2 id="configure-the-sandbox-for-your-organization">
298 为你的组织配置沙箱
299</h2>
243 300
244沙箱和 [permissions](/zh-CN/permissions) 是互补的安全层,协同工作:301管理员可以为每个用户要求沙箱,防止开发者扩大策略,并通过公司代理路由沙箱流量。
245 302
246* **权限**控制 Claude Code 可以使用哪些工具,在任何工具运行之前进行评估。它们适用于所有工具:Bash、Read、Edit、WebFetch、MCP 和其他工具。303<h3 id="enforce-sandboxing-with-managed-settings">
247* **沙箱**提供操作系统级强制执行,限制 Bash 命令在文件系统和网络级别可以访问的内容。它仅适用于 Bash 命令及其子进程。304 使用托管设置强制执行沙箱
305</h3>
248 306
249文件系统和网络限制通过沙箱设置和权限规则进行配置:307要为每个开发者要求沙箱,通过 [managed settings](/zh-CN/settings#settings-files) 提供 `sandbox` 密钥,可以是由你的 MDM 管理的文件,也可以是通过 Claude.ai 上的 [server-managed settings](/zh-CN/server-managed-settings)。
250 308
251* 使用 `sandbox.filesystem.allowWrite` 向工作目录外的路径授予子进程写入访问权限309以下托管设置配置启用沙箱,如果沙箱无法初始化则拒绝启动 Claude Code,并防止模型在沙箱外重试命令:
252* 使用 `sandbox.filesystem.denyWrite` 和 `sandbox.filesystem.denyRead` 阻止子进程访问特定路径
253* 使用 `sandbox.filesystem.allowRead` 重新允许读取被拒绝区域内的特定路径
254* 使用 `Read` 和 `Edit` 拒绝规则阻止访问特定文件或目录
255* 使用 `WebFetch` 允许/拒绝规则控制域名访问
256* 使用沙箱 `allowedDomains` 控制 Bash 命令可以到达的域名
257* 使用沙箱 `deniedDomains` 阻止特定域名,即使更广泛的 `allowedDomains` 通配符会允许它们
258 310
259来自 `sandbox.filesystem` 设置和权限规则的路径被合并到最终沙箱配置中。311```json theme={null}
312{
313 "sandbox": {
314 "enabled": true,
315 "failIfUnavailable": true,
316 "allowUnsandboxedCommands": false
317 }
318}
319```
320
321超过 `enabled` 的两个密钥控制沙箱无法运行命令时会发生什么:
322
323* **`failIfUnavailable`**:缺少的依赖项(例如 Linux 上的 bubblewrap)会阻止 Claude Code 启动,而不是显示警告并回退到非沙箱化执行
324* **`allowUnsandboxedCommands: false`**:`dangerouslyDisableSandbox` 逃生舱被忽略,因此在沙箱下失败的命令无法在其外重试
325
326值得考虑与它们一起添加两个补充。为任何必须在没有隔离的情况下运行的组织批准的工具添加 `excludedCommands`。为凭证目录(例如 `~/.aws` 和 `~/.ssh`)添加 [`denyRead`](#filesystem-isolation) 条目,默认读取策略仍允许这些。
327
328沙箱不在原生 Windows 上运行,因此如果你的队伍包括 Windows 主机,请将此配置的范围限制在 macOS 和 Linux,或让这些用户在 WSL2 或容器内运行 Claude Code。
260 329
261此 [repository](https://github.com/anthropics/claude-code/tree/main/examples/settings) 包括常见部署场景的启动设置配置,包括沙箱特定的示例。使用这些作为起点,并根据您的需求调整它们。330<h3 id="keep-developers-from-widening-the-policy">
331 防止开发者扩大策略
332</h3>
262 333
263## 高级用法334对于布尔密钥(例如 `enabled` 和 `failIfUnavailable`),Claude Code 使用托管值并忽略开发者在本地设置的任何内容。对于数组密钥(例如 `excludedCommands` 和 `allowRead`),Claude Code 合并来自每个范围的条目,因此开发者可以追加扩大策略的条目。
264 335
265### 自定义代理配置336在托管设置中将 `allowManagedReadPathsOnly` 设置为 `true`,以便仅尊重来自托管设置的 `allowRead` 条目。用户、项目和本地 `allowRead` 条目被忽略。这防止开发者扩大读取访问权限超过组织批准的路径。要以相同的方式将网络域锁定到托管值,请设置 [`allowManagedDomainsOnly`](/zh-CN/settings#sandbox-settings)。
266 337
267对于需要高级网络安全的组织,您可以实现自定义代理以:338`excludedCommands` 没有等效的仅托管锁定,因此开发者总是可以追加在沙箱外运行其他命令的条目。保持托管列表狭窄。
339
340<h3 id="custom-proxy-configuration">
341 自定义代理配置
342</h3>
343
344对于需要高级网络安全的组织,你可以实现自定义代理以:
268 345
269* 解密和检查 HTTPS 流量346* 解密和检查 HTTPS 流量
270* 应用自定义过滤规则347* 应用自定义过滤规则
271* 记录所有网络请求348* 记录所有网络请求
272* 与现有安全基础设施集成349* 与现有安全基础设施集成
273 350
351要将 Claude Code 指向你的代理,请在 [sandbox settings](/zh-CN/settings#sandbox-settings) 中设置代理端口:
352
274```json theme={null}353```json theme={null}
275{354{
276 "sandbox": {355 "sandbox": {
282}361}
283```362```
284 363
285### 与现有安全工具的集成364<h2 id="troubleshooting">
365 故障排除
366</h2>
286 367
287沙箱 bash 工具与以下工具配合使用:368某些命令在沙箱内失败,即使它们在沙箱外工作。下面的修复涵盖最常见的情况。
288 369
289* **权限规则**:与 [permission settings](/zh-CN/permissions) 结合以实现深度防御370* **命令因主机不允许错误而失败**:许多 CLI 工具需要到达特定的主机。在提示时授予权限会将主机添加到你的允许列表,以便该工具在将来在沙箱内运行。
290* **开发容器**:与 [dev containers](/zh-CN/devcontainer) 一起使用以获得额外隔离371* **`jest` 挂起或失败**:`watchman` 与沙箱不兼容。改为运行 `jest --no-watchman`。
291* **企业策略**:通过 [managed settings](/zh-CN/settings#settings-precedence) 强制执行沙箱配置372* **Go 基础 CLI 在 macOS 上 TLS 验证失败**:`gh`、`gcloud` 和 `terraform` 等工具在 Seatbelt 下可能无法进行 TLS 验证。在 `excludedCommands` 中列出这些工具以在沙箱外运行它们。如果你使用 `httpProxyPort` 与 MITM 代理和自定义 CA,请改为将 [`enableWeakerNetworkIsolation`](/zh-CN/settings#sandbox-settings) 设置为 `true`。
373* **`docker` 命令失败**:`docker` 与沙箱不兼容。将 `docker *` 添加到 `excludedCommands` 以在沙箱外运行它。
374* **Bubblewrap 在容器内启动失败**:在无特权容器中,bubblewrap 无法挂载新的 `/proc` 文件系统。将 [`enableWeakerNestedSandbox`](/zh-CN/settings#sandbox-settings) 设置为 `true`,以便内部沙箱绑定挂载容器的现有 `/proc`。仅在外部容器已提供你需要的隔离边界时使用此设置,因为它向沙箱化命令公开进程信息,而新的 `/proc` 挂载会隐藏这些信息。
375* **Linux 上的 Seccomp 过滤器**:seccomp 过滤器需要阻止 Unix 域套接字。`/sandbox` 中的 Dependencies 选项卡显示它是否可用。如果缺少,请运行 `npm install -g @anthropic-ai/sandbox-runtime` 以安装助手。
376* **`--dangerously-skip-permissions` 以 root 身份失败**:当在 Linux 和 macOS 上以 root 身份或通过 sudo 运行时,此标志被阻止,因为 root 访问加上没有权限提示可以修改系统上的任何文件或服务。检查在识别的沙箱内自动跳过。要在容器中自主运行,请使用 [dev container](/zh-CN/devcontainer) 配置,它以非 root 用户身份运行 Claude Code。
292 377
293## 最佳实践378<h2 id="limitations">
379 限制
380</h2>
294 381
2951. **从限制性开始**:从最小权限开始,根据需要扩展382沙箱降低风险,但不是完整的隔离边界。在依赖它作为硬安全控制之前,请查看下面的限制。
2962. **监控日志**:查看沙箱违规尝试以了解 Claude Code 的需求
2973. **使用环境特定的配置**:开发与生产环境的不同沙箱规则
2984. **与权限结合**:将沙箱与 IAM 策略一起使用以实现全面安全
2995. **测试配置**:验证您的沙箱设置不会阻止合法工作流程
300 383
301## 开源384<h3 id="security-limitations">
385 安全限制
386</h3>
302 387
303沙箱运行时作为开源 npm 包提供,供您在自己的代理项目中使用。这使更广泛的 AI 代理社区能够构建更安全、更安全的自主系统。这也可以用于沙箱化您可能希望运行的其他程序。例如,要沙箱化 MCP 服务器,您可以运行:388* **网络过滤**:网络过滤系统通过限制进程允许连接的域来运行。内置代理不会终止或对出站流量执行 TLS 检查,因此不会检查加密连接的内容。你负责确保只有受信任的域在你的策略中被允许。
304 389
305```bash theme={null}390<Warning>
306npx @anthropic-ai/sandbox-runtime <command-to-sandbox>391 允许广泛的域名(例如 `github.com`)可能会为数据泄露创建路径。因为代理从客户端提供的主机名做出允许决定而不检查 TLS,在沙箱内运行的代码可能会使用 [domain fronting](https://en.wikipedia.org/wiki/Domain_fronting) 或类似技术来到达允许列表外的主机。如果你的威胁模型需要更强的保证,请配置一个 [custom proxy](#custom-proxy-configuration),它终止 TLS 并检查流量,并在沙箱内安装其 CA 证书。更强的 TLS 感知网络隔离是一个活跃的开发领域。
307```392</Warning>
308 393
309有关实现细节和源代码,请访问 [GitHub repository](https://github.com/anthropic-experimental/sandbox-runtime)。394* **通过 Unix 套接字的权限提升**:`allowUnixSockets` 配置可能会无意中授予对可能导致沙箱绕过的强大系统服务的访问权限。例如,允许访问 `/var/run/docker.sock` 有效地通过 Docker 套接字授予对主机系统的访问权限。仔细考虑你通过沙箱允许的任何 Unix 套接字。
395* **文件系统权限提升**:过于宽泛的文件系统写入权限可能导致权限提升攻击。允许写入包含 `$PATH` 中的可执行文件、系统配置目录或用户 shell 配置文件(例如 `.bashrc` 或 `.zshrc`)的目录可能导致当其他用户或系统进程访问这些文件时在不同的安全上下文中执行代码。
396* **Linux 沙箱强度**:Linux 实现提供强大的文件系统和网络隔离,但包括一个 `enableWeakerNestedSandbox` 模式,使其能够在 Docker 环境中工作而无需特权命名空间,或在禁用无特权用户命名空间的 Linux 主机上。此选项大大削弱了安全性,应仅在其他隔离被强制执行时使用。
397* **设置文件受保护**:沙箱自动拒绝对 Claude Code 的 `settings.json` 文件在每个范围和托管设置目录的写入访问,因此沙箱化命令无法修改其自己的策略。
310 398
311## 限制399<h3 id="platform-and-tool-compatibility">
400 平台和工具兼容性
401</h3>
312 402
313* **性能开销**:最小,但某些文件系统操作可能稍慢403* **平台支持**:支持 macOS、Linux 和 WSL2。不支持 WSL1 和原生 Windows。
314* **兼容性**:某些需要特定系统访问模式的工具可能需要配置调整,或者甚至可能需要在沙箱外运行404* **性能开销**:最小,但某些文件系统操作可能稍慢。
315* **平台支持**:支持 macOS、Linux 和 WSL2。不支持 WSL1。计划支持原生 Windows。405* **工具兼容性**:某些需要特定系统访问模式的工具可能需要配置调整,或可能需要在沙箱外运行。
316 406
317## 沙箱不涵盖的内容407<h3 id="scope">
408 范围
409</h3>
318 410
319沙箱隔离 Bash 子进程。其他工具在不同的边界下运行:411沙箱隔离 Bash 子进程。其他工具在不同的边界下运行:
320 412
321* **内置文件工具**:Read、Edit 和 Write 直接使用权限系统,而不是通过沙箱运行。请参阅 [permissions](/zh-CN/permissions)。413* **内置文件工具**:Read、Edit 和 Write 直接使用权限系统,而不是通过沙箱运行。请参阅 [permissions](/zh-CN/permissions)。
322* **计算机使用**:当 Claude 打开应用程序并控制您的屏幕时,它在您的实际桌面上运行,而不是在隔离的环境中。每个应用程序的权限提示控制每个应用程序。请参阅 [CLI 中的计算机使用](/zh-CN/computer-use) 或 [Desktop 中的计算机使用](/zh-CN/desktop#let-claude-use-your-computer)。414* **计算机使用**:当 Claude 打开应用程序并控制你的屏幕时,它在你的实际桌面上运行,而不是在隔离的环境中。每个应用程序的权限提示控制每个应用程序。请参阅 [CLI 中的计算机使用](/zh-CN/computer-use) 或 [Desktop 中的计算机使用](/zh-CN/desktop#let-claude-use-your-computer)。
415* **环境变量**:沙箱化 Bash 命令默认继承父进程环境,包括在那里设置的任何凭证。要从子进程中删除 Anthropic 和云提供商凭证,请设置 [`CLAUDE_CODE_SUBPROCESS_ENV_SCRUB`](/zh-CN/env-vars)。
416* **子代理**:[subagents](/zh-CN/sub-agents) 在与父会话相同的进程中运行,并使用相同的沙箱配置。当在父会话中启用沙箱时,子代理内的 Bash 命令被沙箱化。
417
418<Warning>
419 有效的沙箱需要**同时**进行文件系统和网络隔离。没有网络隔离,被破坏的代理可能会泄露敏感文件,如 SSH 密钥。没有文件系统隔离,被破坏的代理可能会后门系统资源以获得网络访问权限。当你扩大默认值时,检查 `allowWrite` 路径、广泛的 `allowedDomains` 条目或 `excludedCommands` 异常是否不会撤销另一侧的限制。
420</Warning>
323 421
324## 另请参阅422<h2 id="see-also">
423 另请参阅
424</h2>
325 425
326* [Security](/zh-CN/security) - 全面的安全功能和最佳实践426* [Sandbox environments](/zh-CN/sandbox-environments):比较内置沙箱与开发容器、容器和虚拟机
327* [Permissions](/zh-CN/permissions) - 权限配置和访问控制427* [Security](/zh-CN/security):全面的安全功能和最佳实践
328* [Settings](/zh-CN/settings) - 完整的配置参考428* [Permissions](/zh-CN/permissions):权限配置和访问控制
329* [CLI reference](/zh-CN/cli-reference) - 命令行选项429* [Settings](/zh-CN/settings):完整的配置参考
430* [CLI reference](/zh-CN/cli-reference):命令行选项