用語解説

シークレットスキャンとは?HTML共有・AI生成サイトでの意味をやさしく解説

AIにHTMLを生成させると、プロンプトに含めたAPIキーや認証トークンが出力のコードに混入するケースがあります。シークレットスキャンは、そうした機密情報がファイルに含まれていないかを自動で検査する仕組みで、静的HTMLを公開する前の最終チェックとして重要な役割を果たします。

ひとことで言うと

シークレットスキャン(Secret Scanning)とは、ソースコードやファイル内にAPIキー・パスワード・OAuth トークン・秘密鍵などの機密情報が含まれていないかを自動検査する仕組みです。GitHubがリポジトリへのプッシュ時に実行する機能が有名ですが、CDNへのファイルアップロード時にも同様の検査が行われるサービスがあります。

検出の手法としては、AWSアクセスキーの形式(AWSアクセスキーID...)・GitHubトークンの形式(ghp-...)のような既知パターンとの正規表現マッチングが主流です。高度なサービスではエントロピー分析(文字列のランダム性)も組み合わせて、パターンに合致しない未知のシークレットも検出します。

  • 相手がログインなしで開ける状態か確認する
  • PCとスマホで最低1回ずつ表示を確認する
  • 内部情報・個人情報・不要な外部送信が残っていないか見る
  • レビュー期限と修正時の差し替え方を決めておく

HTML共有で関係する場面

AIにチャットアプリのフロントエンドHTMLを生成させた際、プロンプトで「Firebase設定をそのまま使って」と指示すると、Firebaseの設定オブジェクト(apiKey・projectId等)がHTMLのscriptタグに直接埋め込まれることがあります。このファイルをそのまま共有すると、APIキーが外部に公開された状態になります。

zipファイルで複数のHTMLとJSファイルを共有する場合、個別ファイルは問題なくても、設定ファイルやenv.jsのようなファイルが混入しているケースがあります。共有サービスがzipを展開してシークレットスキャンを実行し、問題のあるファイルを検出した場合は公開をブロックして警告を出すことがあります。

よくある誤解

「公開されてもすぐに使われなければ問題ない」という過小評価があります。インターネット上には公開URLを常時クローリングして機密情報を収集する自動化ツールが多数存在し、公開から数分以内にシークレットが収集・悪用されるケースが報告されています。発見したら即座にキーを無効化・ローテーションする必要があります。

「HTMLファイルにシークレットが入ることはない」という思い込みもあります。JavaScriptはHTMLに直接記述できるため、フロントエンドコードにAPI呼び出しを実装する際にキーが混入しやすい構造になっています。特にAI生成コードはサンプルコードをそのまま出力する傾向があるため、プレースホルダーと思っていたキーが実際の値になっているケースが多数報告されています。

安全に使うための注意点

HTMLをアップロードする前に、grepコマンドやVSCodeの検索機能で「AWSアクセスキーID」「ghp-」「sk-」「password」「secret」「token」などのキーワードを全ファイルに対して検索してください。これらの文字列を含む行が見つかった場合は、値が実際のシークレットでないか必ず確認します。

AIにコードを生成させる際は「APIキーはプレースホルダーで出力して、実際の値は後から環境変数で注入する」という指示を明示してください。また、共有するHTMLでは外部APIを直接呼び出す実装を避け、バックエンド経由でアクセスする設計にするか、読み取り専用・特定ドメイン制限付きのAPIキーを使うことでリスクを限定できます。

よくある質問

AIが生成したHTMLにシークレットが入っていないか、手軽に確認する方法はありますか?

truffleHogやgitleaksなどのOSSツールをローカルで実行すると、ファイル内の既知パターンのシークレットを数秒で検出できます。コマンド一行で実行できるため、公開前のチェックフローに組み込むのが最も確実です。

シークレットが公開されてしまった場合、まず何をすればよいですか?

1分でも早くそのシークレット(APIキー・トークン等)を発行元サービスの管理画面で無効化・削除してください。次にログを確認して不正利用がないかを調べ、新しいキーを発行して正規の箇所にのみ設定し直します。

フロントエンドHTMLでどうしても外部APIを呼び出す必要がある場合、どうすればよいですか?

APIキーをHTMLに直接記述するのではなく、リクエスト元ドメインを制限した公開キーを使うか、Cloudflare Workersなどのエッジ関数をプロキシとして挟み、本当のキーはサーバー側だけが持つ構成にしてください。

関連記事

「用語解説」の記事をもっと見る →