はじめに
IMDS Packet Analyzerが6月に登場したので、どんなサービスか調べてみました。
そもそもIMDSが何かすらわかっていなかったので、以下を参考にIMDSについてまとめます。
Instance Metadata Service(IMDS)とは
インスタンスメタデータは、OS上から取得できるEC2のメタデータ情報です。
インスタンスIDやインスタンスタイプ、AZなどを確認できます。
IMDSは、169.254.169.254というリンクローカルIPで動作しています。curlコマンド等でアクセスしてインスタンスメタデータを取得可能です。
※リンクローカルアドレス
リンクローカルアドレスは、特定のネットワーク内で使われるもので、そのネットワークの中で通信やデータのやり取りをするために使います。例えば、職場や家庭の中にあるコンピュータやスマートフォンが、そのネットワーク内でデータを送受信する場合、リンクローカルアドレスが使われます。これにより、同じネットワーク内にある機器同士が互いを認識し、データを送り合うことができます。リンクローカルアドレスは、特別な番号のようなもので、一般的なインターネット上のIPアドレスとは異なります。
コンピュータがネットワークに接続すると、まずDHCPDISCOVERパケットを送信してDHCPサーバーを探します。 DHCPサーバーが見つからない場合、コンピュータは自動プライベートIPアドレスアドレス自動構成(APIPA)プロセスを使用してリンクローカルアドレスを割り当てます。 APIPAは、DHCPサーバーに接続できないコンピュータにIPアドレスを自動的に割り当てるプロセスです。コンピュータは、リンクローカルアドレスを使用してネットワーク上の他のコンピュータと通信できます。リンクローカルアドレスは、インターネットに公開されていないため、インターネットとの通信には使用できません。
Instance Metadata Service(IMDS) v1のリスク
EC2は基本的に、メタデータの中にあるインスタンスプロファイルを利用し、他のAWSサービスと連携します。
※インスタンスプロファイル
・IAMロールを格納するコンテナ
・EC2に割り当てられた権限が利用できる一時的なアクセスキーを発行する機能を有する
例えば、S3へのアクセスを許可したIAM ロールをEC2に割り当てると、EC2内のスクリプト等からS3にアクセスすることができるようになります。
上記の方法は、スクリプト内にIAM ユーザのアクセスキーを埋め込む方法よりはセキュアですが、インスタンスプロファイルを外部から取得することが可能な脆弱性と組み合わせられる事によりクレデンシャルが漏洩し、そのEC2に割り当てられた権限を悪用することが可能になってしまいます。
米金融大手 Capital Oneの事例
米金融大手のCapital Oneでは、独自運用のWAFの設定ミスによって、SSRF攻撃を受け、インスタンスメタデータからクレデンシャルを取得されてしまいました。
結果、その権限でアクセスできるS3上の、1億人以上の個人情報が流出してしまいました。
※SSRF攻撃
クラウド上にある外部に公開されているサーバから、内部のサーバに送られるリクエストを偽造し、本来公開されてないサーバにアクセスするという手法
Instance Metadata Service(IMDS) v2の登場
上記のCapital Oneの個人情報流出を受け、SSRF攻撃の対策として、AWSよりIMDS v2が発表されました。
IMDS v2により、アプリケーションレイヤーやIAM ロールの設計・ポリシーで、SSRF攻撃の対策が必要だったところを、IMDS側で対策を強化することができるようになりました。
IMDS v2による改善点のは以下を参考にしてください。
IMDS Packet Analyzer
本題のIMDS Packet Analyzerについてですが、どのようなものかというと、IMDSとのTCP通信をトレースするツールです。
GitHub上に公開されていて、都度必要なEC2インスタンスにインストールして使用します。(IMDSv1が使用されているか判断するために一時的に使用するツールです。分析が完了したら削除することが推奨されます)
IMDS Packet Analyzerでできること
IMDSv1を使用しているかどうか判断し、SSRF攻撃対策をとることができます。
ほとんどのEC2では、デフォルトでIMDS v1、v2がどちらも有効化されています。
どのプロセスがどちらを使っているのか判断するメトリクスがないため、これまでは確認が簡単でない状況でした。
IMDS Packet Analyzerを利用することで、トークンを取得せずにIMDSに直接リクエストしたプロセス(IMDS v1)とそうでないプロセス(IMDS v2)をロギングすることができます。
これにより、プロセスがIMDS v1、v2のどちらを使用しているか判断することができます。
おわりに
IMDSについて、聞いたことはあるけど何かは知らない状況でした。
v1からv2への背景を知り、とても勉強になりました。