Agent.Space 博客

Claude Code 权限与沙箱:一套更安全的配置方法

了解 Claude Code 权限与操作系统级 Bash 沙箱,配置 deny、ask、allow、failIfUnavailable、组织策略和安全限制。

Claude Code 的权限与沙箱是互补关系,不能互相替代。Permission rules(权限规则)决定某个工具调用能不能开始;操作系统级 Bash sandbox(沙箱)限制已经运行的 Bash 命令及其子进程能访问哪些文件和网络目标。一套保守的基础配置要同时使用两层控制,关闭沙箱内 Bash 命令的自动批准,把 sandbox.failIfUnavailable 设为 true,并禁止在沙箱里失败的命令转到沙箱外重试。

本文基于 Anthropic 官方 permissions、sandboxing 与 administration 文档,并在 2026 年 9 月 11 日完成核验。它是一套实际起点,不是完整的企业安全策略。组织的 threat model(威胁模型)、secret、网络目标、可写路径和例外,仍需由安全或平台负责人确认。

如果你现在需要的是产品工作流,而不是安全控制,可以先读 Claude Code 工作流指南

Claude Code 权限与沙箱解决不同问题

最简单的理解方式是区分“执行前”和“执行中”。

控制层它回答的问题覆盖范围谁来执行
Permission rules这个工具调用能否开始,是否要先批准?Bash、Read、Edit、WebFetch、MCP 和其他工具Claude Code 在工具运行前判断规则
Bash sandbox已运行的进程可以访问什么?Bash 命令及其子进程操作系统执行文件系统和网络边界

Anthropic 的权限文档说明,权限规则由 Claude Code 执行,而不是由模型或 prompt 执行。沙箱文档则说明,沙箱使用操作系统级控制,而且只覆盖 Bash 及其子进程。

这个区别能避免两个常见误区。批准一条 Bash 命令,不代表应该让该进程无限制访问文件系统和网络;启用 Bash 沙箱,也不代表内置的 Read、Edit、WebFetch、MCP、computer-use 或其他非 Bash 工具自动进入沙箱,它们仍需要自己的权限和环境边界。

这套两层模型只是更完整的 Coding Agent 工作区安全设计的一部分。根据任务可能造成的损害,还可能需要容器或 VM、代码库权限、secret 管理、分支保护和人工 review。

Deny、ask 和 allow 决定工具调用能否开始

Claude Code 提供三类权限规则,可以通过 /permissions 或 settings 管理:

  • deny 阻止匹配的工具用法。
  • ask 在每次尝试匹配用法时要求确认。
  • allow 让匹配用法不经人工批准直接运行。

顺序很重要:先判断 deny,再判断 ask,最后判断 allow。规则写得更具体,也不会改变这个顺序。比如,一个宽泛的 Bash(git push *) deny 不能在内部再为某个代码库或 remote 添加更窄的 allow 例外;deny 仍然优先。如果确实需要例外,就要重新设计规则,不要让禁止范围宽过真正想阻止的行为。

规则既能覆盖整个工具,也能只匹配某类操作。一个不带限定条件的 Bash deny 会从可用工具上下文中移除 Bash;Bash(git push *) 则保留 Bash,只阻止匹配命令。相同原则也适用于文件读取、编辑、网页访问和其他受支持工具。

这类命令模式只是针对匹配文字的 guardrail(防误操作护栏),不是围绕 Git 程序的完整安全边界。例如,Bash(git push *) 不会匹配 git -C . pushgit -c push.default=current pushgit 'push' 等价写法。如果必须保证无法推送,应通过代码库权限与分支保护、窄权限凭据和网络策略真正执行边界。组织还可以使用 PreToolUse hook 在运行前检查完整命令,增加一层理解命令内容的控制。

三类规则应分别承接不同风险:

  • 已知禁止操作和敏感路径放进 deny
  • 安装、发布、认证变更、陌生脚本等需要结合上下文判断的操作放进 ask
  • 只有范围很窄、重复发生且已经理解的操作才放进 allow

CLAUDE.md 里的说明能影响模型尝试做什么,却不能获得权限规则已经禁止的访问。因此,“不要读取 secret”这句话可以提供指导,但不能代替真正强制执行的规则。

Bash 沙箱限制运行中的命令可以访问什么

Bash 沙箱在命令获准运行后,再加入文件系统和网络隔离。macOS 使用 Seatbelt;Linux 和 WSL2 使用 bubblewrap。本文核验的官方文档中,native Windows 和 WSL1 尚不受支持。

