Skip to content

第 6 章 · 权限模型与安全设置

本章目标:理解 Claude Code 的权限模型,掌握 allowedTools/deny 配置、项目信任机制与密钥保护,遵循最小权限原则安全地使用 AI 编码助手。

6.1 权限模型概述

Claude Code 采用分层权限模型:默认情况下,读取文件和搜索代码不需要确认,但写入文件、执行 Bash 命令、安装依赖等"有副作用"的操作需要用户逐次批准。

text
┌──────────────────────────────────────────────┐
│              权限层级                          │
├──────────────────────────────────────────────┤
│ 只读操作(自动允许)                            │
│   Read / Grep / Glob / LS                    │
├──────────────────────────────────────────────┤
│ 写入操作(需批准或预配置)                       │
│   Write / Edit / NotebookEdit                │
├──────────────────────────────────────────────┤
│ 执行操作(需批准或预配置)                       │
│   Bash / WebFetch / mcp__*                   │
├──────────────────────────────────────────────┤
│ 危险操作(始终需人工确认)                       │
│   rm -rf / curl | sh / 密钥访问               │
└──────────────────────────────────────────────┘

设计理念

Anthropic 的安全哲学是"默认安全,显式放开"——你告诉 Claude 它能做什么,而不是列出它不能做什么。这比黑名单模式更不容易遗漏。

6.2 allowedTools:预授权工具

.claude/settings.json(项目级)或 ~/.claude/settings.json(全局级)中配置:

json
{
  "permissions": {
    "allow": [
      "Bash(npm run test:*)",
      "Bash(git commit:*)",
      "Bash(git push origin feature/*)",
      "Edit",
      "Write"
    ],
    "deny": [
      "Bash(rm -rf:*)",
      "Bash(curl * | sh)",
      "Read(.env*)",
      "Read(**/*.pem)"
    ]
  }
}

常用规则语法:

规则含义
Bash(git commit:*)允许所有以 git commit 开头的命令
Edit允许所有文件编辑
WebFetch(domain:api.github.com)仅允许请求该域名
mcp__github__create_issue允许调用特定 MCP 工具
Read(.env*)禁止读取环境变量文件

6.3 --dangerously-skip-permissions

bash
# 跳过所有权限检查 — 极度危险!
claude --dangerously-skip-permissions

这个标志会跳过所有工具调用确认。适用场景极其有限:

  • ✅ 在 Docker 容器内运行隔离任务;
  • ✅ CI/CD 流水线中受限环境下的自动化;
  • ❌ 在宿主机上日常开发——绝对不要
dockerfile
# Dockerfile — 安全的无人值守示例
FROM node:20-slim
RUN curl -fsSL https://claude.ai/install.sh | bash
WORKDIR /workspace
COPY . .
CMD ["claude", "-p", "Run all tests and fix failures", \
     "--dangerously-skip-permissions"]

容器内即使 Claude 做了破坏性操作,也只影响容器层,不波及宿主机。

6.4 项目信任机制

首次进入一个新目录时,Claude Code 会弹出信任提示:

text
⚠️ Do you trust the files in this folder?
   /home/user/new-project

   Files from untrusted sources may contain malicious
   instructions that could affect Claude's behavior.

选择"Yes, proceed"后:

  • 该目录被标记为已信任;
  • 项目级 .claude/settings.json 中的规则才会生效;
  • CLAUDE.md 中的自定义指令才会加载。

克隆仓库的安全风险

从 GitHub 克隆他人项目时,恶意仓库可能在 .claude/settings.json 中注入危险规则,或在 CLAUDE.md 中嵌入提示注入指令。永远先审查再信任

bash
git clone https://github.com/xxx/repo.git
cd repo

# 先看有没有可疑配置
cat .claude/settings.json 2>/dev/null
cat CLAUDE.md 2>/dev/null | head -30

# 确认无异常后再启动
claude

6.5 最小权限原则实践

场景一:只让 Claude 写代码,不让它跑命令

json
{
  "permissions": {
    "deny": ["Bash"]
  }
}

场景二:只读分析——禁止一切修改

bash
claude --allowedTools "Read,Grep,Glob,LS" \
       -p "分析这个项目的架构并输出报告"

场景三:限定可编辑范围

json
{
  "permissions": {
    "allow": [
      "Edit(src/**)",
      "Write(src/**)",
      "Bash(npm test:*)"
    ],
    "deny": [
      "Edit(infrastructure/**)",
      "Write(.env*)"
    ]
  }
}

6.6 密钥与环境变量保护

Claude Code 可能通过 Read 或 Bash 接触到敏感信息。防护策略:

json
{
  "permissions": {
    "deny": [
      "Read(.env)",
      "Read(.env.local)",
      "Read(**/secrets/**)",
      "Read(**/*credential*)",
      "Bash(echo $AWS_SECRET_ACCESS_KEY)",
      "Bash(cat *key*)"
    ]
  }
}

额外建议:

  1. 使用 .claudeignore 类似 .gitignore,排除敏感目录不被索引;
  2. 密钥管理工具:用 direnv 或 Vault 注入环境变量,而非明文存储;
  3. 定期审计:检查 ~/.claude/projects/ 下是否有意外记录的敏感对话内容。

本章小结

  • 权限三层级:只读自动放行 → 写入需批准 → 危险始终确认;
  • settings.jsonallow/deny 数组实现细粒度控制;
  • --dangerously-skip-permissions 仅限容器等隔离环境;
  • 新目录必须通过信任提示才加载项目级配置;
  • 永远遵循最小权限原则,用 deny 列表保护密钥文件。

🧪 随堂测验

点击你认为正确的选项。答错时会展示正确答案与原因解析。

1. Claude Code 默认允许哪些操作无需用户确认?

2. --dangerously-skip-permissions 标志的合理使用场景是?

3. 为什么克隆第三方仓库后不应立即信任该项目?

4. 以下哪条 deny 规则能有效保护 AWS 密钥?

🛠️ 动手实践

  1. 为你的项目创建 .claude/settings.json:允许 npm testgit commit,但拒绝读取 .env 文件。
  2. claude --allowedTools "Read,Grep,Glob" 启动只读模式,让它分析项目架构。
  3. 审查一个开源项目的 .claude/settings.jsonCLAUDE.md,评估是否存在安全隐患。

完成练习后,进入下一章:多轮会话与上下文管理