第三篇-设置Claude code 安全边界:给自己的项目装上一套安全带

前两篇文章我们建立了 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 的能力,而是让你能够放心地赋予它更多的自主权。当你知道它触碰不到你的密钥、删不掉你的核心配置、绕不过你的代码审查流程时,你才敢于把更大的任务交付给它

相关推荐
UXbot2 小时前
2026年文字转原型AI工具推荐:输入一句需求描述,自动生成多页面可交互界面
前端·低代码·ui·交互·ai编程·原型模式
人道领域3 小时前
2026 AI编程助手终极选型指南(Claude Code vs Codex vs Gemini):国内外智能体与大模型全景对比,性价比最高的选择
人工智能·ai编程·claude·gemini
AI原来如此3 小时前
2026最新Cursor零基础上手教程
ai·大模型·ai编程
JavinLu4 小时前
用idea的后端,切换到qoder编辑器以及maven配置
maven·intellij-idea·ai编程·qoder
叶沧ii大数据全栈呀4 小时前
【数据智能】从“提需求等排期“到“数据追着人跑“:数据中台到Data Agent的变革复盘
大数据·人工智能·ai编程
甲维斯12 小时前
Claude“山寨版”来了,支持中文,可配“任意模型”
人工智能·ai编程
kyriewen12 小时前
百度用6%成本碾压硅谷?中国AI把性价比玩明白了
前端·百度·ai编程
jump_jump12 小时前
把一份前端 checklist 变成 AI 的 Skill:让 CR 不再靠记忆
性能优化·ai编程·代码规范
lulu121654407815 小时前
JetBrains IDE 终极AI编程方案:CC GUI插件让Claude Code和Codex丝滑运行
java·ide·人工智能·python·ai编程