
让 AI 助手在企业环境中安全运行,不泄露敏感数据,不执行危险操作。
Claude Code 能读写文件、执行命令、调用 API。这种能力越强,安全风险越大。
企业使用最关心的问题:如何防止 AI 泄露密钥、破坏生产环境、执行未授权操作?
这篇文章系统梳理 Claude Code 的安全机制和最佳实践。
首先明确风险类型:
风险 | 场景 | 后果 |
|---|---|---|
密钥泄露 | Claude 读取 .env 并输出到对话 | 凭据暴露 |
文件篡改 | Claude 修改 package-lock.json | 依赖被污染 |
命令注入 | Claude 执行 rm -rf 或 git push --force | 数据丢失 |
越权访问 | Claude 通过 MCP 访问未授权资源 | 权限突破 |
上下文污染 | 恶意输入注入指令 | 行为劫持 |
核心原则:最小权限 + 显式确认 + 防护层。
Claude Code 默认不会读取这些文件:
.env
.env.*
*.pem
*.key
credentials.json
secrets.*
但这只是默认行为,Claude 仍可能被诱导读取。
用 Hooks 在工具执行前拦截敏感文件访问:
#!/bin/bash
INPUT=$(cat)
FILE_PATH=(echo "
SENSITIVE_PATTERNS=(
".env"
".env.local"
".env.production"
"credentials"
"secrets"
"*.pem"
"*.key"
"id_rsa"
"id_ed25519"
"*.p12"
"*.pfx"
"package-lock.json"
"yarn.lock"
"pnpm-lock.yaml"
)
for pattern in "${SENSITIVE_PATTERNS[@]}"; do
if [[ "
echo "🚫 Blocked:
exit 2 # exit 2 = 阻止操作
fi
done
exit 0 # exit 0 = 放行
配置到 settings.json:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Read|Edit|Write",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/protect-sensitive.sh"
}
]
}
]
}
}
即使读取了敏感文件,也要阻止 Claude 输出:
#!/bin/bash
INPUT=$(cat)
PATTERNS=(
"sk-[a-zA-Z0-9]{20,}" # OpenAI API Key
"sk-ant-[a-zA-Z0-9]{20,}" # Anthropic API Key
"ghp_[a-zA-Z0-9]{36}" # GitHub Token
"AKIA[0-9A-Z]{16}" # AWS Access Key
"[a-f0-9]{32}" # 可能的 MD5/Secret
)
for pattern in "${PATTERNS[@]}"; do
if echo "
echo "🚫 Output contains potential secret, blocked" >&2
exit 2
fi
done
exit 0
阻止高风险命令:
#!/bin/bash
INPUT=$(cat)
COMMAND=(echo "
DANGEROUS_PATTERNS=(
"rm -rf /"
"rm -rf ~"
"rm -rf *"
"git push --force"
"git reset --hard HEAD~"
"DROP TABLE"
"DROP DATABASE"
"TRUNCATE"
"DELETE FROM"
":(){:|:&};:" # Fork bomb
"chmod -R 777"
"chown -R"
"> /dev/sda"
"dd if="
"mkfs"
)
for pattern in "${DANGEROUS_PATTERNS[@]}"; do
if [[ "
echo "🚫 Dangerous command blocked: $COMMAND" >&2
exit 2
fi
done
exit 0
配置:
{
"hooks": {
"PreToolUse": [
{
"matcher": "Bash",
"hooks": [
{
"type": "command",
"command": "\"$CLAUDE_PROJECT_DIR\"/.claude/hooks/block-dangerous-commands.sh"
}
]
}
]
}
}
Claude Code 支持沙箱模式,限制文件系统和网络访问:
{
"permissions": {
"sandbox": {
"enabled": true,
"allowedPaths": ["/home/user/project"],
"allowedDomains": ["api.example.com"],
"deniedPaths": ["/etc", "/var", "~/.ssh"]
}
}
}
Claude Code 的权限分为三级:
级别 | 行为 | 适用场景 |
|---|---|---|
ask | 每次操作都请求确认 | 默认,最安全 |
allow | 自动允许,记录日志 | 可信操作 |
deny | 直接拒绝 | 危险操作 |
{
"permissions": {
"defaultMode": "ask",
"allow": [
"Read(**)",
"Bash(git status)",
"Bash(git diff)",
"Bash(npm test)",
"Bash(npm run lint)"
],
"deny": [
"Bash(rm -rf **)",
"Bash(git push --force)",
"Bash(sudo **)",
"Write(**/.env*)",
"Read(**/.env*)"
]
}
}
在项目级 .claude/settings.json 中覆盖:
{
"permissions": {
"allow": [
"Bash(docker compose up)",
"Bash(docker compose down)"
],
"deny": [
"Bash(docker system prune -a)"
]
}
}
在 CLAUDE.md 中声明项目安全约束:
## Security
<critical>
- NEVER read or output .env files
- NEVER commit secrets to git
- NEVER use --force flags on git commands
- ALWAYS ask before running database migrations
- ALWAYS use parameterized queries for SQL
</critical>
## Protected Files
The following files are off-limits:
- `.env.*` - Environment variables
- `credentials.json` - Service account keys
- `secrets/` - Secret storage
## Allowed Commands
Safe commands that can run without confirmation:
- `npm test`
- `npm run lint`
- `git status`
- `git diff`
## Forbidden Commands
These commands should never be executed:
- `rm -rf` (except for specific temp directories)
- `git push --force`
- `DROP TABLE/DATABASE`
- `sudo` commands
关键点:用 <critical> 标签包裹最重要的安全规则,Claude 会优先遵守。
MCP 服务器可以访问外部资源,配置时要遵循最小权限原则:
{
"mcpServers": {
"database": {
"command": "mcp-server-postgres",
"args": ["--read-only"] // 只读模式
},
"github": {
"command": "mcp-server-github",
"env": {
"GITHUB_TOKEN": "${GITHUB_READ_ONLY_TOKEN}" // 只读 Token
}
}
}
}
不要在 MCP 配置中硬编码密钥:
// ❌ 危险
{
"mcpServers": {
"api": {
"env": {
"API_KEY": "sk-xxxxx" // 硬编码
}
}
}
}
// ✅ 安全
{
"mcpServers": {
"api": {
"env": {
"API_KEY": "${API_KEY}" // 从环境变量读取
}
}
}
}
为 MCP 服务器配置作用域:
{
"mcpServers": {
"internal-api": {
"command": "mcp-server-http",
"args": ["--base-url", "https://internal.company.com"],
"scope": "project" // 仅当前项目可用
}
}
}
将安全配置提交到 Git,团队共享:
.claude/
├── settings.json # 共享配置
├── hooks/
│ ├── protect-sensitive.sh
│ ├── block-dangerous-commands.sh
│ └── filter-output.sh
└── CLAUDE.md # 安全规则
敏感配置放在 .claude/settings.local.json,gitignored:
{
"mcpServers": {
"production": {
"env": {
"PROD_API_KEY": "${PROD_API_KEY}"
}
}
}
}
.claude/settings.local.json
.env.*
启用操作日志,审计所有 Claude 执行的操作:
{
"logging": {
"enabled": true,
"level": "info",
"file": "~/.claude/logs/audit.log"
}
}
日志格式:
[2026-04-29 10:30:15] INFO Bash: npm test
[2026-04-29 10:30:18] INFO Read: src/auth.ts
[2026-04-29 10:30:20] WARN Blocked: Read .env (by hook)
[2026-04-29 10:30:25] INFO Write: src/auth.ts
在企业环境中,限制 Claude Code 的网络访问:
┌─────────────────┐ ┌─────────────────┐
│ Claude Code │────▶│ LLM Proxy │
└─────────────────┘ └─────────────────┘
│ │
│ ▼
│ ┌─────────────────┐
│ │ Anthropic API │
│ └─────────────────┘
│
▼
┌─────────────────┐
│ Internal APIs │ ← 白名单控制
└─────────────────┘
使用企业级凭据管理:
方案 | 说明 |
|---|---|
HashiCorp Vault | 动态凭据,自动轮换 |
AWS Secrets Manager | 云原生方案 |
Azure Key Vault | Azure 集成 |
1Password CLI | 开发者友好 |
配置示例:
export API_KEY=$(vault kv get -field=api_key secret/claude-code)
定期检查合规性:
find . -name ".env*" -o -name "*credentials*" | xargs ls -la
git log -p | grep -E "(sk-|AKIA|ghp_)" || echo "No secrets found"
cat .claude/settings.json | jq '.permissions.deny'
如果怀疑密钥泄露:
1. 立即轮换:撤销旧密钥,生成新密钥
2. 审计日志:检查操作日志,确认泄露范围
3. 更新配置:更新所有使用该密钥的配置
4. 通知相关方:如果涉及第三方 API,通知服务商
如果 Claude 执行了误操作:
1. 停止操作:Ctrl+C 或 /stop
2. 检查影响:git status、git diff
3. 回滚:git checkout -- . 或 git reset --hard
4. 分析原因:检查 Hook 是否触发,权限配置是否正确
如果 Claude 行为异常:
1. 清除上下文:/clear
2. 检查 CLAUDE.md:确认安全规则完整
3. 检查 Hooks:确认 Hook 脚本正常
4. 检查 MCP:确认 MCP 服务器配置正确
部署前检查:
## 敏感文件保护
- [ ] .env 文件在 .gitignore 中
- [ ] PreToolUse Hook 配置正确
- [ ] 敏感文件模式列表完整
## 命令执行控制
- [ ] 危险命令拦截配置
- [ ] 沙箱模式按需启用
- [ ] 权限级别正确设置
## CLAUDE.md 安全规则
- [ ] <critical> 标签包裹核心规则
- [ ] 保护文件清单完整
- [ ] 允许/禁止命令清单完整
## MCP 服务器
- [ ] 使用只读 Token
- [ ] 环境变量不硬编码
- [ ] 作用域正确配置
## 团队配置
- [ ] 安全配置提交到 Git
- [ ] 敏感配置在 settings.local.json
- [ ] 审计日志启用
## 企业部署
- [ ] 网络隔离配置
- [ ] 凭据管理集成
- [ ] 合规检查通过
Claude Code 的安全防护是多层次的:
层次 | 机制 | 职责 |
|---|---|---|
默认保护 | 内置黑名单 | 基础防护 |
Hooks | PreToolUse 拦截 | 自定义防护 |
权限配置 | allow/deny 规则 | 细粒度控制 |
CLAUDE.md | 项目规则 | 上下文约束 |
MCP 作用域 | 资源隔离 | 外部访问控制 |
审计日志 | 操作记录 | 事后追溯 |
核心原则: - 最小权限:只给必要的权限 - 显式确认:危险操作必须确认 - 防护层:多层防护,单点失效不影响整体 - 可审计:所有操作有日志可查
安全不是一次性的工作,而是持续的过程。定期检查配置、更新规则、审计日志,才能确保 Claude Code 在企业环境中安全运行。