◀ 用語一覧
NO.19.4

Secret Scanning

更新: 2026.09.11

一言で

Secret Scanning は、リポジトリに紛れ込んだ API キー・トークン・接続文字列を自動で見つけてくれる GitHub の検知機能。

既にコミット済みのものは アラート、これから push されるものは Push protectiongit push の時点でブロック。漏洩前に止めるのが基本戦略。

なぜ private / internal repo でも secret はダメなのか

非公開でも、侵害の被害はリポジトリ内で止まらない。開発者アカウントやランナーを侵害した攻撃者は、社内に露出した secret を足掛かりに攻撃を拡大できる。secret はシークレットマネージャーで管理し、Push protection で流入を防ぐ。理由は 8 つある。

▸ + をクリックして表示

01リポジトリは社内用、開発者は社外にも

「Internal repo」は「自社社員しか触らない」を意味しない。読み取り権限があれば、社員だけでなく、業務委託先、SIer、再委託先の開発者もコミット済みの secret を読める。外部委託によって、アクセス範囲は自社の人員や管理端末の外へ広がる。

02ワンクリックで public 化

操作ミス・リポ移管・Org 設定ミス・ポリシー変更で公開に。攻撃者の自動スキャンは新規 public repo を数秒で検知、漏洩トークンが 60 秒以内に悪用された例も。

03Git 履歴は永久に残る

後続コミットで削除しても消えない。履歴・全 clone・フォーク・バックアップ・CI キャッシュに残存。唯一の対処は rotate でありファイル削除ではない。

04Git は secret も各開発端末に複製する

Git は分散型バージョン管理システム。通常の git clone は、コードと履歴に含まれる secret ごと、社員や外部委託先の各開発端末へコピーする。サーバーだけを守っても不十分。契約終了時に repo のアクセス権を削除しても、端末のコピーは消えない。

05アカウント侵害 = 即アクセス

開発者 1 人のフィッシングで、その人が読める全リポの全 secret が流出。secret 自体に MFA・保存時暗号化・有効期限などの追加保護はない

06権限昇格とラテラルムーブメント

社内ネットワークへの侵入後、攻撃者は private / internal repo の secret を盗み、より強い権限を獲得し、本番環境、クラウド、レジストリへ横展開できる。リポジトリを一度も公開しなくても、1 アカウントの侵害が組織全体の被害に発展し得る。 MITRE ATT&CK ↗

07コンプライアンスと監査

ISO 27001・SOC 2・PCI-DSS・ISMAP は集中管理・rotate・アクセス追跡を要求。Git に平文の secret は 3 点すべて不適合で監査指摘は確実

08インシデントの実コスト

緊急 rotate・本番停止・フォレンジック調査・顧客通知。シークレットマネージャー設定に必要な 30 分と比べてほしい。

主な機能

DEMOSecret Scanning発表者専用
  1. PUSH PROTECTION

    ghas-test-1 で、生成した secret を push する。

    ./demo/secret-scanning/01-push-protection.sh

    push がブロックされ、ターミナルに解除用の URL が表示される。

    どのパターンを push protection の対象にするかは Enterprise 単位で制御する:octodemo → Pattern configurations ↗Enterprise setting 列でパターンごとに ON / OFF を切り替える。Alert totalFalse positivesBypass rate が並ぶので、ノイズと risk のバランスを実データで説明できる。

    同じページは 何を検出するのか のスライドでも扱う(generic patterns を掘り出す)。

  2. BYPASS PUSH PROTECTION

    ブロックメッセージ内の unblock-secret URL をブラウザで開き、理由を選んで bypass する。

    「secret can now be pushed」と表示される。

    同じブランチをもう一度 push する。

    git push origin HEAD

    Security → Secret scanning のクローズ済みアラートを開き、誰が・どの理由で bypass したかを見せる。

    bypass を野放しにしない設定:Settings → Advanced Security → Push protectionWho can bypass push protectionSpecific roles or teams に(= Delegated bypass)。

  3. VALIDITY CHECK

    Security → Secret scanning の default ビューで Validity フィルターを使う。

    「今も有効な secret」から優先的に対応でき、実リスク順にトリアージできる。

Secret Scanning は 5 つの機能で構成される。入口を塞ぐ Push protection が最優先で、残りは検知・対応・provider 連携を支える。

▸ + をクリックして詳細を表示

Push protectiongit push の直前Docs

何をする?secret を含む push をその場で拒否。bypass は可能だが理由の記録が残る

対象範囲これから入る変更のみ。AI 検出パスワードは対象外(ノイズが多くブロックできない)

Secret scanning alertsコミット後・常時Docs

何をする?検出された secret を Security and quality タブに通知

