Permissions

权限与安全

控制 Claude 的权限——文件访问、工具许可和沙箱化运行。

权限模式

Claude Code 共有 6 种权限模式。Shift + Tab 默认在 default → acceptEdits → plan 三档之间循环;启用 autobypassPermissions 后会插入到 plan 之后。dontAsk 不参与循环,需要用 --permission-mode 显式指定。

  • default — Claude 在每次写入文件或执行 shell 命令前征求许可。起始模式。
  • acceptEdits — 文件编辑及常见文件系统命令(mkdirtouchmvcprm 等)自动通过;其他工具仍会提示。
  • plan — Claude 可以读文件和跑 shell 探索代码库,但不会修改源码。其他工具的权限提示与 default 一致。详见 计划模式
  • auto — 独立分类器模型在后台审查操作。需要 Claude Code v2.1.83+、受支持模型,以及组织侧可能要求的 admin enablement。Anthropic API 默认可用;Bedrock、Vertex AI 和 Microsoft Foundry 需要设置 CLAUDE_CODE_ENABLE_AUTO_MODE=1,且当前只支持 Opus 4.7 或 Opus 4.8。
  • dontAsk — 自动拒绝 permissions.allow 之外的所有操作,用于锁死的 CI。
  • bypassPermissions — 全部检查关闭,只在容器 / VM 等可控环境使用。

使用 --permission-mode 标志在启动时指定模式:

bash
claude --permission-mode plan           # 探索,不修改
claude --permission-mode acceptEdits    # 跳过文件编辑提示
claude --permission-mode auto           # 后台分类器
claude --permission-mode dontAsk        # 锁死 CI

完全无人值守(CI、脚本)且不走分类器的场景,用 --dangerously-skip-permissions —— 等价于 --permission-mode bypassPermissions,仅在你能控制输入的沙箱环境使用。

配置允许的工具

精细控制在 .claude/settings.json 中。permissions 对象包含 allowdenyask 数组:

json
{
  "permissions": {
    "allow": [
      "Read",
      "Glob",
      "Grep",
      "Bash(npm run lint)",
      "Bash(npm test)",
      "Bash(git status)",
      "Bash(git diff)",
      "Bash(git *)"
    ],
    "deny": [
      "Bash(rm -rf *)"
    ]
  }
}

deny 始终覆盖 allow。对于 Bash,可以用 glob 语法限定到特定命令——Bash(npm test) 仅允许该命令;Bash(git *) 匹配任意 git 子命令。

当某个动作有时可以接受、但仍需要保持可见时,用 ask

json
{
  "permissions": {
    "ask": ["Bash(npm install *)", "Edit"]
  }
}

目录与文件限制

使用 permissions.additionalDirectories 或 CLAUDE.md 指令来限制访问范围:

markdown
## 约束

- 禁止修改 src/ 和 tests/ 以外的文件
- 禁止读写 .env、.env.local 或任何凭证文件
- 禁止运行 rm -rf 或任何破坏性 shell 命令

要硬性执行,使用 PreToolUse hook 来拒绝对非批准目录的写入。CLAUDE.md 指令是尽力而为的;hooks 是确定性的。

也可以扩展 Claude 允许访问的目录范围(超出项目根目录):

json
{
  "permissions": {
    "additionalDirectories": ["/shared/libs", "~/design-tokens"]
  }
}

additionalDirectories 的修改在当前运行的会话中立即生效。

Claude Code 也会保护凭证和系统文件等敏感路径。把它当作兜底,不要用它替代高风险仓库中的显式 deny rules 和 hooks。

沙箱化会话

要获得最大隔离性,在容器中运行 Claude:

bash
docker run -it -v $(pwd):/workspace -w /workspace \
  node:20 npx @anthropic-ai/claude-code --dangerously-skip-permissions

何时使用沙箱:

  • 在不受信任的代码库上运行
  • CI/CD 管道中 Claude 生成或修改代码
  • 需要可复现性的评估和基准测试

在容器内,--dangerously-skip-permissions 是安全的,因为影响范围限于容器文件系统。

最佳实践

  • 从严到宽。 从 default 模式开始,显式白名单你信任的命令。
  • 项目级设置。.claude/settings.json 放入仓库,团队成员共享相同权限。
  • Settings 优先级。 从高到低:企业策略(managed-settings.json,IT 下发)> 命令行参数 > 本地项目(.claude/settings.local.json,gitignored)> 共享项目(.claude/settings.json)> 用户级(~/.claude/settings.json)。Managed settings 可在组织级别锁死 bypassPermissionsauto 模式。注意:defaultMode: "auto" 只从用户级或 managed settings 生效,不会从提交到仓库的项目 settings 生效。
  • 用 hooks 审计。 使用 Hooks 记录或阻止工具调用。PreToolUse hook 可以强制执行 CLAUDE.md 无法保证的策略。
  • 使用 deny 进行硬性阻断。 deny 规则覆盖 allow,因此 "deny": ["Bash(rm -rf *)"] 是无条件执行的。

Agent 权限模型如何运作?

权限系统是自主 Agent 的核心设计模式。Claude Code 的分层方案——模式、允许/拒绝列表和 hooks——直接映射了生产级 Agent 架构中使用的最小权限原则。

了解 Agent 架构

延伸阅读

继续实践

权限与安全 的核心概念已经读完

如果你想把理解变成可复用的能力,可以到 AgentWay 继续练习