默认文件系统边界需要仔细看:

  • 沙箱命令可以写入工作目录、session 临时目录和明确添加的目录。
  • 默认可读范围比可写范围更大。Anthropic 特别提醒,如果没有增加 credential 或 read-deny 控制,AWS、SSH 等凭证文件仍可能被读到。
  • 受保护的 Claude Code 与 shell 配置路径会获得额外保护,但这并不是完整的 secret 策略。
  • 网络通过沙箱代理和域名规则访问;允许某个域名,不等于检查这个域名下每条加密连接的内容。

/sandbox 面板可以查看最终生效的配置与依赖。权限提示与沙箱通过 sandbox.autoAllowBashIfSandboxed 互相作用。Anthropic 文档说明它默认是 true:沙箱内 Bash 命令通常会被自动批准,但明确的 denyBash(git push *) 这类限定具体命令内容的 ask 规则仍然生效。不限定内容的 BashBash(*) ask 通常会被跳过,Plan mode 除外。下面的保守配置把它设为 false,让所有沙箱内 Bash 命令在你熟悉代码库、脚本和所需域名期间都走常规权限流程。

一套更安全的基础配置

下面的 JSON 只是一份示例,适用于你已经信任代码和 package scripts 的代码库。它不是通用策略,不应未经审查就放进陌生代码库。

json
{  "permissions": {    "deny": [      "Read(./.env)",      "Read(./.env.*)",      "Read(./secrets/**)",      "Bash(git push *)"    ],    "ask": ["Bash(npm install *)"],    "allow": ["Bash(npm run lint)", "Bash(npm test)"]  },  "sandbox": {    "enabled": true,    "autoAllowBashIfSandboxed": false,    "failIfUnavailable": true,    "allowUnsandboxedCommands": false  }}

应把这个例子理解为意图,而不是安全认证:

  • 项目中的 secret 文件被拒绝读取,但仍需盘点代码库外的凭证,并用 sandbox.credentials 或文件系统 read 限制保护它们。
  • 这条规则只会阻止常见的 git push … 写法,不能保证发布一定不发生。真正的边界要由代码库权限与分支保护、窄权限或缺失的 push 凭据,以及网络限制来执行;PreToolUse hook 可以额外检查完整命令。
  • 关闭沙箱内 Bash 命令的自动批准后,每条 Bash 命令都会走常规权限流程。即使使用自动批准模式,限定具体命令内容的 ask 规则本来也会提示;这里还保留了不限定内容的 BashBash(*) ask 原本可能跳过的提示。
  • 安装依赖需要询问,因为明确的 Bash(npm install *) 内容规则会匹配可能修改 lockfile、下载代码并执行生命周期脚本的命令;只有两条准确匹配的 package scripts 被明确允许免提示运行。
  • 即使是这两条脚本,如果代码库或脚本不可信,也不应放进 allowlist。
  • 沙箱无法初始化或单条命令无法在沙箱中运行时,都采用 fail closed(失败时收紧),而不是悄悄扩大执行范围。

/permissions 查看每条最终规则来自哪个文件。先用无敏感信息的读取和命令测试边界,再让它接触重要数据;不要拿生产 secret 当测试材料。

用 failIfUnavailable 明确处理沙箱失败

沙箱有两类不同失败,需要两个设置分别处理。

第一类是沙箱本身不可用,例如缺少必要依赖,或者平台不受支持。Anthropic 文档写明,默认行为是给出警告,然后让命令在没有沙箱的情况下运行。设置 sandbox.failIfUnavailable: true 后会变成硬失败。只要组织把沙箱当成安全门,这就是更稳妥的失败方式。

第二类是沙箱已经成功启动,但某条命令无法在边界内工作。设置 allowUnsandboxedCommands: false 可以阻止 Claude Code 把这条命令转到沙箱外重试。更安全的处理是先查清被阻止的路径、主机或工具,再由有权限的人选择最小且有理由的策略调整,或者让这项例外操作进入另一条单独受控的流程。

三个设置的分工如下:

设置覆盖的风险或失败保守配置的结果
sandbox.autoAllowBashIfSandboxed: false除 deny 或具体内容 ask 外,沙箱内 Bash 原本会自动运行所有沙箱内 Bash 都走常规权限流程
sandbox.failIfUnavailable: true沙箱无法初始化Claude Code 不会继续运行无沙箱命令
allowUnsandboxedCommands: false某条命令无法在已运行的沙箱中工作不会在沙箱外重试该命令

警告不等于强制执行。团队实际使用的每个平台,都要检查最终配置和依赖状态。

用 managed settings 强制组织策略

个人或代码库 settings 适合作为本地默认值,但不是组织级控制面。Anthropic 的管理员设置指南说明,managed settings(管理员控制的设置)可以通过 Claude admin console、设备管理、操作系统策略或管理员控制的文件下发。除文档说明的合并行为外,managed 值优先于用户和项目配置。