対象範囲全ブランチの Git 履歴全体・Issue・PR・GitHub Discussions・Wiki・secret gists。新しい secret type の追加時に再スキャンされる

Validity checksアラート発生時Docs

何をする?secret がまだ有効かをプロバイダー API に問い合わせ、対応の優先順位を判断できる

対象範囲一部対応プロバイダー(AWS、GitHub、Slack ほか)。AI 検出パスワードは対象外(問い合わせ先のプロバイダーがない)

Partner programpublic repo で常時 ONDocs

何をする?200+ パートナーの secret が漏れると GitHub が provider に直接通報。provider 側で revoke / 再発行される

対象範囲public repo・public npm package のみ。自分のアラート一覧には出ない(無料・設定変更不可)

Public monitoringgithub.com 全体をリアルタイムDocs

何をする?自分の repo の外(個人フォーク・OSS・公開 issue / PR)で漏れた secret を エンタープライズに帰属させて通知

対象範囲公開コンテンツのみ。private repo は絶対にスキャンしない。GHEC Enterprise 向け

何を検出するのか

DEMO検出タイプFOR PRESENTER ONLY
  1. GENERIC PATTERNS はどこに隠れているか

    octodemo → Pattern configurations ↗ を開き、default patterns タブをスクロールする。

    一覧はフラット。カテゴリ列も provider / generic の区別も絞り込みもない。generic patterns は確かに存在するが、generic とは表示されない。

    名前で指し示す。この 10 個が generic patterns のすべて:

    rsa_private_key openssh_private_key ec_private_key pgp_private_key generic_private_key mongodb_connection_string mysql_connection_url postgres_connection_string http_basic_authentication_header http_bearer_authentication_header

    いずれも GitHub defaultDisabled。検知は動くが push protection は効かない。Enterprise setting 列で ON にして初めて対象になる。

  2. CUSTOM PATTERN と DRY RUN

    Settings → Advanced Security → Custom patterns → New pattern

    該当する secret はデモリポジトリに仕込み済みなので、パターンを作るだけでよい:

    Pattern nameOctodemo internal service token

    Secret formatoctodemo_(live|test)_[A-Za-z0-9]{32}

    Test stringoctodemo_live_L1QNGy4DLxQJ8C85kfwP0lmvCHLDuVxJ

    Test string が緑にならないと保存できない。緑になったら Save and dry run

    dry run はアラートを作らずに仕込んだ secret を検出する。結果を確認してから Publish pattern、必要なら push protection も ON にする。

検出エンジンは 4 種類。パートナー固有の厳密な形式から、AI しか拾えない非構造化 secret まで多層でカバーする。

▸ クリックして詳細を表示

Provider patterns

Provider patterns

AWS、Azure、GCP、Stripe、Slack、OpenAI、GitHub PAT など 200+ パートナーが登録した正規表現で検知。誤検知が極めて少ない。

📘 Supported secrets ↗

Generic patterns

Generic patterns

private key、接続文字列、HTTP basic auth などの汎用パターン。網が広い分、provider patterns よりトリアージ前提で運用する。デフォルトでは push protection の対象外で、Pattern configurations でパターンごとに ON にする必要がある。

AI-detected secrets

AI-detected secrets

パスワードなどの非構造化 secret を AI で検出。正規表現では届かない領域をカバーする。どう設定しても push protection も validity check も非対応で、アラートとしてトリアージする。

Custom patterns

Custom patterns

自社独自のトークン形式に正規表現を定義。社内サービスのトークンやレガシーな認証情報など、パートナーが登録しないものを拾う。

📘 Defining custom patterns ↗

タイプを選択 ▸

漏洩した secret の対応方法

DEMOSecurity campaigns発表者専用
  1. CAMPAIGNS タブ

    theomonfort-org → Campaigns ↗ を開く。

    トラッキング画面。各 campaign の 期限担当者・未対応 / 対応済みの消化状況が並ぶ。伝えたいのは アラートに担当者と期限が付く場所がここ(スプレッドシートではない)ということ。

  2. SECRET SCANNING フィルターから作成

    Create campaign → From secret scanning filters

    その場でフィルターを組み立てて絞り込みの考え方を見せる。is:open から始め、対象リポジトリを絞り、ValidityActiveUnknown を選ぶ。

    フィルターを足すたびに件数が減るのを見せる。これが要点で、バックログではなく終われるリストになる。保存できるのは 1000 alerts まで

  3. 名前・期限・公開

    Save as → Draft campaign で下書きし、名前・説明・期限campaign manager を入力。

    manager の候補に org owner と security manager しか出ないことに触れる。

    Review and publish でアラートを見られる人全員に通知が飛び、各リポジトリの Security タブに campaign が出る。secret campaign が public preview であることも一言添える。

