Skip to content

第 9 章:权限与安全

本章概览

Claude Code 是一个强大的工具——它可以读写文件、执行命令、访问外部服务。能力越大,责任越大。本章将详细介绍 Claude Code 的权限体系,帮助你理解如何在效率安全之间取得平衡。

学习目标

  • 理解 Claude Code 的三种权限模式
  • 学会配置工具级别的权限控制
  • 掌握文件和目录的访问限制方法
  • 了解安全最佳实践
  • 掌握企业环境下的权限管理策略

9.1 为什么要关注权限?

9.1.1 一个真实的场景

想象一下这个场景:

你:帮我清理项目中的临时文件

Claude:好的,我来清理。
[执行 rm -rf /important/production/data]   ← 如果没有权限限制...

虽然 Claude 通常不会做出这么危险的操作,但在没有权限控制的情况下,一个不小心的指令可能导致严重后果。

权限系统就像是给 Claude Code 加上了安全带——让它既能高效工作,又不会造成意外伤害。

9.1.2 权限的核心理念

权限管理的核心问题:

1. Claude 可以执行哪些操作?(工具权限)
2. Claude 可以访问哪些文件?(文件权限)
3. 每次操作需要你的确认吗?(审批模式)
4. 在什么范围内授予权限?(作用域)

9.2 三种权限模式

Claude Code 提供了三种主要的权限模式,从最严格到最宽松:

9.2.1 模式一览

严格 ◄────────────────────────────────────────────────────────────► 宽松

  Plan Mode      Default Mode      Auto-accept edits       Full Auto
  (规划模式)      (默认模式)         (自动接受编辑)           (全自动模式)

  只读,不做改动   每次操作请求确认    文件编辑自动执行,       自动执行所有操作
                                    其他操作仍需确认

Shift+Tab 可在前三种模式间循环切换:
Normal Mode → Auto-accept edits → Plan Mode → Normal Mode ...
模式安全级别效率适用场景
Plan Mode最高较低了解项目、制定方案
Default Mode中等中等日常开发、谨慎操作
Auto-accept edits中低较高信任文件编辑、加速编码
Full Auto较低最高可信环境、重复任务

9.2.2 Plan Mode(规划模式)

Plan Mode 是最安全的模式——Claude 只能读取和分析,不能做任何修改。

特点:

  • 只能读取文件、搜索代码
  • 不能写入文件、不能执行命令
  • 专注于分析和制定方案
  • 适合"先看看,再决定"的场景

启用方式:

bash
# 使用 Shift+Tab 快捷键在对话中循环切换三种模式:
# Normal Mode → Auto-accept edits → Plan Mode → Normal Mode ...
# 或者在交互界面中输入
> /plan

使用场景示例:

[Plan Mode 开启]

你:帮我分析一下这个项目的架构,告诉我主要模块有哪些

Claude:我来分析项目结构:

📁 项目架构分析:
├── src/
│   ├── components/    # 32 个 React 组件
│   ├── pages/         # 8 个页面
│   ├── api/           # 12 个 API 接口
│   ├── hooks/         # 5 个自定义 Hook
│   └── utils/         # 工具函数
├── tests/             # 单元测试
└── config/            # 配置文件

主要模块:
1. 用户认证模块(src/components/Auth/)
2. 产品管理模块(src/components/Product/)
3. 订单处理模块(src/components/Order/)
...

建议的优化方向:
1. components/ 目录较大,建议按功能模块拆分
2. api/ 层缺少统一的错误处理
3. 部分组件缺少测试覆盖

PM 最佳实践

作为产品经理,在不熟悉一个项目时,强烈建议先用 Plan Mode。你可以安全地浏览和理解代码,不用担心意外改动任何东西。

9.2.3 Default Mode(默认模式)

Default Mode 是 Claude Code 的标准工作模式——Claude 可以做任何操作,但每次需要你的确认

特点:

  • 读取文件:自动执行,无需确认
  • 写入文件:需要你确认
  • 执行命令:需要你确认
  • 最平衡的模式

工作流程:

你:帮我在 index.js 中添加一个新的路由

Claude:我需要修改 src/index.js 文件,添加以下路由:

[预览变更内容]

? 是否允许修改这个文件? (Y/n)
  Y - 允许这次修改
  n - 拒绝这次修改

权限提示界面说明:

Claude wants to execute a command:

  npm install axios

  Allow? (y/n/a)

  y - 允许执行这一次
  n - 拒绝执行
  a - 允许执行,并且以后对类似操作也自动允许

