权限与安全配置
前四章我们已经深入了 Claude Code 的核心用法。这一章来谈谈安全——Claude Code 拥有读取文件、修改代码、执行命令的能力,如果不加控制,这些能力可能会带来风险。权限系统就是用来解决这个问题的。
权限系统概述
Claude Code 的权限系统本质上是一个 命令执行管控机制。当 Claude 在执行对话过程中需要运行 shell 命令时,系统会根据配置决定是自动放行、询问用户还是直接拒绝。
权限系统分为三个层级:
| 层级 | 名称 | 行为 |
|---|---|---|
| 允许 (Allow) | 命令自动执行,不弹确认 | 适合读操作和低风险命令 |
| 询问 (Prompt) | 弹确认对话框,让用户决定 | 默认行为,适合大部分命令 |
| 拒绝 (Deny) | 命令直接拦截,无法执行 | 适合高风险或危险命令 |
默认情况下,所有命令都处于"询问"状态。你需要主动将常用命令加入 Allow 列表,将危险命令加入 Deny 列表。
权限配置位置
权限配置存储在 .claude/settings.json 中:
{
"permissions": {
"allow": [
"npm *",
"git *",
"cat *",
"ls *",
"node *",
"npx *"
],
"deny": [
"sudo *",
"rm -rf *",
"chmod *",
"curl *"
]
}
}
注意:allow 和 deny 中写的是 命令模式的通配符,不是具体的命令。"npm *" 意味着所有以 npm 开头的命令都可以自动执行。
全局配置 vs 项目配置
权限配置可以在两个级别设置:
- 项目级别:
.claude/settings.json,仅对当前项目生效 - 用户级别:
~/.claude/settings.json,对所有项目生效
用户级别的设置优先级低于项目级别。也就是说,你可以先在全局放行一些通用命令,然后针对特定项目收紧或放宽权限。
用户级别配置示例:
mkdir -p ~/.claude
cat > ~/.claude/settings.json << 'EOF'
{
"permissions": {
"allow": ["ls *", "cat *", "pwd", "git status", "git diff *"],
"deny": ["sudo *", "rm -rf /", "> /dev/*"]
}
}
EOF
敏感操作权限控制
文件系统操作
Claude Code 的文件操作分为两类:
- 读写项目文件:默认允许。Claude Code 会编辑项目目录下的文件。
- 读写项目外文件:需要用户确认。如果 Claude 试图读取
/etc/passwd或~/ssh/config,系统会弹确认框。
你可以通过调整 deny 列表来加强文件安全:
{
"permissions": {
"deny": [
"rm -rf *",
"mv *",
"chmod *",
"chown *",
"> *"
]
}
}
这些规则意味着任何删除、移动、修改权限或重定向覆盖的操作都需要你手动确认。
网络操作
Claude Code 可以执行 curl、wget 等网络命令。这在安装依赖或调用 API 时很有用,但也要防止意外操作:
{
"permissions": {
"deny": [
"curl * --data *",
"curl * -d *",
"wget * --post-data=*"
]
}
}
这样配置后,带数据的 POST 请求会被拦截,而单纯的 GET 请求可以放行。
Shell 操作
高危 shell 操作包括管道、重定向、后台进程等。一个合理的 deny 配置应该拦截:
sudo相关命令- 管道到系统关键区域(如
| sudo) - 向 /etc、/usr 等系统目录写入的命令
- 安装全局包(
npm install -g可以设置为询问)
沙箱模式
沙箱模式是 Claude Code 的更高级安全机制。开启后,Claude Code 在临时环境中运行,对项目的修改不会直接影响到实际文件系统。
沙箱配置
{
"sandbox": {
"enabled": true,
"tempDir": "/tmp/claude-sandbox",
"autoSync": false
}
}
沙箱模式 vs 普通模式
| 特性 | 普通模式 | 沙箱模式 |
|---|---|---|
| 文件修改 | 直接写入项目文件 | 写入临时目录 |
| 命令执行 | 在项目目录中执行 | 在沙箱环境执行 |
| 网络访问 | 不受限制 | 受沙箱限制 |
| 切换成本 | 无 | 需要手动同步回项目 |
| 适用场景 | 日常开发 | 实验性修改、不信任的脚本 |
沙箱模式适合以下场景:
- 评估 Claude Code 的能力:初次使用,不确定它会做什么
- 处理不熟悉的项目:对项目结构不熟,担心误操作
- 高风险操作:删除数据、批量重命名等
- 团队共享环境:多人共用一台开发机时防止互相影响
使用沙箱
启动沙箱模式后,Claude Code 的所有操作都在临时目录中进行。完成工作后,你需要手动检查变化并同步:
# 查看沙箱与项目的差异
diff -r /tmp/claude-sandbox /path/to/project
# 有选择地同步
cp /tmp/claude-sandbox/src/components/Button.tsx src/components/Button.tsx
设置 autoSync: true 可以让 Claude Code 在退出时自动同步修改,但这会降低沙箱的安全性——如果自动同步,那出问题时就没有回退余地了。
权限审批流程
当 Claude 尝试执行一个不在 allow 列表中、但也没有被 deny 列表拦截的命令时,终端会弹出确认信息,格式如下:
Claude 想要执行以下命令:
> npm install axios
[Y] 允许执行
[A] 允许本次会话中所有类似的命令
[D] 拒绝
[S] 查看详细信息
各选项的含义:
- Y (Yes):仅允许本次执行,下次同样的命令仍会弹框
- A (Allow):将该命令加入当前会话的 allow 列表,本次会话不再弹框
- D (Deny):拒绝本次执行
- S (Show details):查看命令的完整参数和执行路径
审批日志
所有权限审批操作都会记录在 .claude/sessions/ 的会话文件中。你可以随时查看:
# 查看最近一次会话的审批记录
cat .claude/sessions/$(ls -t .claude/sessions/ | head -1) | grep "permission"
这在你需要审计 Claude Code 的操作历史时很有用。
实战:配置安全的开发环境
综合以上内容,这里是一个推荐的团队开发环境权限配置。
项目级 settings.json
{
"permissions": {
"allow": [
"ls *",
"cat *",
"head *",
"tail *",
"grep *",
"find *",
"npm run *",
"npx * --run",
"git status",
"git diff *",
"git log *",
"git branch *",
"node --eval *"
],
"deny": [
"sudo *",
"rm -rf *",
"chmod *",
"chown *",
"mv /*",
"> /*",
"curl * | bash",
"wget * -O - | sh",
"npm install -g *",
"pip install --system *"
]
},
"context": {
"autoCompact": true
}
}
安全使用原则
- 最小权限原则:只放行你确定安全的命令。不确定的保持"询问"状态。
- 定期审计权限:每个月检查一次 settings.json,移除不再需要的 allow 条目。
- 不要放行危险通配符:
"rm *"覆盖范围太广,不要使用。应该具体到"rm temp/*"。 - 敏感项目单独配置:涉及生产数据库、支付系统、用户数据的项目,权限应该更严格。
- 版本控制 .claude/:将
.claude/settings.json加入版本控制,让团队共享安全配置。建议在.gitignore中只排除.claude/sessions/,保留.claude/settings.json。
至此,Claude Code 五章教程全部结束。从安装配置到项目初始化,从 CLAUDE.md 上下文管理到权限安全体系,你已经掌握了在日常开发中高效使用 Claude Code 所需的全部知识。实际使用中遇到问题不要紧,记住 /help 命令随时可以查看完整文档。