Aikido

シークレット検出:漏洩した認証情報を発見し防止するための実践ガイド

ルーベン・カメルリンクルーベン・カメルリンク
|
#

シークレットAPIキー、パスワード、証明書など)は、遊び場のささやき声のデジタル版であり、一般公開されるものではなく、信頼できる受信者向けです。現代のソフトウェアでは、シークレットはプログラムによって使用されるため、遍在的でありながら脆弱です。放置されると、多くの場合、大規模な侵害の出発点となります。このガイドでは、シークレットがどこから漏洩するのか、なぜその検出が見た目よりも難しいのか、優れた検出が実際に何をするのか、そして偶発的な漏洩がインシデントになる前に阻止するためにどのように展開するかを説明します。

ソフトウェアにおいて「秘密」とは何を指すのか?

シークレットとは、APIキー、データベースパスワード、OAuthトークン、SSHキー、TLS証明書など、システムやサービスへのアクセスを許可するあらゆる認証情報です。シークレットはプログラムによって利用されるため、ソースコード、CIパイプライン、開発者のマシン、バックアップなどを経由し、広範な攻撃対象領域を生み出します。

シークレットが一般的に漏洩する仕組み

最も一般的な情報漏洩経路の一つがソース管理履歴である。典型的なシナリオ:

  1. 開発者は機能ブランチを作成し、何かを素早くテストするために認証情報をハードコードする。
  2. 検証が完了すると、資格情報を環境変数またはVault呼び出しに置き換え、変更をレビューのためにプッシュします。
  3. コードレビューは現在の差分のみを確認する。一時的なシークレットはブランチやコミット履歴の中に埋もれたままとなる。
開発ブランチ上のコミットCに「APIキーがハードコードされている(シークレット)」とラベル付けされたGit履歴の図
開発ブランチのコミットCには、APIキーがハードコードされています。これは履歴に残るシークレットです。

Gitの履歴を書き換えない限り(これは破壊的でリスクを伴う)、その秘密は存続します。攻撃者がリポジトリ(非公開リポジトリであっても)へのアクセス権を獲得した場合、履歴をスキャンして認証情報を収集し、より価値の高い標的に移行することが可能です。

この問題はどの程度広まっているのか?

公開された調査によると、これは決して珍しいことではありません。GitHubの大規模スキャンでは、数百万もの公開されたシークレットが明らかになり、プライベートリポジトリでさえ驚くほど高い割合で存在しています。実際の侵害事例がそのリスクを証明しており、漏洩したソースコードダンプからは、クラウドトークンや支払いキーを含む数千もの認証情報が見つかっています。

「2024年に公開GitHubコミットで23,770,171件の新規シークレットが検出されました」と表示されたスライドと関連する統計データ
GitGuardian:2024年に公開されたGitHubコミットで23,770,171件の新しいシークレットが検出されました。これはその規模を明確に示すものです。

SASTだけでは不十分な理由

静的アプリケーションセキュリティテスト(SAST)は、現在のコードベースにおけるSQLインジェクションやパストラバーサルなどの検出に優れていますが、通常は最新のスナップショットをスキャンするだけで、完全なコミット履歴は対象としません。シークレットは異なります。どのコミット、ブランチ、タグに含まれるシークレットも、侵害のリスクとなります。したがって、検出には完全な履歴と、その履歴が存在する複数のリポジトリを考慮する必要があります。

ターミナルの「スキャン概要」出力。スキャン結果と、スキャンがgitで追跡されているファイルに限定された旨のメッセージを表示。プレゼンターが挿入されている。
スキャン結果の概要と、スキャンがgitで追跡されているファイルに限定された旨の注記。

シークレット検出が「単なる正規表現」よりも難しい理由

一見すると、「API_KEY=」の正規表現を書いて終わりだと思われるかもしれません。しかし実際には、シークレット検出は開発者をノイズで埋もれさせないよう、精度と再現率のバランスを取る必要があります。

  • エントロピーの高い文字列(ランダムに見える値)は、多くの場合シークレットですが、常にそうとは限りません。シークレットではない多くの成果物もエントロピーが高くなります。
  • プレースホルダーやサンプルがコードベースに散見される。見た目が似ているキーを安易にフラグ付けすると、誤検知が発生しワークフローが中断する。
  • プロバイダーのパターンは様々です。一部のサービス(Stripe、AWS、Twilio)は識別可能なプレフィックスや形式を使用しますが、他のサービスは使用しません。
スライドのタイトルは「生の高エントロピー文字列」で、長い16進数のようなトークンと赤い「秘密」インジケーターが表示されている
高エントロピー文字列の例:一見すると秘密のように見えるものを説明するために用いられる。

効果的なシークレット検出とは

効果的なシークレット検出ソリューションは、複数のシグナルを使用して誤検知を減らし、実際の漏洩を捕捉します。

  • 既知のプロバイダーに対するパターンマッチング。プロバイダー固有の形式に従うキーを識別する(例:Stripeプレフィックス、AWSトークン形状)。
  • 可能な限り検証を行う。非破壊的な検証(このAWSキーは存在するか?有効か?)を試み、発見が真実かどうかを確認する。
  • エントロピー + コンテキスト。エントロピー測定値を用いて高ランダム性の文字列を見つけ、その後、周囲のコード(ファイルパス、変数名、コメント)を調査してそれが秘密かどうかを判断する。
  • アンチ辞書チェック。英語の単語や明白なプレースホルダーを含む文字列を除外して、ノイズを削減します。
  • 履歴を意識したスキャン。メインブランチの先端だけでなく、ブランチ、タグ、ミラー全体にわたるGit履歴をスキャンします。
  • 開発者中心のデプロイ。リモート(中央リポジトリ)とローカル(コミット前フック、IDEプラグイン)の両方で検出を実行し、ワークフローの早い段階でリークを防止します。