选择 "a"(Always Allow)

当你选择 "a" 时,这个权限记忆会保存在当前会话中。对于常用的安全操作(如 npm installgit status),选择 "a" 可以减少重复确认。

9.2.4 Full Auto Mode(全自动模式)

Full Auto Mode 让 Claude 跳过所有确认,自动执行所有操作。

启用方式:

bash
# 启动时指定(这是唯一开启 Full Auto 的方式)
claude --dangerously-skip-permissions

allowedTools 不等于 Full Auto

--allowedTools 参数只是预先批准特定工具的自动执行权限,未列出的工具仍然需要逐一确认。它不会跳过所有权限检查,因此不等同于 Full Auto 模式。只有 --dangerously-skip-permissions 才能真正跳过所有权限确认。

安全警告

--dangerously-skip-permissions 这个参数名本身就在提醒你——这是危险的。只在以下情况下使用:

  • 你完全信任当前环境
  • 你确定 Claude 要做的操作不会造成损害
  • 在 CI/CD 等受控环境中
  • 做简单的、风险低的重复任务

绝对不要在以下情况下使用:

  • 生产环境
  • 包含敏感数据的目录
  • 你不确定 Claude 会做什么的时候

适用场景:

✅ 适合使用 Full Auto 的场景:
- 批量格式化代码文件
- 在测试项目中快速原型开发
- CI/CD Pipeline 中的自动化任务
- 生成大量模板文件

❌ 不适合使用 Full Auto 的场景:
- 处理生产数据
- 修改配置文件
- 执行删除操作
- 不确定结果的操作

9.3 工具权限控制(allowedTools)

9.3.1 什么是 allowedTools

除了三种大的权限模式,Claude Code 还允许你精细控制每个工具的权限。这就像给每把钥匙单独设定哪些门可以开。

9.3.2 可控制的工具列表

工具名称功能风险级别
Read读取文件
Glob搜索文件名
Grep搜索文件内容
Write写入/创建文件
Edit编辑现有文件
Bash执行 shell 命令
WebFetch获取网页内容

9.3.3 配置方式

在 settings.json 中配置:

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write"
  ]
}

这个配置的意思是:Claude 可以自动执行 Read、Glob、Grep、Edit、Write 操作,不需要逐一确认。但没有列出的工具(如 Bash)仍然需要确认。

disallowedTools:显式禁用工具

除了 allowedTools,settings.json 还支持 disallowedTools 字段,用于显式禁止某些工具。被禁止的工具即使用户手动确认也无法执行:

json
{
  "disallowedTools": [
    "Bash",
    "WebFetch"
  ]
}

disallowedTools 的优先级高于 allowedTools——如果同一个工具同时出现在两个列表中,它会被禁止。

9.3.4 带条件的工具权限

你可以为工具权限添加条件限制:

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write",
    "Bash(npm test)",
    "Bash(npm run lint)",
    "Bash(git status)",
    "Bash(git diff)"
  ]
}

Bash(command) 语法说明:

  • Bash(npm test) —— 允许自动执行 npm test
  • Bash(git status) —— 允许自动执行 git status
  • 只有匹配的命令会被自动执行,其他 Bash 命令仍需确认

PM 推荐配置

如果你主要用 Claude Code 做分析和文档工作,推荐以下配置:

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "WebFetch"
  ]
}

这样 Claude 可以自由地读取和搜索文件,但写入操作需要你确认。

9.3.5 配置作用域

工具权限配置同样分为项目级和用户级:

项目级(团队共享) (.claude/settings.json):

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write",
    "Bash(npm test)",
    "Bash(npm run build)"
  ]
}

项目级(个人) (.claude/settings.local.json):

此文件用于个人的项目级配置,默认被 .gitignore 忽略,不会提交到仓库。适合存放个人偏好设置,不影响团队其他成员:

json
{
  "allowedTools": [
    "Bash(git push)",
    "Bash(npm run dev)"
  ]
}

用户级 (~/.claude/settings.json):

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "WebFetch"
  ]
}

配置合并规则

项目级(.claude/settings.json)、项目级个人(.claude/settings.local.json)和用户级(~/.claude/settings.json)的 allowedTools合并。也就是说,在任一级别中允许的工具,都会被允许。.claude/settings.local.json 适合存放不想提交到仓库的个人偏好。


9.4 文件与目录访问限制

9.4.1 默认行为

