name: 秘密检测器 description: 检测源代码中的硬编码秘密、API 密钥、密码和凭据。用于检查泄露的秘密、凭据暴露或提交代码前。
秘密检测器
快速开始
使用 gitleaks 扫描秘密:
# 安装
brew install gitleaks # macOS
# 或
pip install detect-secrets
# 扫描当前目录
gitleaks detect --source .
操作指南
步骤1:选择检测工具
Gitleaks(推荐):
gitleaks detect --source . --verbose
detect-secrets:
detect-secrets scan . --all-files
手动 grep 模式:
grep -rn "AKIA[0-9A-Z]{16}" . # AWS 访问密钥
grep -rn "ghp_[a-zA-Z0-9]{36}" . # GitHub 令牌
步骤2:扫描常见模式
| 秘密类型 | 模式 | 示例 |
|---|---|---|
| AWS 访问密钥 | AKIA[0-9A-Z]{16} |
AKIAIOSFODNN7EXAMPLE |
| AWS 秘密密钥 | [A-Za-z0-9/+=]{40} |
wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY |
| GitHub 令牌 | ghp_[a-zA-Z0-9]{36} |
ghp_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| GitHub OAuth | gho_[a-zA-Z0-9]{36} |
gho_xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| Slack 令牌 | xox[baprs]-[0-9a-zA-Z-]+ |
xoxb-123456789-abcdefghij |
| 私钥 | -----BEGIN.*PRIVATE KEY----- |
RSA/EC 私钥 |
| 通用 API 密钥 | api[_-]?key.*=.*['\"][a-zA-Z0-9]{20,} |
api_key = “abc123…” |
| 通用密码 | password.*=.*['\"][^'\"]+['\"] |
password = “secret123” |
步骤3:检查 Git 历史
秘密可能存在于 Git 历史中,即使已被移除:
# 扫描整个 Git 历史
gitleaks detect --source . --log-opts="--all"
# 检查特定提交
git log -p --all -S 'password' --source
步骤4:分类发现
严重 - 需要立即轮换:
- 云提供商凭据(AWS、GCP、Azure)
- 数据库连接字符串
- 私钥
高 - 尽快轮换:
- 外部服务的 API 密钥
- OAuth 令牌
- Webhook 秘密
中等 - 审查并轮换:
- 内部服务令牌
- 可能被重复使用的测试凭据
步骤5:报告发现
## 秘密检测报告
### 严重(1)
1. **AWS 秘密密钥** - config/aws.js:12
- 类型:AWS 凭据
- 操作:在 AWS 控制台中立即轮换
### 高(2)
1. **GitHub 令牌** - scripts/deploy.sh:45
- 类型:个人访问令牌
- 操作:撤销并重新生成
2. **Slack Webhook** - src/notifications.js:23
- 类型:传入 webhook URL
- 操作:重新生成 webhook
预防
预提交钩子
# .pre-commit-config.yaml
repos:
- repo: https://github.com/gitleaks/gitleaks
rev: v8.18.0
hooks:
- id: gitleaks
.gitignore 模式
# 环境文件
.env
.env.local
.env.*.local
# 密钥文件
*.pem
*.key
*_rsa
*_ecdsa
*_ed25519
# 包含秘密的配置
config/secrets.yml
credentials.json
环境变量
将秘密移动到环境变量:
// 错误做法
const apiKey = "sk-abc123...";
// 正确做法
const apiKey = process.env.API_KEY;
常见误报
- 文档中的示例/占位符值
- 使用假凭据的测试装置
- Base64 编码的非秘密数据
- 哈希值(SHA、MD5)
在采取行动前,审查每个发现以确认是真正的秘密。