前两篇文章我们建立了 Claude Code 作为自主工程搭档的认知,并搭建了让它持久理解项目的记忆系统。从这一篇开始,我们将正式进入工程实践。但在将 Claude Code 接入生产级项目之前,有一个必须回答的问题:你给了它多大的权限?你确定它不会在你不知情的情况下,删除一个配置文件、暴露一个密钥,或者向一个外部地址发送代码片段吗?
这不是杞人忧天。Claude Code 在终端中运行,拥有读写文件、执行 Shell 命令、发起网络请求的能力。这些能力是它强大的来源,也是风险积累的位置。忽视权限配置和安全边界,就像把一台无人值守的推土机开进你的代码库------可能在高效地铲平障碍,也可能在某个瞬间碾过你未曾设防的关键文件。
1. 理解 Claude Code 的权限模型:不是开或关,而是一张可调节的权限清单
Claude Code 不是一个简单的"允许/禁止"二元开关。它的权限体系是一组可逐项配置的许可策略,覆盖文件读写、命令执行、网络访问、工具使用等多个维度。你可以像配置一个微服务的 RBAC 那样,精确地定义它在什么范围内可以自主行动,什么范围内必须获得你的批准。
1.1 三种权限模式
Claude Code 的命令执行和工具调用行为,由三个层级共同控制:
系统级权限策略
这是最顶层的护栏,通常定义在 Claude Code 的全局配置中。你可以通过 claude config 命令或直接编辑 ~/.claude/settings.json 来设置。系统级策略决定了 Claude Code 在所有项目中的行为基线。
项目级权限覆盖
在项目的 CLAUDE.md 或 .claude/settings.json 中,你可以针对特定项目收紧或放宽系统级配置。比如,你在系统级允许写入,但在某个遗产代码项目的项目级设置中禁止写入,或者至少要求每次写入都需批准。
项目级配置的优先级高于系统级,这意味着你可以为风险较高的项目设置更严格的边界,而不影响其他日常项目的工作流程。
会话级临时许可
某些操作需要一次性的临时许可,比如"这次任务需要你执行一个数据库迁移脚本,我允许你这样做,但仅限本次会话"。Claude Code 支持在对话中通过自然语言授予临时权限,或者在被拦截时由你手动批准单次执行。这类许可不写入任何配置文件,会话结束后即失效。
2. 权限核心配置属性
- defaultMode(默认权限模式)
决定 Claude 在遇到未明确定义的规则时的默认行为。常见的模式包括:- default:危险操作询问,其他允许。
- acceptEdits:自动允许文件编辑,但 Bash 命令等高风险操作仍会询问。
- bypassPermissions:绕过所有权限检查(极度危险,仅限受信任的沙箱或 CI 环境)。
- plan:计划模式,只分析不执行任何修改。
- allow(白名单)
一个字符串数组,列出 Claude 可以直接执行而无需询问的工具或命令。
例如:"Bash(git status)", "Read", "Edit(src/**)"。 - deny(黑名单)
一个字符串数组,列出 Claude 绝对禁止执行的工具或命令。此属性的优先级最高,一旦命中,即使 allow 中有相关规则也会被拦截。
例如:Bash(rm -rf *) , Read(./.env)。
规则评估顺序
deny 优先,然后 allow。 第一个匹配的规则生效,后面的规则不再检查
常用工具名:Bash、Read、Write、Edit、MultiEdit、Glob、Grep、LS、WebFetch、WebSearch、Task
规则语法
json
工具名 匹配该工具的所有调用
工具名(*) 同上(显式通配)
工具名(过滤条件) 只匹配符合条件的调用
setting.json 示例
json
{
"permissions": {
"allow": [
"Bash(mvn --version)",
"Bash(mvn clean *)",
"Bash(mvn compile *)",
"Bash(mvn test *)",
"Bash(mvn package *)",
"Bash(mvn install *)",
"Bash(mvn dependency:*)",
"Bash(git status)",
"Bash(git log *)",
"Bash(git diff *)",
"Bash(git pull *)",
"Bash(git push *)",
"Bash(git add *)",
"Bash(git commit *)",
"Bash(git checkout *)",
"Bash(git branch *)",
"Bash(git merge *)",
"Bash(git stash *)",
"Bash(git reset *)",
"Bash(ls -la)",
"Bash(ls *)",
"Bash(which *)",
"Bash(java -version)",
"Bash(docker *)",
"Bash(find *)",
"Bash(echo *)",
"Bash(cat *)",
"Edit",
"Write",
"WebFetch"
],
"ask": [
"Bash(git push *)"
],
"deny": [
"Bash(rm -rf /)",
"Bash(chmod 777*)"
]
},
"models": {
"preferred": {
"deepseek-reasoner": {
"description": "Default model for this project"
}
}
}
}
2. 敏感文件保护:为你的密钥、凭证和配置建立防线
权限配置解决的是 Claude Code 能做什么的问题,但无法解决它能读到什么的问题。一个更大的安全隐患是:你的项目中有 .env 文件、API 密钥、数据库连接字符串、证书私钥等敏感信息。如果 Claude Code 在勘探代码时无意中将这些内容纳入上下文窗口,它们可能会:
被模型在训练数据中记忆;
在日志、会话快照中泄露;
被 AI 在生成代码建议时意外嵌入到注释或配置文件模板中。
此外,如果 Claude Code 有写入权限,它可能无意中修改或覆盖这些敏感文件,或者将含有密钥的代码提交到版本控制。
2.1 必须预先建立的文件黑名单
在项目的 CLAUDE.md 或 .claude/settings.json 中,明确声明 Claude Code 不得读取的文件或目录。一个全面的黑名单至少应包含:
text
禁止读取的文件/目录:
- .env
- .env.*
- *.pem
- *.key
- *.p12
- *.pfx
- secrets/
- credentials/
- config/credentials.yml
- src/main/resources/application-prod.yml (如包含生产数据库连接信息)
- .ssh/
- .aws/
- kubeconfig*
在 Claude Code 中,默认情况下它已经会尊重 .gitignore 文件中的规则。如果你发现它没有生效,可以在setting.json 中添加 "respectGitignore": true
2.2 环境变量的安全处理
Claude Code 在执行命令时,可以访问 Shell 环境中配置的所有环境变量。如果你的终端会话中导出了 DATABASE_URL、AWS_SECRET_ACCESS_KEY 等变量,Claude Code 就能"看到"它们。
实践建议:
- 使用 Claude Code 时,不要将生产环境的凭证导出到同一个终端会话。
- 为 AI 协作创建专用的 .env.dev 文件,只包含开发/测试环境的凭据。
- 如果 Claude Code 需要连接开发数据库,使用一个权限受限的只读开发账户,而非管理员的完整权限。
2.3 确保安全约束不被上下文稀释
这是上一篇长上下文文章中讨论过的隐蔽风险,值得在此强化:当会话历史变得极长时,你在 CLAUDE.md 中设定的安全约束可能因为处于上下文的"远距离"位置而权重降低。模型更倾向于关注近期的对话指令,可能"忘记"早期设定的禁止规则。
双重防护:
在 CLAUDE.md 中,使用显眼的标记如 ## [安全约束 - 强制遵守] 来标注关键规则。
在对话中定期重申关键的安全约束,尤其是执行涉及文件系统、网络、数据库的高风险任务前。
3. setting.json 和setting.local.json
在 Claude Code 中,settings.json 和 settings.local.json 的核心区别在于 是否提交到 Git(是否共享给团队) 以及 配置的作用范围。简单来说,settings.json 是写给团队看的"公共规则",而 settings.local.json 是你自己的"私人偏好"。
以下是两者的详细区别及配置建议:
核心区别对比
| 特性 | settings.json | settings.local.json |
|---|---|---|
| Git 提交 | ✅ 需要提交(团队共享) | ❌ 不提交(自动加入 .gitignore) |
| 作用范围 | 团队所有成员生效 | 仅当前开发者的本地环境生效 |
| 配置内容 | 团队统一的规范、基础权限、公共指令 | 个人 API Key、私有路径、个人调试习惯 |
| 优先级 | 较低(会被 local 覆盖) | 较高(覆盖 settings.json 的配置) |
结语
本文中,我们建立了一套从系统级到项目级再到会话级的三层权限体系,划定了敏感文件的保护边界,规范了团队协作时的安全实践。这一切的最终目的不是限制 Claude Code 的能力,而是让你能够放心地赋予它更多的自主权。当你知道它触碰不到你的密钥、删不掉你的核心配置、绕不过你的代码审查流程时,你才敢于把更大的任务交付给它。