マイクを持ったプレゼンターと「すべてのシークレットをカテゴリ別に特定する」と表示されたスライド
シークレットをカテゴリ別に識別します。これは実用的な検出目標です。

シークレット検出ツールのテスト(と一般的な落とし穴)

ツールを評価する際、チームはしばしば単純なテストを実施する:明らかな秘密文字列をハードコードし、スキャナーがそれを検出することを期待する。皮肉なことに、あらゆる明らかな偽の秘密をフラグ付けするツールは低品質である可能性がある——単純なテストではノイズの多いツールが最も良く見えるのだ。

優れたツールは意図的に些細で非現実的なパターンやプレースホルダー値を無視する。あらゆるランダムな文字列に対して警告を発するよりも、疑わしい発見の検証を優先する。

CanarytokensのWebダッシュボードに表示されるトークンタイプ(Webバグ、DNS、AWSインフラ、クレジットカード、QRコード、MySQL、AWSキー、偽アプリ、Log4shell、高速リダイレクト)
Canarytokensダッシュボード — 検出とアラートを安全にテストするためのハニートークンを作成します。

適切なテスト方法:

  1. ハニートークン/カナリアトークン(制御可能な実際の低リスクAPIキー)を使用し、検出とアラートをテストするために安全に公開できます。
  2. ツールを、現在のファイル内の新しい偽キーだけでなく、過去のブランチや忘れられたコミットに対しても実行する。
  3. 誤検知率と検証の成功を測定します。ツールはノイズを削減しつつ、実際にアクション可能なシークレットを検出できるでしょうか?

シークレット検出の展開場所

検出は複数の層で行われるべきである:

  • リモートGitリポジトリ(必須)。中央Gitホスティングは信頼できる唯一のソースです:全リポジトリと完全な履歴をスキャンします。ここに存在する機密情報は漏洩したものとみなすべきです。
ローカルリポジトリ(IDEとローカルコミット)が、新規プルリクエストとCI/CDステージを示すリモートリポジトリにプッシュしている様式化された図
ローカルリポジトリとリモートリポジトリ、およびプッシュ操作がプルリクエストを生成する仕組みを示す図 — リモートスキャンが属する場所。
  • 開発者のローカル環境(強く推奨)。プレコミットフックやIDEまたはエディタの拡張機能を使用して、プッシュされる前にシークレットを捕捉します。ローカルでのフィードバックは手戻りを防ぎ、開発者に制御権を与えます。
  • CI/CDパイプライン。検証済みのシークレットが検出された場合にマージやデプロイをブロックするチェックを追加し、開発を妨げる誤検知を最小限に抑えるルールを確保します。
「秘密情報が[あなたのリモートリポジトリ]に侵入した場合、その情報は漏洩したとみなす必要があります。」

機密漏洩を発見した際の迅速な対応チェックリスト

  1. 秘密鍵を直ちにローテーションする(認証情報をローテーションし、トークンを無効化する)。
  2. 範囲の評価:その鍵でアクセス可能なシステムはどれか?
  3. すべてのコミットとブランチから秘密情報を削除する — 履歴の書き換えは、必要かつワークフロー上許容できる場合にのみ検討してください。
  4. 他のリポジトリやバックアップにおける同様の漏洩について監査を実施する。
  5. 開発者のワークフローとツールを改善し、再発を防止する(IDEプラグイン、コミット前フック、Vaultの導入)。

要約:基本事項

  • 現代の開発においてシークレットは至る所に存在し、多くの場合Gitの履歴に残っています。
  • ツリーの先端のみをスキャンするSASTツールは、シークレット検出には不十分です。
  • 効果的な検出は、プロバイダーパターン、検証、エントロピー/コンテキスト分析、およびアンチ辞書フィルターを組み合わせてノイズを削減します。
  • 検出機能を中央(リモートリポジトリ)とローカル(IDE/フック)の両方に展開し、リークを早期に捕捉して猫とネズミの駆け引きを回避する。
  • ハニートークンや過去のスキャン記録を用いて、無意味な偽キーではなく責任を持ってスキャナーをテストしてください。

シークレットの検出は、継続的な開発者ファーストの課題です。適切なシグナルと配置を組み合わせることで、開発者を誤検知で埋もれさせることなく、リスクを劇的に軽減できます。まずGit履歴をスキャンし、ローカル保護を追加し、選択するあらゆるシークレット検出ソリューションの主要機能として検証を組み込みましょう。今すぐAikido Securityをお試しください!

4.7/5

今すぐソフトウェアを保護しましょう

無料で始める
CC不要
デモを予約する
データは共有されない - 読み取り専用アクセス - CC不要

今すぐ安全を確保しましょう

コード、クラウド、ランタイムを1つの中央システムでセキュアに。
脆弱性を迅速に発見し、自動的に修正。

クレジットカードは不要。