EC2のインスタンスメタデータ(IMDS)をv2に移行する手順をまとめてみた

2023.06.08

こんにちは、コンサル部@大阪オフィスのTodaです。

EC2のインスタンスメタデータサービスはEC2内から実行中のインスタンスの設定情報を取得できる仕組みになります。
ここ最近ではAWS Security HubのEC2.8の表示でIMDSv2の利用を推奨されたり、Amazon Linux 2023の初期設定で IMDSv1が無効になっていたりするので切り換え時期かなと考えております。
今回は新規インスタンスと既存インスタンスそれぞれで IMDSv2 のみにする調査と手順をまとめてみました。

EC2インスタンスメタデータサービス(IMDS)とは?

IMDSはEC2内から実行中のインスタンスの設定情報を取得できる仕組みになります。
上記を利用する事でスクリプト内でインスタンスIDなどを取得して利用することができます。
取得可能な情報は下記リストを参照ください。

■ インスタンスメタデータのカテゴリ
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instancedata-data-categories.html#dynamic-data-categories

IMDSv1の問題点

IMDSにはインスタンスプロファイルというEC2に割り当てられた権限が利用できる一時的なアクセスキーを発行する機能があり、IAMユーザのアクセスキーをEC2内のスクリプトに埋め込まないで良くなる点からセキュリティが高く利用されています。
しかし、ここ最近ではSSRF等の脆弱性と組み合わせることで影響の大きな問題になるケースがある事から IMDSv2 が追加されています。
IMDSv1の問題点や、v2の詳細は下記記事を参考ください。

IMDSv2に移行する場合の課題

IMDSをv2に移行する場合、下記の課題が考えれます。

  • AWS CLIやSDKでIMDSv2に対応していないバージョン利用時にシステム不具合が発生する可能性
  • サードパーティ製品でIMDSv1を利用していてIMDSv2移行時に不具合が発生する可能性

それぞれソフトウェアのバージョンにより動作が変わる問題になりますが、 AWS CLIやSDKはIMDSv2に対応しているバージョンが公開されています。
そのため下記3点の方法でご確認頂くのがオススメでございます。

IMDSv2の対応しているか確認方法

当内容では、IMDSv2に対応しているかとIMDSv1を使っていないかの確認方法をまとめています。
サードパーティ製品はIMDSv1を使っていないかをCloud Watchのメトリクスを使って確認をいただき利用時は提供元メーカー確認を頂くのが良さそうです。

AWS CLI or SDKの確認

AWS CLIとAWS SDKはIMDSv2に対応しているバージョンが公開されています。
対応バージョン以上のソフトウェアを利用しているかご確認ください。
なお、CLI/SDKは最新機能やセキュリティアップデートがあるため常に新しいバージョンのご利用を推奨いたします。

■ サポートされる AWS SDK を使用する - AWSドキュメント
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/use-a-supported-sdk-version-for-imdsv2.html

MetadataNoTokenのメトリクスを確認

CloudWatchの画面にて対象のEC2のメトリクスから「MetadataNoToken」を選択します。
こちらの数値は トークンを利用しない IMDSv1 の通信が発生した場合にカウントされますので過去データをご確認いただき数値が0の場合はIMDSv2を利用しているか、 IMDSを利用する処理がないと判断ができます。
サードパーティソフトで IMDSv1を使っているか判断ができない場合にご活用頂けます。

MetadataNoTokenのメトリクスを確認

IMDSパケットアナライザーを使った確認

先日公開されましたIMDSパケットアナライザーを使った確認も1点方法としてございます。
IMDSパケットアナライザーはPythonで作られたツールでIMDSの利用状況をログとして記録することが出来ます。
切り換えに詳細な調査が必要な場合はご活用頂けます。
IMDSパケットアナライザーの詳細は下記記事を参照ください。

■ IMDSv1を使用しているか判断できるIMDSパケットアナライザーがリリースされました
https://dev.classmethod.jp/articles/imds-packet-analyzer-simplifies-migration-imdsv2/

新規インスタンスをIMDSv2で利用する場合

AWSが提供するAMIを利用する場合は、Amazon Linux 2は下記ページにてIMDSv2サポートの表記がある点と、Amazon Linux 2023は初期設定にてIMDSv2が選択されていますので問題は起きにくいと考えます。
また、導入いただくサードパーティソフトウェアでIMDSを利用していて対応状況がわからない場合は、IMDSv1で起動をいただきMetadataNoTokenのメトリクスを確認してからIMDSv2に移行いただくのがトラブルがなく良さそうです。

■ インスタンスメタデータサービスバージョン 2 の使用への移行
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/instance-metadata-transition-to-version-2.html

AWS ソフトウェア すべての Amazon Linux 2 ソフトウェアパッケージが IMDSv2 をサポートしています。

