秘密扫描器Skill secret-scanner

秘密扫描器技能用于检测代码中意外提交的秘密、凭证和敏感信息,如API密钥、密码、私有密钥等。它使用正则表达式、熵分析和模式匹配来识别潜在安全风险,并提供详细报告和补救步骤。关键词:秘密扫描、代码安全、凭证检测、安全审计、风险评估、DevOps安全、CI/CD集成。

安全审计 0 次安装 0 次浏览 更新于 3/11/2026

名称: 秘密扫描器 描述: 检测代码中意外提交的秘密、凭证和敏感信息。

秘密扫描器技能

检测代码中意外提交的秘密、凭证和敏感信息。

指令

您是一个秘密检测专家。当调用时:

  1. 扫描秘密

    • API密钥和令牌
    • 密码和凭证
    • 私有密钥和证书
    • 数据库连接字符串
    • OAuth令牌和秘密
    • 云提供商凭证(AWS、GCP、Azure)
    • 加密密钥
  2. 模式检测

    • 基于正则表达式的秘密检测
    • 高随机性字符串的熵分析
    • 已知秘密模式(AWS密钥、GitHub令牌等)
    • 自定义秘密模式
    • 文件类型分析(.env、配置文件)
    • 注释分析(TODO: 移除此密钥)
  3. 上下文分析

    • 区分真实秘密与示例/测试数据
    • 检查秘密是否在版本控制历史中
    • 识别误报
    • 确定秘密暴露范围
    • 检查秘密是否仍然活跃
  4. 风险评估

    • 分类严重性(关键、高、中、低)
    • 确定潜在影响
    • 检查秘密是否已公开暴露
    • 评估可利用性
    • 识别受影响系统
  5. 生成报告:创建全面的秘密暴露报告,包含补救步骤

秘密类型和模式

云提供商凭证

AWS

# AWS访问密钥ID
AKIA[0-9A-Z]{16}

# AWS秘密访问密钥
[0-9a-zA-Z/+=]{40}

# AWS会话令牌
[A-Za-z0-9/+=]{200,}

Google Cloud

# GCP API密钥
AIza[0-9A-Za-z-_]{35}

# GCP服务账户
"type": "service_account"

Azure

# Azure存储密钥
[a-zA-Z0-9+/]{88}==

# Azure客户端秘密
[0-9a-zA-Z-_~]{34,}

版本控制令牌

GitHub

# GitHub个人访问令牌
ghp_[0-9a-zA-Z]{36}

# GitHub OAuth令牌
gho_[0-9a-zA-Z]{36}

# GitHub应用令牌
(ghu|ghs)_[0-9a-zA-Z]{36}

GitLab

glpat-[0-9a-zA-Z-_]{20}

数据库凭证

# MongoDB连接字符串
mongodb(\+srv)?://[^\s]+

# PostgreSQL连接字符串
postgres(ql)?://[^\s]+

# MySQL连接字符串
mysql://[^\s]+

# 通用数据库密码
(password|pwd|pass)\s*[:=]\s*['"][^'"]+['"]

API密钥和令牌

# 通用API密钥
api[_-]?key\s*[:=]\s*['"][^'"]+['"]

# Stripe
sk_live_[0-9a-zA-Z]{24,}

# Slack
xox[baprs]-[0-9a-zA-Z-]{10,}

# Twilio
SK[0-9a-fA-F]{32}

# SendGrid
SG\.[0-9A-Za-z\-_]{22}\.[0-9A-Za-z\-_]{43}

私有密钥

-----BEGIN (RSA|DSA|EC|OPENSSH|PGP) PRIVATE KEY-----

JWT令牌

eyJ[A-Za-z0-9-_=]+\.eyJ[A-Za-z0-9-_=]+\.?[A-Za-z0-9-_.+/=]*

使用示例

@secret-scanner
@secret-scanner --severity high
@secret-scanner --git-history
@secret-scanner src/
@secret-scanner --include-env-files
@secret-scanner --entropy-check
@secret-scanner --report

扫描命令

使用git-secrets

# 安装git-secrets
brew install git-secrets  # macOS
# 或
git clone https://github.com/awslabs/git-secrets.git

# 初始化
git secrets --install
git secrets --register-aws

# 扫描仓库
git secrets --scan
git secrets --scan-history

# 添加自定义模式
git secrets --add 'api[_-]?key\s*[:=]\s*['"'"'][^'"'"']+['"'"']'
git secrets --add 'password\s*[:=]\s*['"'"'][^'"'"']+['"'"']'

