皆さん、こんにちは。クラウド基盤技術部のR.Aです。
今回はAWSのセキュリティ診断ツール4製品(ProwlerCheck、Steampipe、AWS Service Screener V2、AWS Security Hub)を比較検証している中で見つかった、ちょっと気になる判定結果の食い違いについてお届けします。
あるEC2起動テンプレートのIMDSv2必須化チェックで、ProwlerCheckだけが「問題なし」と判定していた事例です。
目次
- はじめに(結論)
- IMDSv2とは
- 事象: 3製品で判定が割れた
- 原因調査: 「未設定」と「無効化」の混同
- まとめ
はじめに(結論)
結論から言うと、あるEC2起動テンプレートに対して、SecurityHubとSteampipeは「要対応(FAIL)」と正しく判定していたのに対し、ProwlerCheckだけが「問題なし(PASS)」と判定していました。
原因を調べたところ、ProwlerCheckが「設定が何も指定されていない状態」を「わざと無効化されている状態」と取り違えて判定していた可能性が高いことが分かりました。ただしこれはあくまで「可能性が高い」という段階の話であり、断定はできていません。
なおProwlerCheckは、今回の検証全体では無料でカバー範囲が広いなど高く評価しているツールです。
今回はその中で見つかった1つのチェックロジックに関する注意点、という位置づけの話としてご覧ください。
IMDSv2とは
一言でいうと、IMDSv2はEC2インスタンスがAWSの内部情報(認証情報など)を安全に取得するための仕組みの新しいバージョンです。
EC2インスタンスは「メタデータサービス」と呼ばれる仕組みを使って、自分自身に関する情報や、一時的な認証情報を取得できます。旧バージョンのIMDSv1には、SSRF(サーバー側リクエスト偽造。外部から仕込んだリクエストを使って、本来アクセスできないはずの内部情報を盗み出す攻撃手法)によって悪用される脆弱性が知られており、AWSはIMDSv2への切り替えを推奨しています。
そのため多くのセキュリティ診断ツールには、EC2起動テンプレートやEC2インスタンスが「IMDSv2を必須にしているか」をチェックする項目が用意されています。
事象: 3製品で判定が割れた
一言でいうと、同じEC2起動テンプレート・同じチェック内容にもかかわらず、ProwlerCheckだけが他の2製品と違う判定結果を出していました。
4製品の検出結果を突き合わせる過程で、あるEC2起動テンプレートについて、ProwlerCheckのIMDSv2必須化チェック(CHECKID: ec2_launch_template_imdsv2_required)が一貫してPASS(問題なし)と判定していることが見つかりました。
一方、同じ起動テンプレートを他の製品で確認すると、判定は次のようになっていました。
| 製品 | 判定 |
|---|---|
| SecurityHub | FAIL(要対応) |
| Steampipe | ALARM(要対応) |
| ProwlerCheck | PASS(問題なし) |
3製品中2製品が「要対応」としている中で、ProwlerCheckだけが「問題なし」としている状態です。
ProwlerCheckが生成した生のCSVファイルには、以下のように記載されていました。
| 項目 | CSVファイルに記録されていた値 |
|---|---|
| CHECKID(チェックの識別子) | ec2_launch_template_imdsv2_required |
| STATUS(判定結果) | PASS |
| STATUS_EXTENDED(判定理由、原文の英語) | EC2 Launch Template (起動テンプレート名) has metadata service disabled in the following versions: 1. |
原因調査: 「未設定」と「無効化」の混同
このEC2起動テンプレートは実際には「メタデータサービスが無効化されている」のではなく、「メタデータオプションの設定自体が何も指定されていない」状態でした。
SecurityHubの生データ(この起動テンプレートの設定情報そのもの)を確認したところ、テンプレートの「メタデータオプション」フィールドは実際には未設定(何も指定されていない状態)でした。「明示的に無効化されている」わけではありません。
マネジメントコンソールで、この起動テンプレートの「高度な詳細」タブを開き、メタデータ関連の項目を確認しました。

「アクセス可能なメタデータ」「トークンホップの制限」「メタデータのバージョン」「メタデータIPv6エンドポイント」のいずれも「-」と表示されており、何も設定されていないことが画面上でも確認できました。
画面表示だけでは省略されている可能性も否定できないため、AWS CLIで生の設定値も直接取得しました。
aws ec2 describe-launch-template-versions \
--launch-template-id <起動テンプレートID> \
--versions 1 \
--region ap-northeast-1 \
--query 'LaunchTemplateVersions[].LaunchTemplateData.MetadataOptions'
結果は空の配列([])でした。--queryを外してLaunchTemplateDataの内容を全件取得しても、MetadataOptionsというキー自体が出力に含まれていませんでした。
マネジメントコンソールの表示とCLIでも、「メタデータオプションの設定項目自体が存在しない(未設定)」ことが確認できました。
IMDSv2を必須にするには、本来この設定項目で明示的に「IMDSv2のみ許可する」よう指定する必要があります。何も指定していなければ、IMDSv2は強制されておらず、旧バージョンのIMDSv1でもアクセスできてしまう状態のままです。
つまり「未設定」は「対策していない」に等しく、本来はFAIL(要対応)と判定すべき状態です。
SecurityHubとSteampipeは、この「未設定=IMDSv2を強制していない」状態を正しくFAILと判定していました。それに対してProwlerCheckは、「メタデータオプションが未設定であること」を「メタデータサービスが無効化されていること」と誤って解釈し、PASSと判定していた可能性が高いと考えられます。
これはProwlerCheck固有の検知ロジックの誤り、または過度に楽観的な判定である可能性があり、断定はできませんが、ProwlerCheckを軸に据えて診断を行う場合の注意点として共有します。
なお、これは今回の検証で見つかった特定の1チェック(IMDSv2必須化チェック)における判定ロジックの解釈の問題であり、ProwlerCheck全体の検出力を否定するものではありません。
まとめ
今回の調査で分かったポイントを整理します。
- あるEC2起動テンプレートのIMDSv2必須化チェックで、ProwlerCheckだけが「問題なし(PASS)」、SecurityHubとSteampipeは「要対応」と判定していた
- ProwlerCheckの判定理由は「メタデータサービスが無効化されている」というものだったが、実際の設定は「未設定」であり「明示的な無効化」ではなかった
- ProwlerCheckが「未設定」を「無効化」と誤って解釈していた可能性が高い
- ProwlerCheckを軸に診断を行う場合、EC2起動テンプレートのIMDSv2必須化チェックについては、他製品や設定のデータでの裏取りをおすすめします
複数のセキュリティ診断ツールを併用し、判定が割れた項目は生データまで遡って確認することの大切さを改めて感じた事例でした。
最後までご覧いただきありがとうございました!