默认情况下,Claude Code 可以访问当前项目目录及其子目录中的所有文件。但有些文件你可能不希望 Claude 访问或修改。

9.4.2 使用 .claudeignore

类似于 .gitignore,你可以创建 .claudeignore 文件来告诉 Claude 哪些文件或目录不要访问:

bash
# .claudeignore 文件示例

# 忽略环境配置文件
.env
.env.*

# 忽略密钥和证书
*.key
*.pem
*.cert
credentials/

# 忽略构建产物
dist/
build/
node_modules/

# 忽略日志
*.log
logs/

# 忽略特定的敏感目录
secrets/
config/production/

9.4.3 通过 Hooks 保护文件

在上一章我们学过,可以使用 PreToolUse Hook 来阻止对特定文件的修改:

json
{
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_FILE_PATH\" | grep -qE '(\\.env|\\.secret|config/production)'; then echo 'BLOCKED' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}

9.4.4 两种方式的对比

对比维度.claudeignoreHooks 拦截
粒度文件/目录级别可自定义任何条件
效果Claude 完全看不到这些文件Claude 能看到但不能修改
配置复杂度简单(类似 .gitignore)稍复杂(需要写 shell 命令)
灵活性只能按路径/模式排除可以基于任何条件拦截
推荐场景排除无关文件(如 node_modules)保护特定敏感文件

9.5 安全最佳实践

9.5.1 最小权限原则

核心思想:只给 Claude 它完成任务所需的最小权限。

场景:你只需要 Claude 帮你分析代码
  → 用 Plan Mode,不给写入权限

场景:你需要 Claude 帮你修改代码
  → 用 Default Mode,每次修改你来确认

场景:你需要 Claude 批量生成测试文件
  → 可以开放 Write 权限,但限制 Bash 命令

9.5.2 敏感文件保护清单

以下文件类型应该重点保护:

🔒 必须保护的文件:
├── .env / .env.* ............... 环境变量(包含 API Key、密码)
├── *.key / *.pem ............... 密钥和证书
├── credentials.json ............ 凭据文件
├── config/production/* ......... 生产环境配置
├── *.secret .................... 密钥文件
└── docker-compose.prod.yml ..... 生产部署配置

⚠️ 建议保护的文件:
├── package-lock.json ........... 依赖锁定文件(避免意外修改)
├── CI/CD 配置 .................. 部署流程文件
├── database/migrations/* ....... 数据库迁移文件
└── scripts/deploy.sh ........... 部署脚本

9.5.3 安全配置模板

以下是一个推荐的安全配置模板:

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write",
    "Bash(npm test)",
    "Bash(npm run lint)",
    "Bash(npm run format)",
    "Bash(git status)",
    "Bash(git diff)",
    "Bash(git log)"
  ],
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_FILE_PATH\" | grep -qE '(\\.env|\\.key|\\.pem|\\.secret|credentials|config/production)'; then echo 'BLOCKED: 不允许修改敏感文件' >&2; exit 2; fi"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$(date '+%Y-%m-%d %H:%M:%S') [$CLAUDE_TOOL_NAME] $CLAUDE_FILE_PATH\" >> .claude/audit-log.txt"
          }
        ]
      }
    ]
  }
}

这个配置实现了:

  1. 工具权限 —— 允许文件读写,但只允许特定的安全 Bash 命令
  2. 文件保护 —— 阻止修改敏感文件
  3. 审计日志 —— 记录所有文件修改操作

9.5.4 团队安全规范建议

推荐的团队安全规范:

1. 【统一的 .claudeignore】
   所有项目都应该有 .claudeignore,排除敏感文件

2. 【项目级安全配置】
   在 .claude/settings.json 中配置安全 Hooks
   提交到 Git 仓库,确保团队一致

3. 【分级权限策略】
   - 查看/分析:Plan Mode
   - 日常开发:Default Mode + allowedTools
   - 自动化任务:仔细评估后使用 Full Auto

4. 【定期审查】
   - 定期检查 allowedTools 配置
   - 定期检查 MCP Server 列表
   - 定期轮换 API Token

5. 【教育培训】
   - 确保团队了解每种模式的风险
   - 不鼓励使用 --dangerously-skip-permissions

9.6 企业环境权限管理

9.6.1 企业面临的挑战

企业环境的特殊考虑:

1. 合规要求 —— 需要满足信息安全合规标准
2. 数据保护 —— 不能让 AI 访问或泄露敏感数据
3. 审计追踪 —— 需要记录所有 AI 辅助操作
4. 统一管理 —— 需要统一配置,不能各自为政
5. 接入控制 —— 控制谁可以使用什么功能

9.6.2 企业推荐配置方案

方案 1:只读分析模式(最安全)

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep"
  ]
}

适合:合规要求严格的环境、只需要代码审查和分析的场景。

方案 2:受控开发模式(平衡)

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write",
    "Bash(npm test)",
    "Bash(npm run lint)"
  ],
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_FILE_PATH\" | grep -qE '(\\.env|\\.key|\\.pem|credentials|/production/)'; then echo 'BLOCKED' >&2; exit 2; fi"
          }
        ]
      }
    ],
    "PostToolUse": [
      {
        "matcher": "Write|Edit|Bash",
        "hooks": [
          {
            "type": "command",
            "command": "echo \"$(date '+%Y-%m-%d %H:%M:%S') [$(whoami)] [$CLAUDE_TOOL_NAME] $CLAUDE_FILE_PATH\" >> /var/log/claude-audit.log"
          }
        ]
      }
    ]
  }
}

适合:日常开发团队、需要平衡效率和安全的场景。

方案 3:CI/CD 自动化模式

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write",
    "Bash"
  ]
}

适合:自动化流水线、受控的 CI/CD 环境。需要配合其他安全措施(如容器隔离、网络限制)。

9.6.3 通过管理策略统一配置

对于企业环境,可以通过以下方式统一管理配置:

bash
# 1. 在企业级设置中配置默认策略
# 管理员配置路径:/etc/claude/settings.json(Linux)
# 或通过企业策略部署

# 2. 通过 Git 仓库模板统一项目配置
# 在团队的项目模板中包含 .claude/settings.json

# 3. 通过 CI/CD 检查确保配置一致
# 在 CI/CD 流水线中检查 .claude/settings.json 是否符合企业标准

9.7 权限配置实战

9.7.1 练习 1:体验三种模式

目标:感受不同权限模式的区别。

第 1 步:启动 Plan Mode

bash
claude

在对话中按 Shift+Tab 循环切换模式(Normal Mode → Auto-accept edits → Plan Mode),切到 Plan Mode 后尝试:

你:帮我分析 src/ 目录的代码结构

Claude:[正常分析] 找到以下文件结构...

你:帮我在 src/ 下创建一个新文件 test.txt

Claude:[Plan Mode 下无法执行] 我目前处于 Plan Mode,只能读取和分析文件,
无法创建或修改文件。请切换到正常模式后再执行此操作。

第 2 步:切换到 Default Mode

继续按 Shift+Tab 切回 Normal Mode(默认模式):

你:帮我创建 src/test.txt,内容是 "hello world"

Claude:我将创建文件 src/test.txt,内容如下:
hello world

? 是否允许创建此文件? (y/n)

第 3 步:观察权限提示

注意观察每次操作时的权限确认提示,理解哪些操作需要确认,哪些不需要。

9.7.2 练习 2:配置 allowedTools

目标:配置工具权限,减少确认次数。

第 1 步:编辑项目配置

创建或编辑 .claude/settings.json

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write"
  ]
}

第 2 步:重启 Claude Code 并测试

你:帮我创建一个 hello.txt 文件

Claude:好的,我来创建文件。
[直接创建,无需确认 ✅]

你:帮我运行 ls 命令

Claude:我需要执行 shell 命令 ls。
? 是否允许? (y/n)
[Bash 不在 allowedTools 中,需要确认 ⚠️]

9.7.3 练习 3:配置安全防护

目标:保护敏感文件不被修改。

第 1 步:创建测试环境

bash
# 创建一个测试用的 .env 文件
echo "SECRET_KEY=my-super-secret" > .env

第 2 步:配置安全 Hook

编辑 .claude/settings.json

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write"
  ],
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_FILE_PATH\" | grep -qE '\\.env'; then echo 'BLOCKED: .env files are protected' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}

第 3 步:测试保护效果

你:帮我在 .env 文件中添加 NEW_VAR=test

Claude:我尝试修改 .env 文件,但被安全 Hook 拦截了。
.env 文件受到保护,无法通过 Claude Code 修改。
请手动编辑该文件。

9.8 不同角色的推荐配置

9.8.1 产品经理(分析为主)

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "WebFetch"
  ]
}

特点:可以自由浏览和搜索代码、获取网页信息,写入操作需要确认。

9.8.2 前端开发者

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write",
    "Bash(npm test)",
    "Bash(npm run lint)",
    "Bash(npm run dev)",
    "Bash(npm run build)",
    "Bash(git status)",
    "Bash(git diff)",
    "Bash(git add)"
  ],
  "hooks": {
    "PostToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_FILE_PATH\" | grep -qE '\\.(js|ts|jsx|tsx|css|json)$'; then npx prettier --write \"$CLAUDE_FILE_PATH\" 2>/dev/null || true; fi"
          }
        ]
      }
    ]
  }
}

9.8.3 后端开发者

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write",
    "Bash(npm test)",
    "Bash(go test ./...)",
    "Bash(python -m pytest)",
    "Bash(git status)",
    "Bash(git diff)"
  ],
  "hooks": {
    "PreToolUse": [
      {
        "matcher": "Write|Edit",
        "hooks": [
          {
            "type": "command",
            "command": "if echo \"$CLAUDE_FILE_PATH\" | grep -qE '(\\.env|config/prod|migrations/)'; then echo 'BLOCKED' >&2; exit 2; fi"
          }
        ]
      }
    ]
  }
}

9.8.4 DevOps / CI 环境

json
{
  "allowedTools": [
    "Read",
    "Glob",
    "Grep",
    "Edit",
    "Write",
    "Bash"
  ]
}

注意

CI/CD 环境虽然可以给较宽松的权限,但应该配合其他安全措施:

  • 运行在隔离的容器中
  • 限制网络访问
  • 使用只读的代码仓库
  • 限制可用的系统命令

9.9 权限问题排查

9.9.1 常见问题

问题 1:Claude 说"我没有权限执行此操作"

排查步骤:
1. 检查当前处于哪种模式(按 Shift+Tab 循环切换:Normal → Auto-accept edits → Plan Mode)
2. 检查 .claude/settings.json 中的 allowedTools 配置
3. 检查是否有 Hook 拦截了操作

问题 2:每次操作都要确认,很烦

解决方案:
1. 在 allowedTools 中添加常用的安全操作
2. 在确认提示中选择 "a"(Always Allow)
3. 对于完全信任的任务,考虑使用更宽松的权限配置

问题 3:Claude 修改了不应该修改的文件

解决方案:
1. 创建 .claudeignore 排除敏感文件
2. 添加 PreToolUse Hook 拦截对敏感文件的操作
3. 使用 git 来跟踪和恢复变更
4. 缩小 allowedTools 的范围

9.9.2 查看当前权限配置

bash
# 查看项目级配置
cat .claude/settings.json

# 查看用户级配置
cat ~/.claude/settings.json

# 查看实际生效的配置(项目级 + 用户级合并)
claude config list

9.10 安全检查清单

在开始使用 Claude Code 处理一个新项目之前,建议过一遍以下检查清单:

□ 1. 项目中是否有敏感文件(.env、密钥、证书)?
     → 如果有,创建 .claudeignore 或 PreToolUse Hook

□ 2. 你需要 Claude 做什么?
     → 只看不改:Plan Mode
     → 需要修改:Default Mode
     → 批量自动化:评估风险后使用 Full Auto

□ 3. 哪些操作是安全的、可以自动执行?
     → 配置 allowedTools

□ 4. 是否需要审计追踪?
     → 添加 PostToolUse Hook 记录操作日志

□ 5. 团队是否有统一的安全标准?
     → 使用项目级配置 .claude/settings.json
     → 提交到 Git 仓库

□ 6. 配置是否经过测试?
     → 测试 Hook 是否正常拦截
     → 测试权限是否按预期工作

9.11 本章小结

在本章中,我们学习了:

  1. 三种权限模式 —— Plan Mode(只读)、Default Mode(确认执行)、Full Auto(自动执行)
  2. 工具权限控制 —— 使用 allowedTools 精细控制每个工具的权限
  3. 文件访问限制 —— 使用 .claudeignore 和 Hooks 保护敏感文件
  4. 安全最佳实践 —— 最小权限、敏感文件保护、审计日志
  5. 企业环境管理 —— 分级策略、统一配置、合规要求
  6. 角色化配置 —— 为不同角色(PM、前端、后端、DevOps)定制权限方案

下一步

在下一章中,我们将进入最实用的部分——PM 实战场景。你将学会如何用 Claude Code 完成产品经理的日常工作,包括编写 PRD、竞品分析、数据分析、快速原型等。前面学到的所有知识(基础使用、CLAUDE.md、Plan Mode、MCP、Hooks、权限)都将在实战中综合运用!