攻撃を知り、防ぐ

認証情報の盗難と、秘密情報の漏えい

コードや公開ファイルに紛れ込んだ API キーを見つける方法と、見つかったあとにすることを学びます。

  • レベル: 基礎
  • 約35分
  • 2026-11-03

#秘密情報は、どこから漏れるのか

API キー、アクセストークン、秘密鍵のような「秘密情報」は、持っているだけで、持ち主になりすませる文字列です。攻撃者は、パスワードを破る代わりに、誰かがすでに置き忘れた秘密情報を探します。置き忘れは、たいてい次の 4 か所で起きます。

場所起きること
ソースコード動作確認のために直接書いた鍵が、そのままコミットされる
設定ファイル・ログ.env やデバッグの出力に鍵が混ざったまま、共有される
Web に公開するファイルビルドの成果物(dist など)に、鍵がそのまま入っている
ソースマップ本番にも置かれて、元のソースコードが丸ごと読めてしまう

どの場合も、攻撃者は侵入する必要がありません。公開されている場所を読むだけで、秘密情報が手に入ります。

「消せば終わり」ではない

一度でも公開された秘密情報は、あとで消しても、漏れたものとして扱います。コピーや検索エンジンのキャッシュ、誰かのクローンに残っているかもしれないからです。対処の中心は「消す」ことではなく、発行元で「無効にする」ことです。

#文字列の中の秘密情報を見つける

RoamSwitch の API キー・秘密鍵の検出 は、文章やファイルの中から、既知の形式の API キーや秘密鍵を探します。

文字列を検査する

下の鍵は、AWS の公式文書に載っている無効なサンプルです。実在しない鍵なので、安心して試せます。本物の鍵は使わないでください。

roamswitch audit-secrets "aws_access_key_id=AKIAIOSFODNN7EXAMPLE"
実行結果
1件の機密情報・APIキー露出を検出しました。コミットや外部共有前に削除してください。

  ⚠️  AWS Access Key ID (AWS): 行番号 1
      マスク済み: AKIAIO...MPLE (エントロピー: 3.68)
      ↳ 推奨対応: AWS IAMコンソールからアクセスキーを非アクティブ化してください。

見るところは 3 つあります。

  • マスク済み: 鍵の全体は、画面にも記録にも残しません。検査の結果を人に見せても、鍵は漏れません
  • エントロピー: 文字の並びのでたらめさです。値が高いほど、人が付けた名前ではなく、機械が作った鍵らしい文字列です
  • 推奨対応: 鍵の発行元で無効にすることを求めています。ファイルから消すだけでは、対処は終わりません

#公開するファイルの中の秘密情報を見つける

Web サイトのビルド成果物は、そのまま世界中に公開されます。公開されるフロントエンドの秘密の検査 は、公開するフォルダを調べます。

公開するフォルダを検査する

ダミーのビルド成果物を作って、検査します。app.js に先ほどのサンプルキーを書き、ソースマップ(app.js.map)も置きます。

mkdir -p dist
printf 'const cfg = { accessKeyId: "AKIAIOSFODNN7EXAMPLE" };\n//# sourceMappingURL=app.js.map\n' > dist/app.js
echo '{"version":3,"sources":["src/app.ts"],"mappings":""}' > dist/app.js.map
roamswitch scan-frontend ./dist
echo "終了コード: $?"
実行結果
調べた場所: .(ファイル 2 件)
- 機密情報(APIキー・秘密鍵など): app.js:1 AWS AKIAIO...MPLE
- ソースマップ(元のソースコードが読めてしまう): app.js.map
2 件(機密情報 1、トークン 0、ソースマップ 1)
見つかったキーやトークンは、すでに公開したなら流出したものとして、発行元で無効にして作り直してください。秘密はビルドに含めず、サーバー側に置いてください。ソースマップは、本番に置かないか、アクセスを制限してください。
終了コード: 1

終了コードが 1 になるので、このコマンドをビルドの最後に入れると、秘密情報が入ったまま公開しようとしたときに、そこで止められます。問題がなければ、終了コードは 0 です。

#見つかったとき、最初にすること

順番が大切です。

  1. 発行元で、その鍵を無効にする。先に Git の履歴を直したり、ファイルを消したりしないでください。その間も、鍵は使えるままです
  2. 使われた形跡を調べる。発行元の操作ログ(AWS なら CloudTrail など)で、身に覚えのない操作がないかを確かめます
  3. 新しい鍵を発行して、差し替える。差し替えたあと、正しく動くかを確かめます
  4. ソースから取り除く。秘密情報はコードやビルドに含めず、動かす側(サーバーの環境変数や、秘密情報を管理する仕組み)に置きます
  5. 再発を防ぐ。コミットの前や、ビルドの最後に、検査が自動で動くようにします
やってはいけないこと
  • 鍵を消しただけで、無効にしないまま済ませる
  • 「本当に使えるか」を確かめようとして、漏れた鍵を自分で使ってみる
  • 検査の結果を共有するために、鍵の全体をチャットや Issue に貼る(マスクされた表示を使います)

#見えない部分

検査が見つけられないもの

実機で確かめた範囲では、次のようなことがあります。

  • 鍵の片方だけでは、見つからないことがある。AWS の鍵は、AKIA で始まる「アクセスキー ID」と、決まった形がない「シークレットアクセスキー」の 2 つで 1 組です。シークレットアクセスキーだけを検査すると、「検出されませんでした」と表示されました。ID と一緒に書いてあれば、ID が検出されます
  • 「検出されませんでした」と表示されても、鍵がない証明にはならない。意味は「知っている形式の鍵は見つからなかった」です。独自の形式の鍵や、名前が付いていない文字列は、検査の対象外です
  • 検査は文字列を読むだけで、その鍵がまだ有効かどうかは確かめません。有効かどうかは、発行元でしか分かりません
確認問題

シークレットアクセスキーだけを検査したら、「検出されませんでした」と表示されました。正しい解釈はどれですか

解説を見る

この検査は、形式(AKIA で始まるなど)を手がかりに探します。決まった形がない文字列は、鍵であっても見つけられません。「見つからない」ことは、「ない」ことと同じではありません。

#次に学ぶこと

  • 鍵を盗もうとする動きは、認証情報のおとり などの機能で見張っています(この教材では、これから取り上げます)
  • 依存パッケージを通じて秘密情報が盗まれる経路は、サプライチェーン攻撃 で学べます
扱う機能

対応する攻撃手法 (ATT&CK): T1204.004

確認した内容

2026-11-03に確認しました。対象は Linux 1.17.30 です。Ubuntu 26.04 の Server Edition で、AWS の公式文書にある無効なサンプルキーを使って実行

コマンドの出力は、製品の版や環境によって変わります。違いが出たら、まず製品の版を確かめてください。