Appearance
第 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 install、git status),选择 "a" 可以减少重复确认。
9.2.4 Full Auto Mode(全自动模式)
Full Auto Mode 让 Claude 跳过所有确认,自动执行所有操作。
启用方式:
bash
# 启动时指定(这是唯一开启 Full Auto 的方式)
claude --dangerously-skip-permissionsallowedTools 不等于 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 testBash(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 两种方式的对比
| 对比维度 | .claudeignore | Hooks 拦截 |
|---|---|---|
| 粒度 | 文件/目录级别 | 可自定义任何条件 |
| 效果 | 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"
}
]
}
]
}
}这个配置实现了:
- 工具权限 —— 允许文件读写,但只允许特定的安全 Bash 命令
- 文件保护 —— 阻止修改敏感文件
- 审计日志 —— 记录所有文件修改操作
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-permissions9.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 list9.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 本章小结
在本章中,我们学习了:
- 三种权限模式 —— Plan Mode(只读)、Default Mode(确认执行)、Full Auto(自动执行)
- 工具权限控制 —— 使用
allowedTools精细控制每个工具的权限 - 文件访问限制 —— 使用
.claudeignore和 Hooks 保护敏感文件 - 安全最佳实践 —— 最小权限、敏感文件保护、审计日志
- 企业环境管理 —— 分级策略、统一配置、合规要求
- 角色化配置 —— 为不同角色(PM、前端、后端、DevOps)定制权限方案
下一步
在下一章中,我们将进入最实用的部分——PM 实战场景。你将学会如何用 Claude Code 完成产品经理的日常工作,包括编写 PRD、竞品分析、数据分析、快速原型等。前面学到的所有知识(基础使用、CLAUDE.md、Plan Mode、MCP、Hooks、权限)都将在实战中综合运用!