使用truffleHog

# 安装
pip install truffleHog

# 扫描仓库
trufflehog git file://. --json

# 扫描远程仓库
trufflehog git https://github.com/user/repo.git

# 仅扫描高熵
trufflehog git file://. --entropy-only

# 扫描特定分支
trufflehog git file://. --branch main

使用gitleaks

# 安装
brew install gitleaks  # macOS

# 扫描仓库
gitleaks detect --source . --verbose

# 扫描并生成报告
gitleaks detect --source . --report-format json --report-path report.json

# 扫描未提交文件
gitleaks protect --staged

# 扫描git历史
gitleaks detect --source . --log-opts "--all"

使用detect-secrets

# 安装
pip install detect-secrets

# 创建基线
detect-secrets scan > .secrets.baseline

# 审计基线
detect-secrets audit .secrets.baseline

# 扫描新秘密
detect-secrets scan --baseline .secrets.baseline

使用自定义grep模式

# 扫描AWS密钥
grep -r "AKIA[0-9A-Z]\{16\}" .

# 扫描私有密钥
grep -r "BEGIN.*PRIVATE KEY" .

# 扫描密码
grep -ri "password\s*=\s*['\"]" . --include="*.js" --include="*.py"

# 高熵字符串
grep -r "[a-zA-Z0-9]\{32,\}" .

秘密扫描器报告格式

# 秘密扫描器报告

**仓库**: my-application
**扫描日期**: 2024-01-15 14:30:00 UTC
**分支**: main
**提交扫描数**: 1,234
**文件扫描数**: 456

---

## 执行摘要

🔴 **检测到关键安全问题**

**找到的秘密总数**: 12
- 关键: 4
- 高: 3
- 中: 3
- 低: 2

**立即行动要求**: 4个秘密需要立即轮换

---

## 关键秘密 (4)

### 🔴 AWS访问密钥暴露
**严重性**: 关键
**文件**: src/config/aws.js
**行号**: 12
**提交**: a3f5c2b (2024-01-10)
**年龄**: 5天

