#秘密情報は、どこから漏れるのか
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 です。
#見つかったとき、最初にすること
順番が大切です。
- 発行元で、その鍵を無効にする。先に Git の履歴を直したり、ファイルを消したりしないでください。その間も、鍵は使えるままです
- 使われた形跡を調べる。発行元の操作ログ(AWS なら CloudTrail など)で、身に覚えのない操作がないかを確かめます
- 新しい鍵を発行して、差し替える。差し替えたあと、正しく動くかを確かめます
- ソースから取り除く。秘密情報はコードやビルドに含めず、動かす側(サーバーの環境変数や、秘密情報を管理する仕組み)に置きます
- 再発を防ぐ。コミットの前や、ビルドの最後に、検査が自動で動くようにします
- 鍵を消しただけで、無効にしないまま済ませる
- 「本当に使えるか」を確かめようとして、漏れた鍵を自分で使ってみる
- 検査の結果を共有するために、鍵の全体をチャットや 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 の公式文書にある無効なサンプルキーを使って実行
コマンドの出力は、製品の版や環境によって変わります。違いが出たら、まず製品の版を確かめてください。