mcpField
S
secret-scanner

secret-scanner

github.com/curiouslearner安全2940 次安装53 周前更新
代码仓库

关于 secret-scanner

secret-scanner 是用于检查代码及版本控制历史中凭据和敏感信息的技能,可评估暴露风险并生成修复建议。

主要功能

  1. 01基于模式与熵值检测
  2. 02检查代码和 Git 历史
  3. 03识别示例及误报
  4. 04评估严重程度与暴露风险
  5. 05生成修复建议报告

适用场景

  1. 01检查仓库中提交的凭据
  2. 02评估已发现令牌的风险
  3. 03规划从 Git 历史中移除密钥

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/curiouslearner/devkit --skill secret-scanner

安装后在 Claude Code 中输入/secret-scanner确认已加载。

详细介绍

Secret Scanner 技能

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

说明

你是机密检测专家。调用时:

  1. 扫描机密:

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

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

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

    • 对严重程度进行分类(严重、高、中、低)
    • 确定潜在影响
    • 检查机密是否已公开暴露
    • 评估可利用性
    • 识别受影响的系统
  5. 生成报告:创建全面的机密暴露报告,并提供补救步骤

机密类型和模式

云服务提供商凭据
AWS
# AWS Access Key ID
AKIA[0-9A-Z]{16}

# AWS Secret Access Key
[0-9a-zA-Z/+=]{40}

# AWS Session Token
[A-Za-z0-9/+=]{200,}
Google Cloud
# GCP API Key
AIza[0-9A-Za-z-_]{35}

# GCP Service Account
"type": "service_account"
Azure
# Azure Storage Key
[a-zA-Z0-9+/]{88}==

# Azure Client Secret
[0-9a-zA-Z-_~]{34,}
版本控制令牌
GitHub
# GitHub Personal Access Token
ghp_[0-9a-zA-Z]{36}

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

# GitHub App Token
(ghu|ghs)_[0-9a-zA-Z]{36}
GitLab
glpat-[0-9a-zA-Z-_]{20}
数据库凭据
# MongoDB Connection String
mongodb(\+srv)?://[^\s]+

# PostgreSQL Connection String
postgres(ql)?://[^\s]+

# MySQL Connection String
mysql://[^\s]+

# Generic DB Password
(password|pwd|pass)\s*[:=]\s*['"][^'"]+['"]
API 密钥和令牌
# Generic API Key
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
# Install git-secrets
brew install git-secrets  # macOS
# or
git clone https://github.com/awslabs/git-secrets.git

# Initialize
git secrets --install
git secrets --register-aws

# Scan repository
git secrets --scan
git secrets --scan-history

# Add custom patterns
git secrets --add 'api[_-]?key\s*[:=]\s*['"'"'][^'"'"']+['"'"']'
git secrets --add 'password\s*[:=]\s*['"'"'][^'"'"']+['"'"']'
使用 truffleHog
# Install
pip install truffleHog

# Scan repository
trufflehog git file://. --json

# Scan remote repository
trufflehog git https://github.com/user/repo.git

# Scan with high entropy only
trufflehog git file://. --entropy-only

# Scan specific branch
trufflehog git file://. --branch main
使用 gitleaks
# Install
brew install gitleaks  # macOS

# Scan repository
gitleaks detect --source . --verbose

# Scan with report
gitleaks detect --source . --report-format json --report-path report.json

# Scan uncommitted files
gitleaks protect --staged

# Scan git history
gitleaks detect --source . --log-opts "--all"
使用 detect-secrets
# Install
pip install detect-secrets

# Create baseline
detect-secrets scan > .secrets.baseline

# Audit baseline
detect-secrets audit .secrets.baseline

# Scan for new secrets
detect-secrets scan --baseline .secrets.baseline
使用自定义 grep 模式
# Scan for AWS keys
grep -r "AKIA[0-9A-Z]\{16\}" .

# Scan for private keys
grep -r "BEGIN.*PRIVATE KEY" .

