secret-scanning について
GitHub MCP Server の `run_secret_scanning` ツールを使い、提供されたテキスト、ファイル内容、Git の変更に含まれる認証情報などを検査するスキルです。ユーザーが明示的にスキャンを依頼した場合にのみ使用します。
主な機能
- 01コード断片とテキストのスキャン
- 02指定ファイルやステージ済み変更の確認
- 03認証情報や秘密情報候補の検出
- 04場所と信頼度を含む候補の返却
活用シーン
- 01設定の断片に認証情報がないか確認
- 02コミット前にステージ済み変更をスキャン
- 03リポジトリ内のファイルで秘密情報候補を確認
MCP 対応
`secret_protection` ツールセットを有効にした GitHub MCP Server が必要で、`run_secret_scanning` ツールを通じてスキャンします。スキャン対象の内容は呼び出し側が提供します。
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ github/ copilot-plugins --skill secret-scanningインストール後、Claude Code で/secret-scanningを入力して読み込まれたか確認します。
詳細
シークレットスキャンスキル
概要
このスキルは、GitHub MCP Server の run_secret_scanning ツールを使用して、コンテンツ、ファイル、または Git の変更内容に含まれるシークレットを検出します。API キー、パスワード、認証情報など、公開されるとセキュリティリスクになり得る機密情報の特定に役立ちます。
シークレットに該当するもの
この文脈では、アクセス権を付与するもの、ユーザーやサービスになりすますもの、リクエストに署名するもの、または保護されたデータを復号するものは、一般にシークレットとして扱われます。
以下は、確度の高いシークレット情報として扱ってください。
- アクセストークン、API キー、ベアラー認証情報
- パスワード、認証情報が埋め込まれたデータベース DSN、SMTP 認証値
- 秘密鍵、署名鍵、秘密鍵ブロックを含む証明書、SSH キー
- OAuth クライアントシークレット、リフレッシュトークン、Webhook シークレット
- クラウド認証情報(AWS/GCP/Azure)および CI/CD デプロイ認証情報
正規表現だけでなく、文脈を重視してください。
password、token、secret、client_secret、private_key、authorizationなどの名前の近くにある値は、リスクが高くなります- 設定ファイル、スクリプト、テスト用フィクスチャにある、エントロピーの高い長い文字列は、ラベルが付いていなくても確認が必要です
- 判断がつかない検出結果は、確認できるまで機密情報として扱ってください
ランダムに見えるものがすべてシークレットとは限りません。YOUR_API_KEY_HERE のようなプレースホルダー、明らかなテスト用スタブ、文書に記載されたサンプル値は、誤検出となる場合があります。
重要な理由
このスキルは、漏えいするとセキュリティを脅かす可能性のあるシークレットをスキャンします。コミットされたシークレットは Git の履歴に残り続け、インシデント対応を引き起こし、プッシュ保護チェックでデプロイがブロックされる可能性があります。
重要:このスキルは、ユーザーがコンテンツのスキャンまたはシークレットの確認を明示的に依頼した場合にのみ使用してください。依頼されていないのにシークレットスキャンを実行したり、一般的なワークフローの一環として実行したりしないでください。
よくあるシナリオ
| ユーザーの目的 | 対応方法 | 必要なツール |
|---|---|---|
| 設定のスニペットやコードの貼り付けを確認する | コンテンツとしてスキャン | MCP |
| リポジトリ内の特定のファイルを確認する | ファイルを読み取り、その後スキャン | Read + MCP |
| コミット前にステージされた変更をすべて確認する | 差分を取得し、その後スキャン | Bash(git:*) + MCP |
インストール
前提条件と入力情報
GitHub MCP Server:このスキルを使用するには、secret_protection ツールセットが有効になった GitHub MCP Server が必要です。このリポジトリには、GitHub MCP Server 用に設定されたデフォルトの .mcp.json が含まれているため、すぐに通信できます。
MCP の設定に以下を追加します。
{
"mcpServers": {
"github": {
"type": "http",
"url": "https://api.githubcopilot.com/mcp/"
}
}
}
注記: Cursor では、トップレベルのキーとして
mcpServersではなくserversを使用します。
スキャンに必要な情報:
- リポジトリのオーナー:通常は
git remote get-url originで確認できます。ユーザーに尋ねることもできます - リポジトリ名:通常は
git remote get-url originで確認できます。ユーザーに尋ねることもできます - スキャン対象のコンテンツ:ユーザーから提供されたコードスニペット、ファイルの内容(
Readツールで読み取り)、または Git の差分出力(git diffの結果)のいずれか
ユーザーがリポジトリのオーナーとリポジトリ名を提供しない場合は、スキャンを実行する前に尋ねてください。
スキャンしないもの:デフォルトでは、パフォーマンスの向上とノイズの低減のため、生成された大きなファイルやベンダーコンテンツ(例:node_modules/、ビルド成果物、コンパイル済みアセット、その他の機械生成ファイル)のスキャンは避けてください。.gitignore に記載されているファイルにもシークレット(.env やローカル設定など)が含まれる可能性があるため、ユーザーの同意なしにスキップしないでください。ユーザーから明示的にスキャンを依頼された場合は、スキャン対象に含めてください。
コンテンツのスキャン
使用する場面:ユーザーがシークレットの確認を希望するテキストまたはコードスニペットを提供した場合。
方法:コンテンツを単一要素の配列として run_secret_scanning ツールに入力します。
例
You: Check if this config snippet has secrets
User provides:
DB_PASSWORD=MyP@ssw0rd123
API_KEY=abc123xyz
Agent: I'll scan that for secrets.
⚠️ Found 2 potential secret(s):
1. DB_PASSWORD value looks like a password
2. API_KEY value looks like an API key
Consider replacing hardcoded values with environment variables.
ファイルのスキャン
使用するタイミング:リポジトリ内の特定のファイルにシークレットが含まれていないか確認するようユーザーから依頼された場合。
方法:Read ツールでファイルの内容を取得し、run_secret_scanning に渡します。
例(シークレットが見つかった場合)
You: Check if config.py has secrets
Agent: I'll read and scan that file.
⚠️ Found 1 potential secret:
- Line 10: database_password value looks like a password
Suggestion: Move to environment variable or .env file.
例(シークレットが見つからなかった場合)
You: Check if utils.js has any secrets
Agent: I'll read and scan that file.
✅ No secrets detected in utils.js
ステージされた変更のスキャン
使用するタイミング:コミット前に git のステージされた変更にシークレットが含まれていないか確認するようユーザーから依頼された場合。
方法:git diff --cached でステージされた内容を取得し、run_secret_scanning に渡します。
例(問題なし)
You: Check my staged changes for secrets before I commit
Agent: I'll scan your staged changes.
✅ No secrets found in staged changes. Safe to commit.
例(シークレットが検出された場合)
You: Scan my staged changes
Agent: I'll check your staged changes.
⚠️ Found 1 potential secret in staged changes:
- database.js line 5: password value looks like a credential
Suggestion: Unstage that change, move the credential to env vars, and restage.
スキャンの仕組み
run_secret_scanning を呼び出すと:
- 入力:スキャン対象のファイルの内容(文字列の配列として渡されます)、リポジトリのオーナーと名前
- 処理:GitHub のシークレット検出機能が、既知のシークレット種別に一致するパターンとコンテキストをスキャンします
- 出力:見つかった可能性のあるシークレットの一覧と、その場所および信頼度の指標
このツールは、渡された内容を対象に動作します。プッシュアクセスや特別な GitHub 権限は必要ありません。
スキャンの透明性
コンテンツの処理方法
スキャンをリクエストすると、ファイルの内容が GitHub のシークレット検出インフラストラクチャに送信されます。スキャンはサーバー側で、GitHub の既知のシークレットパターンに基づいて実行されます。スキャン結果は返されますが、スキャンリクエストの処理後に GitHub サーバー上で内容が保持されることはありません。
結果への対応
シークレットが見つかった場合:
- 明らかなハードコード値:環境変数または
.envファイルに移します - 設定ファイル:期待される構造を示す
example.envまたはドキュメントがあるか確認します - すでにコミット済み:シークレットがすでにプッシュされている場合は、認証情報のローテーションが必要になることがあります(このスキルの範囲外です)
シークレットが見つからなかった場合:
- スキャンは正常に完了しています
- カバレッジが完全であることを確認するため、スキャン結果の出力形式を確認してください
詳細情報
シークレットのスキャン、認証情報の管理、GitHub のセキュリティ機能について詳しくは、以下をご覧ください:
- GitHub Secret Scanning Docs:リポジトリでシークレットスキャンを有効にして使用する方法
- Credential Management Best Practices:認証情報を安全に扱うためのガイダンス
- GitHub Push Protection:シークレットがリポジトリに到達するのを防ぐ方法