权限与安全配置

前四章我们已经深入了 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 的文件操作分为两类:

  1. 读写项目文件:默认允许。Claude Code 会编辑项目目录下的文件。
  2. 读写项目外文件:需要用户确认。如果 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 普通模式

特性普通模式沙箱模式
文件修改直接写入项目文件写入临时目录
命令执行在项目目录中执行在沙箱环境执行
网络访问不受限制受沙箱限制
切换成本需要手动同步回项目
适用场景日常开发实验性修改、不信任的脚本

沙箱模式适合以下场景:

  1. 评估 Claude Code 的能力:初次使用,不确定它会做什么
  2. 处理不熟悉的项目:对项目结构不熟,担心误操作
  3. 高风险操作:删除数据、批量重命名等
  4. 团队共享环境:多人共用一台开发机时防止互相影响

使用沙箱

启动沙箱模式后,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
  }
}

安全使用原则

  1. 最小权限原则:只放行你确定安全的命令。不确定的保持"询问"状态。
  2. 定期审计权限:每个月检查一次 settings.json,移除不再需要的 allow 条目。
  3. 不要放行危险通配符"rm *" 覆盖范围太广,不要使用。应该具体到 "rm temp/*"
  4. 敏感项目单独配置:涉及生产数据库、支付系统、用户数据的项目,权限应该更严格。
  5. 版本控制 .claude/:将 .claude/settings.json 加入版本控制,让团队共享安全配置。建议在 .gitignore 中只排除 .claude/sessions/,保留 .claude/settings.json

至此,Claude Code 五章教程全部结束。从安装配置到项目初始化,从 CLAUDE.md 上下文管理到权限安全体系,你已经掌握了在日常开发中高效使用 Claude Code 所需的全部知识。实际使用中遇到问题不要紧,记住 /help 命令随时可以查看完整文档。