Secret が見つかった時にやることは 検知より修復が大事。規模が大きいときは生のアラート一覧を追わず、security campaign として回す。

▸ ステップをクリックして詳細を表示

対象を絞る

🎯 SCOPE — 重要リポジトリから

Org → Security and quality → Campaigns → Create campaign → From secret scanning filters

組織全体ではなく重要なリポジトリに絞る。リポジトリのカスタムプロパティ(props.BusinessPriority:Urgent)が使いやすい。1000 alerts が上限であり、目安でもある。

優先度をつける

⚡ TRIAGE — 実リスク順に

validity を ActiveUnknown に絞る。Active は今すぐ悪用できる生きた鍵。Unknown は無効と確認できていないので、生きている前提で扱う。

Inactive は後回しでよい。これでバックログが「片付ける価値のあるリスト」になる。

担当と期限

👤 OWN — 担当者と期限を決める

campaign には必ず 期限campaign manager を設定する。manager に指定できるのは org owner と security manager のみ。

どちらか欠けると rotate は進まない。公開するとアラートを見られる人全員に通知が飛び、各リポジトリの Security タブに campaign が出る。

rotate して close

🚨 ROTATE — 無効化してクローズ

リポジトリから消すだけでは不十分で、履歴と他人の clone に残り続ける。

public repo で漏れた partner secret は provider 側で revoke され、自分のアラート一覧には出ない。最後に Revoked / False positive / Used in tests で close し、campaign を消化する。

ステップを選択 ▸

始め方(最短ルート)

Settings → Advanced Security ▸ STEP 1 · PUSH PROTECTION

これから入る secret を push 時にブロック。

Security → Secret scanning ▸ STEP 2 · 既存の漏洩

過去の履歴も自動スキャン。上から rotate。

… → Custom patterns ▸ STEP 3 · CUSTOM PATTERNS

自社独自のトークン形式を正規表現で登録。

Org → … → Configurations ▸ STEP 4 · 全体展開

設定 1 つで Org / Enterprise 全体に一括適用。

⚠️ 旧来の Org REST API フィールドは 2026-04-21 に削除済み。security configurations API を使う。

利用条件と製品

機能 Public repo Private / internal
製品なし
Secret Protection / GHAS
Secret scanning alerts✅ 無料✅ 含む
Push protection(リポ / 組織)✅ 無料✅ 含む
Partner program alerts(provider に通知)✅ 無料・常時 ON❌ public repo のみ
Validity checks✅ 対応 provider
Generic patterns✅ 含む
Custom patterns✅ 含む
AI-detected secrets✅ 含む
Public monitoring✅ GHEC Enterprise

🆓 ユーザー push protection は全プランで無料・デフォルト ON だが、public repo への push のみが対象。Partner alerts も public repo / public npm package の漏洩だけを provider に通知する(常時 ON、設定変更は不可)。

👤 ユーザー所有リポジトリ は例外扱い。アラートには GHEC の Enterprise Managed Users、または Secret Protection を有効にした GHES が必要。Org 所有の private / internal repo なら Team / GHEC で Secret Protection があれば良い。

💰 Generic / Custom / AI detection、Validity checks、private / internal repo の保護には Secret Protection または従来の GHAS が必要。Public monitoring は GHEC Enterprise 向けの enterprise-wide 機能。

📘 詳細: Advanced Security products ↗ / Partner program ↗ / Public monitoring ↗

Public monitoring(NEW) 📖 Docs

  • 🌐 公開コンテンツのみ(git・PR・issue・discussion)。自分の repo の外の漏洩を拾う
  • ⚡ リアルタイム監視。Secret Protection / GHAS 対象、追加費用なし
  • 🧩 設定不要。有効化した時点で既存の finding も出る
帰属の方式判定捕捉できる漏洩
👤 メンバー帰属committer がメンバー管理・既知アカウント
🌐 検証済みドメイン自社ドメインの email仕事用 email の個人

⚙️ Security and quality から enterprise owner / security manager が有効化する。

Secret Risk Assessment 📖 Docs

Org 全体をスキャンし、secret の在りかを可視化。Team / Enterprise は無料

  • 🔎 対象 — Org の全リポジトリ。visibility 問わず、アーカイブ済みも含む
  • 📊 出力 — secret の種類と件数を repo ごとに集計。値は保存も表示もされない
  • 🕒 頻度 — point-in-time。Rerun scan で 90 日ごとに再実行。継続監視ではない
  • 🚀 実行Org → Security and quality → Assessments → Scan your organization。初回は無料の code security assessment も走る

📊 「社内に何件漏れているか」を知る用途と、予算稟議の数字づくりに使う。