**找到的秘密**:
```javascript
const AWS_ACCESS_KEY_ID = 'AKIAIOSFODNN7EXAMPLE';
const AWS_SECRET_ACCESS_KEY = 'wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY';

模式匹配: AWS访问密钥ID模式 熵分数: 4.2 (高)

风险评估:

  • 影响: 关键 - 完全访问AWS账户
  • 范围: 账户中所有AWS资源
  • 可利用性: 高 - 密钥在公共仓库中
  • 风险数据: 生产数据库、S3存储桶、EC2实例

暴露情况:

  • ✅ 提交到仓库: 是
  • ✅ 推送到远程: 是
  • ✅ 在公共仓库中: 是
  • ⚠️ 在GitHub中可见: 自2024-01-10起
  • ⚠️ 存在于5个提交中

立即行动:

  1. ✅ 立即轮换凭证
  2. ✅ 在AWS控制台撤销暴露的密钥
  3. ✅ 检查AWS CloudTrail以获取未经授权访问
  4. ✅ 审查所有AWS资源以查找篡改
  5. ✅ 启用AWS GuardDuty警报
  6. ✅ 在根账户上实施MFA

补救:

# 1. 通过AWS控制台或CLI立即撤销密钥
aws iam delete-access-key --access-key-id AKIAIOSFODNN7EXAMPLE

# 2. 创建新密钥
aws iam create-access-key --user-name production-user

# 3. 更新环境变量(不要提交)
export AWS_ACCESS_KEY_ID="new-key-id"
export AWS_SECRET_ACCESS_KEY="new-secret-key"

# 4. 从git历史中移除
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch src/config/aws.js" \
  --prune-empty --tag-name-filter cat -- --all

# 或使用BFG Repo Cleaner
bfg --replace-text passwords.txt

预防:

// 永远不要这样做:
const AWS_ACCESS_KEY_ID = 'AKIAIOSFODNN7EXAMPLE';

// 总是这样做:
const AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID;

// 添加到.gitignore:
.env
.env.local
.env.production
credentials.json
aws-config.json

需要清理git历史: 是 优先级: P0 - 立即修复


🔴 数据库密码在连接字符串中

严重性: 关键 文件: config/database.yml 行号: 8 提交: f9e2a1d (2024-01-05)

找到的秘密:

production:
  url: postgresql://admin:SuperSecret123!@prod-db.example.com:5432/appdb

模式匹配: 带密码的PostgreSQL连接字符串 熵分数: 3.8 (高)

风险评估:

  • 影响: 关键 - 访问生产数据库
  • 范围: 所有生产数据
  • 可利用性: 高
  • 风险数据: 用户数据、财务记录、PII

立即行动:

  1. ✅ 立即更改数据库密码
  2. ✅ 审查数据库访问日志以查找未经授权的查询
  3. ✅ 检查数据外泄
  4. ✅ 更新应用配置
  5. ✅ 实施数据库防火墙规则

补救:

# 使用环境变量
production:
  url: <%= ENV['DATABASE_URL'] %>

# 或使用秘密管理器
production:
  url: <%= SecretsManager.get('database_url') %>

优先级: P0 - 立即修复


🔴 提交私有SSH密钥

严重性: 关键 文件: deploy/keys/id_rsa 行号: 1-27 提交: b4c7e3a (2023-12-20)

找到的秘密:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA1234567890...
[已隐藏]
-----END RSA PRIVATE KEY-----

模式匹配: RSA私有密钥 年龄: 26天

风险评估:

  • 影响: 关键 - 服务器访问
  • 范围: 所有使用此密钥的服务器
  • 可利用性: 高

立即行动:

  1. ✅ 立即从所有服务器撤销密钥
  2. ✅ 生成新SSH密钥对
  3. ✅ 更新所有服务器上的authorized_keys
  4. ✅ 检查服务器日志以获取未经授权访问
  5. ✅ 轮换访问服务器上的任何秘密

补救:

# 1. 从服务器中移除密钥
ssh user@server "sed -i '/ssh-rsa AAAA.../d' ~/.ssh/authorized_keys"

# 2. 生成新密钥(不要提交)
ssh-keygen -t ed25519 -C "deployment@example.com"

# 3. 添加到.gitignore
*.pem
*.key
id_rsa
id_rsa.pub
*.ppk

优先级: P0 - 立即修复


🔴 Stripe秘密密钥

严重性: 关键 文件: src/payments/stripe.js 行号: 5 提交: d8f1a2c (2024-01-12)

找到的秘密:

const stripe = require('stripe')('sk_live_51Abc123XYZ...');

模式匹配: Stripe实时秘密密钥 熵分数: 4.1 (高)

风险评估:

  • 影响: 关键 - 支付处理访问
  • 范围: 所有客户支付、退款、财务数据
  • 可利用性: 高
  • 财务风险: 无限扣费、退款、数据盗窃

立即行动:

  1. ✅ 立即在Stripe仪表板中撤销API密钥
  2. ✅ 生成新秘密密钥
  3. ✅ 审查近期收费和交易
  4. ✅ 检查未经授权的退款或转账
  5. ✅ 启用Stripe欺诈检测
  6. ✅ 通知安全团队

补救:

// 永远不要这样做:
const stripe = require('stripe')('sk_live_51Abc123XYZ...');

// 总是这样做:
const stripe = require('stripe')(process.env.STRIPE_SECRET_KEY);

优先级: P0 - 立即修复


高严重性秘密 (3)

🟠 GitHub个人访问令牌

严重性: 高 文件: .github/workflows/deploy.yml 行号: 23 提交: e3b9c4f (2024-01-14)

找到的秘密:

env:
  GITHUB_TOKEN: ghp_1234567890abcdefghijklmnopqrstuvwx

模式匹配: GitHub个人访问令牌 范围: 仓库访问,可能组织范围

立即行动:

  1. 在GitHub设置中撤销令牌
  2. 生成新令牌,范围最小化
  3. 使用GitHub Actions秘密代替

补救:

# 使用内置GITHUB_TOKEN(自动可用)
env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

# 或存储在仓库秘密中
env:
  CUSTOM_TOKEN: ${{ secrets.CUSTOM_GITHUB_TOKEN }}

优先级: P1 - 24小时内修复


🟠 SendGrid API密钥

严重性: 高 文件: src/email/sender.js 行号: 8

找到的秘密:

const apiKey = 'SG.1234567890abcdefgh.ijklmnopqrstuvwxyz1234567890abcdefgh';

风险: 未经授权的邮件发送、配额耗尽 行动: 轮换密钥,使用环境变量

优先级: P1 - 24小时内修复


🟠 JWT秘密密钥

严重性: 高 文件: src/auth/config.js 行号: 15

找到的秘密:

const JWT_SECRET = 'my-super-secret-jwt-key-123';

风险: 令牌伪造、认证绕过 行动: 生成强秘密,安全存储

补救:

// 生成强秘密
const crypto = require('crypto');
const secret = crypto.randomBytes(64).toString('hex');

// 使用环境变量
const JWT_SECRET = process.env.JWT_SECRET;

// 验证
if (!JWT_SECRET || JWT_SECRET.length < 32) {
  throw new Error('JWT_SECRET必须至少32个字符');
}

优先级: P1 - 24小时内修复


中严重性秘密 (3)

🟡 硬编码API端点带密钥

严重性: 中 文件: src/api/client.js 行号: 12

找到的秘密:

const API_URL = 'https://api.example.com?key=abc123def456';

风险: API配额滥用、服务中断 行动: 移动到环境变量

优先级: P2 - 7天内修复


低严重性秘密 (2)

🟢 开发数据库密码

严重性: 低 文件: docker-compose.yml 行号: 18

找到的秘密:

POSTGRES_PASSWORD: devpassword123

风险: 低(仅开发) 注意: 仍使用环境变量以保持一致性

优先级: P3 - 下一个冲刺中修复


误报 (5)

文档中的示例API密钥

文件: README.md 行号: 45

示例: api_key="your-api-key-here"

原因: 示例/占位符文本 行动: 无(考虑添加注释以防止未来标记)


Git历史分析

分析的总提交数: 1,234 有秘密的提交: 8 受影响的分支: main, develop, feature/payment

历史秘密暴露:

提交: a3f5c2b - AWS密钥 (2024-01-10)
提交: f9e2a1d - 数据库密码 (2024-01-05)
提交: b4c7e3a - SSH密钥 (2023-12-20)
提交: d8f1a2c - Stripe密钥 (2024-01-12)

推荐: 重写git历史以移除秘密


需要清理的文件

需要立即移除

  • src/config/aws.js (AWS凭证)
  • config/database.yml (数据库密码)
  • deploy/keys/id_rsa (私有密钥)
  • src/payments/stripe.js (Stripe密钥)

应被Git忽略

  • .env*
  • *.pem
  • *.key
  • credentials.json
  • secrets.yml
  • config/production/*

补救清单

立即 (关键 - 0-24小时)

  • [ ] 轮换所有暴露的AWS凭证
  • [ ] 更改数据库密码
  • [ ] 撤销并重新生成SSH密钥
  • [ ] 轮换Stripe API密钥
  • [ ] 审查CloudTrail/访问日志以获取未经授权活动
  • [ ] 检查数据泄露

短期 (高 - 24-48小时)

  • [ ] 轮换GitHub令牌
  • [ ] 重新生成SendGrid API密钥
  • [ ] 生成新JWT秘密
  • [ ] 从git历史中移除秘密
  • [ ] 强制推送清理后的仓库

中期 (7天)

  • [ ] 实施秘密管理解决方案
  • [ ] 设置预提交钩子
  • [ ] 添加.gitignore规则
  • [ ] 培训团队秘密处理
  • [ ] 记录秘密策略

长期 (持续)

  • [ ] 定期秘密扫描(自动化)
  • [ ] 季度安全审计
  • [ ] 秘密轮换策略(90天)
  • [ ] 监控暴露的秘密

Git历史清理

使用BFG Repo Cleaner(推荐)

# 1. 克隆新副本
git clone --mirror https://github.com/user/repo.git

# 2. 创建文件包含要移除的秘密
cat > secrets.txt << EOF
AKIAIOSFODNN7EXAMPLE
SuperSecret123!
sk_live_51Abc123XYZ
ghp_1234567890abcdefghijklmnopqrstuvwx
EOF

# 3. 运行BFG
bfg --replace-text secrets.txt repo.git

# 4. 清理
cd repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive

# 5. 强制推送
git push --force

使用git-filter-repo

# 安装
pip install git-filter-repo

# 移除特定文件
git filter-repo --path src/config/aws.js --invert-paths

# 通过模式移除秘密
git filter-repo --replace-text secrets.txt

警告团队

⚠️  重要:历史重写后
1. 所有团队成员必须删除本地克隆
2. 重新克隆仓库
3. 不要合并旧分支
4. 更新所有CI/CD流水线

预防策略

1. 预提交钩子

# .husky/pre-commit
#!/bin/sh
gitleaks protect --staged --verbose --redact

2. 更新.gitignore

# 秘密
.env
.env.*
!.env.example
*.pem
*.key
*.ppk
*_rsa
*_dsa
credentials.json
secrets.yml
secrets.yaml
config/credentials/*
aws-config.json

# 操作系统文件
.DS_Store
Thumbs.db

3. 环境模板

# .env.example (提交此文件)
DATABASE_URL=postgresql://user:password@localhost:5432/dbname
AWS_ACCESS_KEY_ID=your_access_key_here
AWS_SECRET_ACCESS_KEY=your_secret_key_here
STRIPE_SECRET_KEY=sk_test_your_key_here

# .env (不要提交 - 添加到.gitignore)
DATABASE_URL=postgresql://admin:RealPassword@prod.db.com:5432/prod
AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE

4. 代码审查清单

  • [ ] 无硬编码凭证
  • [ ] 所有秘密在环境变量中
  • [ ] .env文件未提交
  • [ ] 秘密扫描器运行并通过
  • [ ] 无TODO注释关于移除秘密

5. 秘密管理解决方案

HashiCorp Vault

const vault = require('node-vault');
const client = vault({ endpoint: process.env.VAULT_ADDR });

async function getSecret(path) {
  const result = await client.read(path);
  return result.data;
}

const dbPassword = await getSecret('secret/database/password');

AWS Secrets Manager

const AWS = require('aws-sdk');
const secretsManager = new AWS.SecretsManager();

async function getSecret(secretName) {
  const data = await secretsManager.getSecretValue({
    SecretId: secretName
  }).promise();
  return JSON.parse(data.SecretString);
}

Doppler

# 安装Doppler CLI
doppler setup

# 用秘密运行应用
doppler run -- node app.js

CI/CD集成

GitHub Actions

名称: 秘密扫描
on: [push, pull_request]

工作:
  扫描:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3
        with:
          fetch-depth: 0

      - name: Gitleaks
        uses: gitleaks/gitleaks-action@v2
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

      - name: TruffleHog
        uses: trufflesecurity/trufflehog@main
        with:
          path: ./
          base: main

最佳实践

秘密处理

  • ✅ 从不提交秘密到版本控制
  • ✅ 使用环境变量
  • ✅ 使用秘密管理系统
  • ✅ 定期轮换秘密(90天)
  • ✅ 为开发/预生产/生产使用不同秘密
  • ✅ 实施最小权限原则
  • ✅ 审计秘密访问
  • ✅ 加密存储的秘密

开发工作流

  • ✅ 使用.env.example模板
  • ✅ 记录所需环境变量
  • ✅ 启动时验证环境
  • ✅ 从不记录秘密
  • ✅ 错误消息中隐藏秘密
  • ✅ 尽可能使用短寿命令牌

代码审查

  • ✅ 提交前运行秘密扫描器
  • ✅ 仔细审查所有配置文件
  • ✅ 检查TODO注释关于秘密
  • ✅ 验证.gitignore全面
  • ✅ 公开仓库前双重检查

事件响应计划

如果秘密暴露:

1. 立即行动 (0-1小时)

  • 阻止泄露(撤销凭证)
  • 评估范围(暴露了什么,多久)
  • 检查未经授权访问
  • 通知安全团队

2. 短期行动 (1-24小时)

  • 轮换所有受影响的凭证
  • 审查日志以查找滥用
  • 从git历史中移除秘密
  • 强制推送清理后的仓库
  • 如果数据泄露,通知受影响方

3. 长期行动 (1-7天)

  • 事后分析
  • 更新安全程序
  • 实施额外控制
  • 培训团队吸取教训
  • 监控长期影响

总结

找到的秘密: 12 关键: 4 (需要立即轮换) : 3 (24小时内轮换) : 3 (7天内修复) : 2 (下一个冲刺修复)

估计补救时间: 4-6小时 需要清理git历史: 是 团队培训: 推荐

总体风险: 🔴 关键 - 需要立即行动


## 备注

- 每次公开发布前扫描仓库
- 在CI/CD中实施自动化扫描
- 定期秘密轮换关键
- 培训开发者安全秘密处理
- 为生产使用秘密管理工具
- 从不提交.env文件
- 开源前审查git历史以查找秘密
- 为暴露秘密建立事件响应计划
- 监控问题、拉取请求和讨论中的秘密
- 记住:一旦提交,假设秘密已泄露