Claude Code的权限系统默认配置往往过于宽松,多数开发者可能仅仅点击了“是,不再询问”,这无形中留下了安全隐患。每个自动批准的命令都会永久保存在项目设置中,每个未配置的工具都以最大权限运行。结果是,AI助手获得了比团队中任何人类成员都更多的文件系统和网络访问权限。
本文将深入探讨5种有效的权限模式,帮助您正确锁定Claude Code的访问权限,从基础的拒绝规则到操作系统级别的沙盒机制。
模式一:settings.json 中的“拒绝优先”规则
Claude Code在评估权限规则时遵循严格的顺序:先检查拒绝(deny),然后询问(ask),最后允许(allow)。规则按类别评估:所有拒绝规则首先被检查,然后是询问规则,最后是允许规则。无论在JSON数组中的顺序或位于哪个设置文件中,拒绝规则的优先级始终高于允许规则。
以下是一个入门配置示例,它能阻止访问敏感信息、限制网络工具,并仅允许您的构建命令运行:
{
"permissions": {
"deny": [
"Read(./.env)",
"Read(./.env.*)",
"Read(./secrets/**)",
"Bash(curl *)",
"Bash(wget *)",
"Bash(git push --force *)",
"Bash(rm -rf *)"
],
"allow": [
"Bash(npm run lint)",
"Bash(npm run test *)",
"Bash(git commit *)",
"Bash(python -m pytest *)",
"Bash(ruff check *)"
]
}
}
将此配置保存到项目根目录下的 .claude/settings.json 文件中。它会被版本控制系统跟踪,确保团队中的每位开发者都继承相同的权限限制。
此配置有三个关键点需要注意:
- 通配符模式使用
*。例如,Bash(npm run test *)会匹配npm run test unit、npm run test --verbose等任何变体。*前的空格强制了词边界,即Bash(npm *)会匹配npm run build但不匹配npmx。 Read和Edit规则遵循.gitignore语法。例如,Read(./.env.*)会阻止.env.local、.env.production以及所有dotenv变体。Read(./secrets/**)会递归阻止secrets目录下的一切。- 拒绝规则主要阻止内置工具,而非Bash子进程。一个
Read(./.env)拒绝规则会阻止Read工具,但不会阻止在Bash中执行cat .env。要实现全面保护,需要同时拒绝二者(例如添加Bash(cat .env)),或启用沙盒机制(参见模式四)。
模式二:四层设置分级体系
Claude Code 从四个来源加载设置,并按照以下优先级顺序进行评估:
- 托管设置 (Managed settings):由管理员部署,不可被覆盖。
- 命令行参数 (Command line arguments):例如
--allowedTools,--disallowedTools。 - 本地项目设置 (Local project settings):
.claude/settings.local.json,通常会被.gitignore忽略。 - 共享项目设置 (Shared project settings):
.claude/settings.json,会提交到版本控制。 - 用户设置 (User settings):
~/.claude/settings.json,全局生效。
如果一个工具在优先级较高的层级被拒绝,那么在较低层级中即使有允许的设置,该工具也仍将被拒绝。