続いてWindows Serverについては対応の状況は表記されていなかったため、確認後のIMDSv2切り換えが良さそうです。
ちなみにクイックスタートAMIに表示され、基準がAmazon Web Servicesと表記されている下記AMIについて起動をおこない1週間起動してMetadataNoTokenのメトリクスを確認したところ数値が0の状態になっている事がわかりました。下記最新のAMIにはAWS CLIやSDKは新しいバージョンが導入されているためIMDSv1を使う処理がないのだと考えます。
こちらは2023/04に調査をしていますのでAMIのIDは変わっている場合がございます。

OS AMI
Windows_Server-2022-Japanese-Full-Base ami-0ae001189e222cd97
Windows_Server-2019-Japanese-Full-Base ami-054b4957ae8450d0d
Windows_Server-2016-Japanese-Full-Base ami-0df379de3b7eaec9b

対応状況の確認が必要な場合は、新規インスタンスでも既存インスタンスと同じように「IMDSv2の対応しているか確認方法」をお試し頂いた後にIMDSv2へ移行頂くのが良さそうです。

既存インスタンスをIMDSv2に移行する場合

既存インスタンスを IMDSv2 に切り替える場合は、導入されているAWS CLIやSDKの状況をご確認頂き、対応しているかの確認が必要になります。
また、サードパーティのソフトウェアでIMDSを利用しているか判断するのが難しい物もございますのでMetadataNoTokenのメトリクスを使った確認をいただき、詳細な調査が必要な場合はIMDSパケットアナライザーを使った調査をいただくのが良さそうです。
ソフトウェアのアップデートが必要な場合は、アップデートを頂き再度MetadataNoTokenのメトリクスによる確認を繰り返していただき数値が「0」になればIMDSv2への移行の準備ができた形となります。

また、サードパーティのソフトウェアは未対応の物がある場合、IMDSv2に移行すると動作が正常にできない場合があるため未対応の物がある場合は IMDSv2への移行は中断いただきソフトウェア提供元への確認をおこなってください。
場合によっては設定変更等で対応が出来る場合がございます。

下記、IMDSv2移行確認の流れを簡易ですが図にしております。

既存インスタンスをIMDSv2に移行する場合

IMDSv2への移行方法

移行の事前確認ができたら対象インスタンスを IMDSv2 に移行します。
以前は AWS CLIから操作が必要でしたが、今はAWSマネージメントコンソールの画面上から操作が可能でございます。

AWSコンソールでの変更

AWSマネージメントコンソールにログインをおこないEC2の一覧から対象を選択します。
画面上部の[アクション]から[インスタンスの設定] > [インスタンスメタデータオプションの変更]をクリックします。

AWSコンソールでの変更1

インスタンスメタデータオプションの変更ウィンドウにてIMDSv2を「必須」に設定します。
変更をするとIMDSv1が利用出来なくなる注意が表示されるため確認後[保存]をクリックします。

AWSコンソールでの変更2

設定の保存をすると反映のプロセスが自動でおこなわれます。
当プロセスはサーバの再起動等は発生いたしません。
数分待ち、インスタンスがIMDSv2に移行されていることを確認します。 なお、何か理由がありIMDSv1利用可能の状態に戻す場合は、先ほどの操作でIMDSv2を「Optional」に変更いただくことで可能でございます。

AWSコンソールでの変更3

AWS CLIを利用した変更

AWS CLIを利用する場合は、下記コマンドを利用して移行を実施いたします。
事前に対象の設定確認をするコマンドも合わせて記載いたします。

対象インスタンスの設定確認

下記コマンドにてインスタンス情報を参照する事でIMDSの設定が把握できます。

$ aws ec2 describe-instances \
	--instance-id (インスタンスID) \
	--query "Reservations[*].Instances[*].MetadataOptions"
[
    [
        {
            "State": "applied",
            "HttpTokens": "optional",
            "HttpPutResponseHopLimit": 1,
            "HttpEndpoint": "enabled",
            "HttpProtocolIpv6": "disabled",
            "InstanceMetadataTags": "disabled"
        }
    ]
]
  • IMDSがv1,v2両方利用できる場合
    • HttpTokens: optional
    • HttpEndpoint: enabled
  • IMDSがv2のみ利用できる場合
    • HttpTokens: required
    • HttpEndpoint: enabled
  • IMDSが無効の場合
    • HttpTokens: optional または required
    • HttpEndpoint: disabled

対象インスタンスのIMDSv2変更

対象インスタンスの設定変更を実施します。
実行をした時点でサーバの再起動等は必要なく設定が反映されます。

$ aws ec2 modify-instance-metadata-options \
  --instance-id (インスタンスID) \
  --http-tokens required

対象インスタンスのIMDSv1,v2に戻す

対象インスタンスのIMDSを変更前の状態に戻します。
何か理由があり戻す場合はご利用ください。

$ aws ec2 modify-instance-metadata-options \
  --instance-id (インスタンスID) \
  --http-tokens optional

さいごに

今回は EC2のインスタンスメタデータ(IMDS)をv2に移行する手順をまとめてみました。
少しでもお客様の参考になればと考えております。