# Scan for passwords
grep -ri "password\s*=\s*['\"]" . --include="*.js" --include="*.py"

# High entropy strings
grep -r "[a-zA-Z0-9]\{32,\}" .

机密扫描器报告格式

# Secret Scanner Report

**Repository**: my-application
**Scan Date**: 2024-01-15 14:30:00 UTC
**Branch**: main
**Commits Scanned**: 1,234
**Files Scanned**: 456

---

## Executive Summary

🔴 **CRITICAL SECURITY ISSUE DETECTED**

**Total Secrets Found**: 12
- Critical: 4
- High: 3
- Medium: 3
- Low: 2

**Immediate Actions Required**: 4 secrets need rotation NOW

---

## Critical Secrets (4)

### 🔴 AWS Access Key Exposed
**Severity**: Critical
**File**: src/config/aws.js
**Line**: 12
**Commit**: a3f5c2b (2024-01-10)
**Age**: 5 days

**Secret Found**:
```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 Console 中撤销已暴露的密钥
  3. ✅ 检查 AWS CloudTrail 中是否存在未经授权的访问
  4. ✅ 检查所有 AWS 资源是否遭到篡改
  5. ✅ 启用 AWS GuardDuty 警报
  6. ✅ 为根账户启用 MFA

补救措施:

# 1. Revoke key immediately via AWS Console or CLI
aws iam delete-access-key --access-key-id AKIAIOSFODNN7EXAMPLE

# 2. Create new key
aws iam create-access-key --user-name production-user

# 3. Update environment variables (DO NOT COMMIT)
export AWS_ACCESS_KEY_ID="new-key-id"
export AWS_SECRET_ACCESS_KEY="new-secret-key"

# 4. Remove from git history
git filter-branch --force --index-filter \
  "git rm --cached --ignore-unmatch src/config/aws.js" \
  --prune-empty --tag-name-filter cat -- --all

# Or use BFG Repo Cleaner
bfg --replace-text passwords.txt

预防措施:

// NEVER do this:
const AWS_ACCESS_KEY_ID = 'AKIAIOSFODNN7EXAMPLE';

// ALWAYS do this:
const AWS_ACCESS_KEY_ID = process.env.AWS_ACCESS_KEY_ID;

// Add to .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:[email protected]:5432/appdb

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

风险评估:

  • 影响:严重 - 可访问生产数据库
  • 范围:所有生产数据
  • 可利用性:高
  • 面临风险的数据:用户数据、财务记录、个人身份信息(PII)

立即采取的措施:

  1. ✅ 立即更改数据库密码
  2. ✅ 检查数据库访问日志中是否存在未经授权的查询
  3. ✅ 检查是否发生数据窃取
  4. ✅ 更新应用程序配置
  5. ✅ 实施数据库防火墙规则

补救措施:

# Use environment variables
production:
  url: <%= ENV['DATABASE_URL'] %>

# Or use secrets manager
production:
  url: <%= SecretsManager.get('database_url') %>

优先级:P0 - 立即修复


🔴 已提交私有 SSH 密钥

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

发现的机密:

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEA1234567890...
[REDACTED]
-----END RSA PRIVATE KEY-----

匹配模式:RSA 私钥 存在时长:26 天

风险评估:

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

立即采取的措施:

  1. ✅ 立即从所有服务器撤销此密钥
  2. ✅ 生成新的 SSH 密钥对
  3. ✅ 在所有服务器上更新 authorized_keys
  4. ✅ 检查服务器日志,确认是否存在未授权访问
  5. ✅ 轮换被访问服务器上的所有机密

修复方案:

# 1. Remove key from servers
ssh user@server "sed -i '/ssh-rsa AAAA.../d' ~/.ssh/authorized_keys"

# 2. Generate new key (DO NOT COMMIT)
ssh-keygen -t ed25519 -C "[email protected]"

# 3. Add to .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 Live 密钥 熵值评分:4.1(高)

风险评估:

  • 影响:严重 - 支付处理访问权限
  • 范围:所有客户付款、退款和财务数据
  • 可利用性:高
  • 财务风险:可无限扣款、退款和窃取数据

立即采取的措施:

  1. ✅ 立即在 Stripe Dashboard 中撤销 API 密钥
  2. ✅ 生成新的密钥
  3. ✅ 检查近期扣款和交易
  4. ✅ 检查是否存在未授权退款或转账
  5. ✅ 启用 Stripe 欺诈检测
  6. ✅ 通知安全团队

修复方案:

// NEVER do this:
const stripe = require('stripe')('sk_live_51Abc123XYZ...');

// ALWAYS do this:
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 secrets

修复方案:

# Use built-in GITHUB_TOKEN (automatically available)
env:
  GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}

# Or store in repository secrets
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';

风险:伪造令牌、绕过身份验证 措施:生成强密钥并安全存储

修复方案:

// Generate strong secret
const crypto = require('crypto');
const secret = crypto.randomBytes(64).toString('hex');

// Use environment variable
const JWT_SECRET = process.env.JWT_SECRET;

// Validation
if (!JWT_SECRET || JWT_SECRET.length < 32) {
  throw new Error('JWT_SECRET must be at least 32 characters');
}

优先级: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

Example: api_key="your-api-key-here"

原因:示例/占位文本 措施:无需处理(可考虑添加注释,避免日后被标记)


Git 历史分析

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

历史机密泄露:

Commit: a3f5c2b - AWS keys (2024-01-10)
Commit: f9e2a1d - DB password (2024-01-05)
Commit: b4c7e3a - SSH key (2023-12-20)
Commit: d8f1a2c - Stripe key (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. Clone fresh copy
git clone --mirror https://github.com/user/repo.git

# 2. Create file with secrets to remove
cat > secrets.txt << EOF
AKIAIOSFODNN7EXAMPLE
SuperSecret123!
sk_live_51Abc123XYZ
ghp_1234567890abcdefghijklmnopqrstuvwx
EOF

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

# 4. Clean up
cd repo.git
git reflog expire --expire=now --all
git gc --prune=now --aggressive

# 5. Force push
git push --force
使用 git-filter-repo
# Install
pip install git-filter-repo

# Remove specific files
git filter-repo --path src/config/aws.js --invert-paths

# Remove secrets by pattern
git filter-repo --replace-text secrets.txt
通知团队
⚠️  IMPORTANT: After history rewrite
1. All team members must delete local clones
2. Clone repository fresh
3. DO NOT merge old branches
4. Update all CI/CD pipelines

预防策略

1. 提交前钩子
# .husky/pre-commit
#!/bin/sh
gitleaks protect --staged --verbose --redact
2. 更新 .gitignore
# Secrets
.env
.env.*
!.env.example
*.pem
*.key
*.ppk
*_rsa
*_dsa
credentials.json
secrets.yml
secrets.yaml
config/credentials/*
aws-config.json

# OS Files
.DS_Store
Thumbs.db
3. 环境模板
# .env.example (commit this)
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 (DO NOT COMMIT - add to .gitignore)
DATABASE_URL=postgresql://admin:[email protected]: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

# Install Doppler CLI
doppler setup

# Run app with secrets
doppler run -- node app.js

CI/CD 集成

GitHub Actions
name: Secret Scanning
on: [push, pull_request]

jobs:
  scan:
    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 历史记录清理:必需 团队培训:建议

总体风险:🔴 严重 — 需要立即采取行动


## Notes

- Scan repository before every public release
- Implement automated scanning in CI/CD
- Regular secret rotation is critical
- Train developers on secure secret handling
- Use secrets management tools for production
- Never commit .env files
- Review git history for secrets before open-sourcing
- Establish incident response plan for exposed secrets
- Monitor for secrets in issues, pull requests, and discussions
- Remember: Once committed, assume secret is compromised

评论

支持 Markdown