secrets-scan について
secrets-scanは、ソースコードやGit履歴に含まれるハードコードされた認証情報や機密文字列を検出するエージェントスキルです。既知のパターンに加え、任意のエントロピー検査を使え、対象範囲や除外も指定できます。
主な機能
- 01サービス別の認証情報パターン検出
- 02Git履歴内の秘密情報を検索
- 03高エントロピー文字列の分析
- 04パスやファイルパターンで範囲指定
- 05ファイル除外と行内無視設定
活用シーン
- 01コミット前のソースコード確認
- 02現行ファイルから削除済みでも履歴に残る認証情報の検索
- 03指定ディレクトリやファイル形式のスキャン
- 04CIスキャン設定前の検出結果確認
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ jwynia/ agent-skills --skill secrets-scanインストール後、Claude Code で/secrets-scanを入力して読み込まれたか確認します。
詳細
シークレットスキャン
ソースコード内にハードコードされた認証情報や機密データを詳細に検出します。
クイックスタート
/secrets-scan # Scan current directory
/secrets-scan --scope src/ # Scan specific path
/secrets-scan --entropy # Include high-entropy detection
/secrets-scan --git-history # Check git commit history
このスキルで検出できるもの
信頼度の高いパターン
誤検知率が非常に低いパターンです。
| 種類 | パターン例 | プロバイダー |
|---|---|---|
| AWS アクセスキー | AKIA...(20 文字) | AWS |
| AWS シークレットキー | 40 文字の Base64 | AWS |
| GitHub トークン | ghp_、gho_、ghu_、ghs_、ghr_ | GitHub |
| GitLab トークン | glpat-... | GitLab |
| Slack トークン | xoxb-、xoxp-、xoxa- | Slack |
| Stripe キー | sk_live_、rk_live_ | Stripe |
| Twilio | SK...(34 文字) | Twilio |
| SendGrid | SG. の後に Base64 | SendGrid |
| 秘密鍵 | -----BEGIN (RSA|EC|DSA)?PRIVATE KEY----- | 各種 |
| Google API キー | AIza...(39 文字) |
信頼度が中程度のパターン
コンテキストの検証が必要な場合があります。
| 種類 | パターン | 備考 |
|---|---|---|
| 汎用 API キー | api[_-]?key.*=.*['"][a-zA-Z0-9]{16,} | 変数名 |
| 汎用シークレット | secret.*=.*['"][^'"]+ | コンテキストが必要 |
| パスワード | password.*=.*['"][^'"]+ | 設定値の場合があります |
| 接続文字列 | ://[^:]+:[^@]+@ | DB 認証情報 |
| Bearer トークン | Bearer [a-zA-Z0-9_-]+ | ヘッダー/コード内 |
高エントロピー検出
エントロピー分析によって、潜在的なシークレットを検出します。
/secrets-scan --entropy
次のような高いランダム性を持つ文字列を検出します。
- Base64 でエンコードされたシークレット
- 16 進数でエンコードされたトークン
- カスタム形式の API キー
検出パターン
クラウドプロバイダーのキー
# AWS
AKIA[0-9A-Z]{16} # Access Key ID
[A-Za-z0-9/+=]{40} # Secret Access Key (context needed)
# Azure
[a-zA-Z0-9+/=]{88} # Storage Account Key
# GCP
AIza[0-9A-Za-z_-]{35} # API Key
[0-9]+-[a-z0-9]{32}\.apps\.googleusercontent\.com # OAuth Client
バージョン管理トークン
# GitHub
gh[pousr]_[A-Za-z0-9]{36,} # Personal/OAuth/User/Repo/App
github_pat_[A-Za-z0-9]{22}_[A-Za-z0-9]{59} # Fine-grained PAT
# GitLab
glpat-[A-Za-z0-9-_]{20,} # Personal Access Token
# Bitbucket
[a-zA-Z0-9]{24} # App Password (context needed)
決済・金融
# Stripe
sk_live_[a-zA-Z0-9]{24,} # Secret Key
rk_live_[a-zA-Z0-9]{24,} # Restricted Key
pk_live_[a-zA-Z0-9]{24,} # Publishable Key
# Square
sq0[a-z]{3}-[A-Za-z0-9_-]{22,} # Access Token
# PayPal
access_token\$[a-zA-Z0-9-_.]+ # OAuth Token
コミュニケーションサービス
# Slack
xox[bpas]-[0-9]{10,}-[a-zA-Z0-9]{24,} # Bot/User/App Token
# Twilio
SK[a-f0-9]{32} # API Key SID
[a-f0-9]{32} # Auth Token (context)
# SendGrid
SG\.[a-zA-Z0-9_-]{22}\.[a-zA-Z0-9_-]{43} # API Key
データベース接続文字列
# PostgreSQL/MySQL
(postgres|mysql|mariadb)://[^:]+:[^@]+@[^/]+/\w+
# MongoDB
mongodb(\+srv)?://[^:]+:[^@]+@
# Redis
redis://:[^@]+@
秘密鍵
-----BEGIN (RSA |EC |DSA |OPENSSH )?PRIVATE KEY-----
-----BEGIN PGP PRIVATE KEY BLOCK-----
JWT とセッション
eyJ[A-Za-z0-9_-]+\.eyJ[A-Za-z0-9_-]+\.[A-Za-z0-9_-]+ # JWT
スキャンオプション
基本スキャン
/secrets-scan
信頼度の高いパターンのみをスキャンします。
エントロピー分析を使用
/secrets-scan --entropy
高エントロピー文字列の検出を追加します(検出件数が増え、誤検知も発生する場合があります)。
対象範囲を指定
/secrets-scan --scope src/api/
/secrets-scan --scope "*.ts"
Git 履歴スキャン
/secrets-scan --git-history
/secrets-scan --git-history --since "2024-01-01"
コミットされ、その後削除されたシークレットをコミット履歴からスキャンします。
除外パターン
/secrets-scan --exclude "*.test.ts" --exclude "fixtures/"
出力形式
検出結果レポート
SECRETS SCAN RESULTS
====================
High-Confidence Findings: 2
Medium-Confidence Findings: 5
Entropy Findings: 3
[!] CRITICAL: AWS Access Key
File: src/config/aws.ts:15
Pattern: AKIAIOSFODNN7EXAMPLE
Action: Rotate immediately, check CloudTrail
[!] CRITICAL: GitHub Token
File: .env.example:8
Pattern: ghp_xxxx...xxxx (redacted)
Action: Revoke token, remove from history
[H] HIGH: Database Password
File: docker-compose.yml:23
Pattern: password: supersecret
Action: Use environment variable
[M] MEDIUM: Possible API Key
File: src/services/api.ts:44
Pattern: apiKey = "a1b2c3..."
Context: May be test value
概要統計
Files scanned: 342
Patterns checked: 127
Time elapsed: 2.3s
By Severity:
Critical: 2
High: 5
Medium: 8
By Type:
Cloud credentials: 2
API keys: 4
Passwords: 3
Private keys: 1
Other: 5
誤検知への対処
よくある誤検知
-
例示用/プレースホルダーの値
AKIAIOSFODNN7EXAMPLE(AWS の例)sk_test_...(Stripe のテストキー)your-api-key-here
-
テスト用フィクスチャ
- テストファイル内のモック認証情報
- フィクスチャデータ
-
ドキュメント
- README の例
- API ドキュメント
無視ファイル
.secrets-scan-ignore を作成します。
# Ignore test fixtures
**/fixtures/**
**/__mocks__/**
*.test.ts
*.spec.js
# Ignore documentation
docs/**
*.md
# Ignore specific false positives
src/constants.ts:EXAMPLE_KEY
# Inline ignore comment
# secrets-scan-ignore: test fixture
インラインで無視
// secrets-scan-ignore: example value
const EXAMPLE_KEY = "AKIAIOSFODNN7EXAMPLE";
修正手順
シークレットが見つかった場合
-
直ちに行うこと
- 認証情報を直ちにローテーションします
- 不正使用がないかアクセスログを確認します
- コード/設定から削除します
-
Git 履歴をクリーンアップ
# Remove secret from history git filter-branch --force --index-filter \ 'git rm --cached --ignore-unmatch path/to/file' \ --prune-empty --tag-name-filter cat -- --all # Or use BFG Repo Cleaner bfg --replace-text secrets.txt repo.git -
今後のコミットを防止
- pre-commit フックを追加します
- CI でシークレットスキャンを設定します
予防策
# Install pre-commit hook
npx husky add .husky/pre-commit "npx secrets-scan --staged"
統合
CI/CD パイプライン
# GitHub Actions
- name: Secrets Scan
run: |
/secrets-scan --fail-on-findings
exit $?
# Exit codes:
# 0 = No findings
# 1 = Findings detected
# 2 = Error during scan
Pre-Commit フック
#!/bin/sh
# .husky/pre-commit
files=$(git diff --cached --name-only)
/secrets-scan --files "$files"
関連スキル
/security-scan- セキュリティの包括的な分析/config-scan- 設定のセキュリティ/dependency-scan- パッケージの脆弱性
コメント
Markdown 対応