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. 03Git履歴からの秘密情報削除の計画

インストール

コマンドをコピーしてターミナルで実行します。

$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. リスク評価:

    • 重大度を分類する (Critical、High、Medium、Low)
    • 潜在的な影響を判断する
    • シークレットが公開で露出したか確認する
    • 悪用可能性を評価する
    • 影響を受けるシステムを特定する
  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 レポート形式

# 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 (High)

リスク評価:

  • 影響: CRITICAL - AWS アカウントへの完全なアクセス
  • 範囲: アカウント内のすべての AWS リソース
  • 悪用可能性: HIGH - キーが公開リポジトリ内にある
  • リスクにさらされるデータ: 本番データベース、S3 バケット、EC2 インスタンス

露出:

  • ✅ リポジトリへのコミット: あり
  • ✅ リモートへのプッシュ: あり
  • ✅ 公開リポジトリ内: あり
  • ⚠️ GitHub で表示可能: 2024-01-10 以降
  • ⚠️ 5 件のコミットに存在

即時の対応:

  1. ✅ 直ちに認証情報をローテーションする
  2. ✅ AWS コンソールで露出したキーを無効化する
  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 履歴のクリーンアップが必要: YES 優先度: P0 - 直ちに修正


🔴 接続文字列内のデータベースパスワード

重大度: Critical ファイル: config/database.yml 行: 8 コミット: f9e2a1d (2024-01-05)

検出されたシークレット:

production:
  url: postgresql://admin:[email protected]:5432/appdb

パターン一致: パスワードを含む PostgreSQL 接続文字列 エントロピースコア: 3.8 (High)

リスク評価:

  • 影響: CRITICAL - 本番データベースへのアクセス
  • 範囲: すべての本番データ
  • 悪用可能性: HIGH
  • リスクにさらされるデータ: ユーザーデータ、財務記録、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 ライブシークレットキー エントロピースコア: 4.1 (高)

リスク評価:

  • 影響: 致命的 - 決済処理へのアクセス
  • 範囲: すべての顧客の支払い、返金、財務データ
  • 悪用可能性: 高
  • 財務リスク: 無制限の請求、返金、データ窃取

今すぐの対応:

  1. ✅ Stripe ダッシュボードで 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 のシークレットを使用する

修復:

# 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 (DB パスワード)
  • deploy/keys/id_rsa (秘密キー)
  • src/payments/stripe.js (Stripe キー)
Gitignore に追加すべき
  • .env*
  • *.pem
  • *.key
  • credentials.json
  • secrets.yml
  • config/production/*

修復チェックリスト

即時対応 (重大 - 0〜24時間)
  • 漏洩したすべての AWS 認証情報をローテーションする
  • データベースのパスワードを変更する
  • SSH キーを失効させ、再生成する
  • Stripe API キーをローテーションする
  • 不正なアクティビティがないか CloudTrail/アクセスログを確認する
  • データ侵害がないか確認する
短期対応 (高 - 24〜48時間)
  • GitHub トークンをローテーションする
  • SendGrid API キーを再生成する
  • 新しい JWT シークレットを生成する
  • git 履歴からシークレットを削除する
  • クリーンアップしたリポジトリを強制プッシュする
中期対応 (7日間)
  • シークレット管理ソリューションを導入する
  • pre-commit フックを設定する
  • .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. pre-commit フック
# .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日)
  • ✅ dev/staging/prod で異なるシークレットを使用する
  • ✅ 最小権限の原則を実装する
  • ✅ シークレットへのアクセスを監査する
  • ✅ 保存時にシークレットを暗号化する
開発ワークフロー
  • ✅ .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

コメント