管理员至少应审查这些控制:

  • managed permissions.allowpermissions.askpermissions.deny 规则;
  • 只允许 managed policy 提供权限规则时使用 allowManagedPermissionRulesOnly
  • 不允许用户选择绕过模式时使用 permissions.disableBypassPermissionsMode
  • managed sandbox 的启用、failIfUnavailableallowUnsandboxedCommands
  • 本地新增会扩大访问时,使用 managed-only 的可读路径和网络域名;
  • 允许哪些 MCP servers、hooks、plugin sources、models 和网络目标。

数组设置可能跨不同范围合并,而不是直接覆盖低层配置。Anthropic 也指出,某些例外列表没有对应的 managed-only 锁定方式。因此,安全审查需要查看最终解析出的策略,不能只看管理员原本想下发的中心文件。

对于 MCP,应把 server 治理和工具权限层一起处理;Claude Code MCP 配置指南提供工作流背景,而最新 policy keys 仍以官方管理员文档为准。

先知道沙箱保护不了什么

Anthropic 明确把 Bash 沙箱描述为降低风险,而不是完整隔离边界。重要限制包括:

  • **非 Bash 工具:**Read、Edit、Write、WebFetch、MCP 和 computer-use 运行在其他控制层下。Computer-use 会操作真实桌面,仍需权限与环境隔离。
  • **凭证可见性:**沙箱 Bash 默认继承父进程环境变量,默认文件读取策略也可能暴露凭证文件。Claude Code v2.1.187 及以上版本支持 sandbox.credentials;其中环境变量遮罩行为需要 v2.1.199 及以上版本。若需要更严格的进程边界,可通过 CLAUDE_CODE_SUBPROCESS_ENV_SCRUB 从所有子进程中移除指定凭据。不要在父环境里放入过宽的 secret。
  • **加密网络流量:**内置代理限制目标地址,但默认不检查 TLS 内容。宽泛允许的域名仍可能形成数据外传路径;更强的 threat model 需要可信的检查代理和窄 allowlist。
  • **Unix sockets:**允许 Docker socket 等高权限 socket,可能等同于把 host 权限交出去。没有明确架构和审查时,不要增加这类例外。
  • **可写路径:**允许写入可执行文件搜索路径、系统配置或 shell 启动文件,可能造成后续代码执行。新增可写路径要尽量窄。
  • **较弱模式与平台缺口:**较弱的 nested isolation 和 macOS Apple Events 会明显削弱隔离。Native Windows 与 WSL1 不受支持;部分工具应该调整工作流程,而不是添加宽泛例外。

文件系统与网络隔离也互相依赖。一个既能读 secret、又能访问宽泛网络目标的进程,可能把数据传出去;一个能修改系统资源的进程,也可能为之后的网络访问留下通路。每次加例外时都要同时检查两边。

扩大自主运行前的预检清单

在增加 session 自主性或改为异步工作前,先用证据验证边界:

  1. 定义 threat model:哪些文件、凭证、服务、代码库和外部系统一旦被改动会造成损害?
  2. 打开 /permissions,检查最终生效的 deny、ask、allow 规则及其来源文件。
  3. 打开 /sandbox,确认预期模式、依赖、禁止路径、可写路径和允许的网络目标。
  4. 只要权限提示和沙箱是必需安全门,就确认 autoAllowBashIfSandboxed: falsefailIfUnavailable: trueallowUnsandboxedCommands: false 同时生效。
  5. 盘点文件和环境变量中的凭证;任务不需要的全部 deny、mask 或移除。如果发布必须保持不可用,还要移除 push 凭据并强制执行代码库或分支 Policy,不能只依赖 Bash 文字规则。
  6. 把可写路径、网络域名、Unix sockets、MCP servers 与其他例外压到任务所需的最小范围。
  7. 从短期分支或可丢弃环境开始,不放生产凭证,并预先写好验收测试。
  8. 运行无害的边界检查,再由人 review diff、命令证据和任何外部副作用。
  9. 团队使用时,确认每个受支持平台确实解析到 managed policy,并记录和审查例外。

权限弹窗不是在时间压力下临时发明安全策略的地方。应在 session 前确定可重复规则,把意外被阻止理解为关于任务或边界的新信息。

最终结论

Claude Code 权限决定工具能否运行;操作系统级 Bash 沙箱限制获准运行的 Bash 进程能访问什么。应有意识地设计 deny、ask、allow,记住限定具体命令内容的 ask 在自动批准模式下仍会提示;当所有沙箱内 Bash 都必须走常规权限流程时,再关闭 Bash 自动批准。同时让沙箱不可用时硬失败,禁止无沙箱重试,明确保护凭证,并为组织级风险保留 managed policy 与人工控制。

准备好尝试一个有边界的任务时,可以打开 Agent.Space,从低风险且有明确验收测试的任务开始。扩大自主性前,先确认实时工作区、Agent、模型和安全边界。