インスタンスメタデータサービスバージョン 2 の使用への移行
IMDSv2 の使用に移行する場合、次のツールと移行パスを使用することが推奨されます。
IMDSv2 への移行に役立つツール
お使いのソフトウェアで IMDSv1 が使用されている場合、次のツールを使用して IMDSv2 を使用するようソフトウェアを再構成することができます。
- AWS ソフトウェア
-
最新バージョンの AWS CLI および AWS SDK では、IMDSv2 をサポートしています。IMDSv2 を使用するには、EC2 インスタンスで、最新バージョンの CLI および SDK を使用している必要があります。CLI の更新の詳細については、 AWS Command Line Interface ユーザーガイドの、「AWS CLI のインストール、更新、およびアンインストール」を参照してください。
すべての Amazon Linux 2 と Amazon Linux 2023 ソフトウェアパッケージが IMDSv2 をサポートしています。Amazon Linux 2023 では、IMDSv1 はデフォルトで無効になっています。
IMDSv2 をサポートする最低限の AWS SDK バージョンについては、「サポートされる AWS SDK を使用する」を参照してください。
- IMDS パケットアナライザー
-
IMDS パケットアナライザーは、インスタンスのブートフェーズからの IMDSv1 呼び出しを特定して記録するオープンソースツールです。このツールは、EC2 インスタンスで IMDSv1 呼び出しを行うソフトウェアを特定するのに役立ち、インスタンスで IMDSv2 のみを使用できるようにするために何を更新する必要があるかを正確に特定できます。IMDS パケットアナライザーは、コマンドラインから実行することも、サービスとしてインストールすることもできます。詳細については、GitHub の「IMDS パケットアナライザー
」を参照してください - CloudWatch
-
IMDSv2 では、IMDSv1 がサポートしていない、トークンベースのセッションが利用できます。
MetadataNoToken
CloudWatch メトリクスは、IMDSv1 を使用しているインスタンスメタデータサービス (IMDS) への呼び出しの数を追跡します。このメトリクスをゼロまでトラッキングすることにより、すべてのソフトウェアが IMDSv2 を使用するようアップグレードされたかどうか、およびいつアップデートが行われたかを測定できます。IMDSv1 を無効にした後、
MetadataNoTokenRejected
CloudWatch メトリクスを使用して、IMDSv1 呼び出しが試行および拒否された回数を追跡できます。このメトリクスを追跡することで、IMDSv2 を使用するようにソフトウェアを更新する必要があるかどうかを確認できます。詳細については、「インスタンスメトリクス」を参照してください。
- EC2 API および CLI への更新
-
新しいインスタンスについては、RunInstances API を使用して、IMDSv2 の使用を義務付ける新しいインスタンスを起動できます。詳細については、「新規インスタンスのインスタンスメタデータオプションの設定」を参照してください。
既存のインスタンスの場合、ModifyInstanceMetadataOptions API を使用して IMDSv2 の使用を要求できます。詳細については、「既存インスタンスのインスタンスメタデータオプションの変更」を参照してください。
Auto Scaling グループによって起動されたすべての新しいインスタンスで IMDSv2 の使用を必須にするために、Auto Scaling グループは起動テンプレートまたは起動設定を使用できます。起動テンプレートの作成時や起動設定の作成時に、IMDSv2 の使用が必須となるように
MetadataOptions
パラメータを設定する必要があります。Auto Scaling グループは、新しい起動テンプレートまたは起動設定を使用して新しいインスタンスは新しいインスタンスを起動しますが、既存のインスタンスは影響を受けません。Auto Scaling グループ内の既存のインスタンスの場合、ModifyInstanceMetadataOptions API を使用して、既存のインスタンスで IMDSv2 の使用を要求するか、インスタンスを終了すると、Auto Scaling グループは、新しい起動テンプレートまたは起動設定で定義されているインスタンスメタデータオプション設定で新しい置き換えインスタンスを起動します。 - デフォルトで IMDSv2 を設定する AMI を使用する
-
ImdsSupport
パラメータにv2.0
を設定した AMI により、インスタンスを (HttpTokens
パラメータにrequired
を設定して) 起動する場合は、デフォルトで IMDSv2 を使用するように自動的に設定できます。register-image CLI コマンドを使用して AMI を登録するときにImdsSupport
パラメータをv2.0
に設定することも、modify-image-attribute CLI コマンドを使用して既存の AMI を変更することもできます。詳細については、「AMI を設定する」を参照してください。 - IAM ポリシーおよび SCP
-
以下に示すように、ユーザーの管理には、IAM ポリシーを使用することも、AWS Organizations サービスコントロールポリシー (SCP) を使用することもできます。
-
インスタンスが IMDSv2 を使用するように設定されていない限り、RunInstances API を使用してそのインスタンスを起動することはできません。
-
IMDSv1 を再度有効にするために、ModifyInstanceMetadataOptions API を使用して実行中のインスタンスを変更することはできません。
IAM ポリシーまたは SCP には、次の IAM 条件キーを含める必要があります。
-
ec2:MetadataHttpEndpoint
-
ec2:MetadataHttpPutResponseHopLimit
-
ec2:MetadataHttpTokens
条件キーが含まれているポリシーで指定した状態と、API および CLI 呼び出し時のパラメータが一致しない場合、これらの API または CLI の呼び出しは失敗し
UnauthorizedOperation
レスポンスが返されます。さらに、追加の保護レイヤーを選択して、IMDSv1からIMDSv2の変更を強制することもできます。EC2 ロールの認証情報経由でコールされた各 API に関するアクセス管理レイヤーでは、IAM ポリシーまたは AWS Organizations サービスコントロールポリシー (SCP) で新しい条件キーを使用できます。具体的には、IAM ポリシーで値
2.0
を設定した条件キーec2:RoleDelivery
を使用していると、IMDSv1 から取得した EC2 ロールの認証情報を使用した API コールに対して、UnauthorizedOperation
レスポンスが返されます。同じことは、SCP によって義務付けられる条件を使ってより広く達成できます。これにより、指定した条件と一致しない API コールに対してはUnauthorizedOperation
エラーが返されるため、実際に IMDSv1 から取得した認証情報を使用して API を呼び出すことはできなくなります。IAM ポリシーの例は、インスタンスメタデータの使用を参照してください。SCP の詳細については、「AWS Organizations ユーザーガイド」の「サービスコントロールポリシー (SCPs)」を参照してください。
-
IMDSv2 を必要とする推奨パス
上記のツールを使用する際、IMDSv2 への移行にこのパスに従うことを推奨します。
ステップ 1: 開始時
EC2 インスタンスのロール認証情報を使用する SDK、CLI、およびソフトウェアを、IMDSv2 対応のバージョンに更新します。CLI の更新に関する情報については、AWS Command Line Interface ユーザーガイドの「AWS CLI の最新バージョンへのアップグレード」を参照してください。
次に、IMDSv2 リクエストを使ってインスタンスメタデータに直接アクセスする (つまり、SDK を使用しない) ソフトウェアを変更します。IMDS パケットアナライザー
ステップ 2: 移行の進行状況を追跡する
CloudWatch の MetadataNoToken
メトリクスを使用して、移行の進行状況を追跡します。このメトリクスは、インスタンスの IMDS に対する IMDSv1 呼び出しの数を示します。詳細については、「インスタンスメトリクス」を参照してください。
ステップ 3: IMDSv1 をまったく使用していない場合
CloudWatch メトリクス MetadataNoToken
で記録される IMDSv1 の使用率がゼロであれば、そのインスタンスは IMDSv2 の使用に完全に移行するための準備が整っています。この段階で、次の操作を実行できます。
-
アカウントのデフォルト
IMDSv2 をアカウントのデフォルトとして必須に設定できます。インスタンスが起動すると、インスタンス設定は自動的にアカウントのデフォルトに設定されます。
アカウントのデフォルトを設定するには、次の手順を実行します。
-
Amazon EC2 コンソール: EC2 ダッシュボードの [アカウントの属性]、[データ保護とセキュリティ] で、[IMDS のデフォルト] に対して、[インスタンスメタデータサービス] を [有効] に設定し、[メタデータのバージョン] を [V2 のみ (トークンは必須)] に設定します。詳細については、「IMDSv2 をアカウントのデフォルトとして設定する」を参照してください。
-
AWS CLI: modify-instance-metadata-defaults CLI コマンドを使用して、
--http-tokens required
と--http-put-response-hop-limit
を指定します。2
-
-
新規のインスタンス
新しいインスタンスを起動する際には、以下のいずれかを実行できます。
-
Amazon EC2 コンソール: インスタンス起動ウィザードで、[Metadata accessible] (メタデータにアクセス可能) を [Enabled] (有効) に、[Metadata version] (メタデータバージョン) を [V2 only (token required)] (V2 のみ (トークンが必須)) に設定します。詳細については、「起動時にインスタンスを設定する」を参照してください。
-
AWS CLI: run-instances CLI コマンドを使用して、IMDSv2 が必須となるように指定します。
-
-
既存のインスタンス
既存のインスタンスには、次の操作を実行できます。
-
Amazon EC2 コンソール: [インスタンス] ページでインスタンスを選択し、[アクション]、[インスタンス設定]、[インスタンスメタデータオプションの変更] を選択し、[IMDSv2] の場合は [必須] を選択します。詳細については、「IMDSv2 の使用を要求する」を参照してください。
-
AWS CLI: IMDSv2 のみを使用するように指定するには、modify-instance-metadata-options CLI コマンドを使用します。
実行中のインスタンスで、インスタンスメタデータオプションを変更でき、インスタンスメタデータオプションを変更した後にインスタンスを再起動する必要はありません。
-
手順 4: すべてのインスタンスが IMDSv2 に移行されたかどうか確認する
IMDSv2 の使用を要求するようにまだ設定されていないインスタンスがないか、つまり、IMDSv2 がまだ optional
として設定されているかどうかを確認できます。まだインスタンスが optional
として設定されている場合は、前の手順 3 を繰り返し、インスタンスのメタデータオプションを変更して IMDSv2 required
を作成できます。
インスタンスをフィルターするには
-
Amazon EC2 コンソール: [インスタンス] ページで、[IMDSv2 = optional] フィルターを使用してインスタンスをフィルタリングします。のフィルタリングについての詳細は、「コンソールを使用したリソースのフィルタリング」を参照してください。また、各インスタンスで IMDSv2 が必須かオプションかを確認することもできます。[基本設定] ウィンドウで [IMDSv2] を切り替えて、[IMDSv2] 列を [インスタンス] テーブルに追加します。
-
AWS CLI: describe-instances CLI コマンドを使用して、次のように
metadata-options.http-tokens = optional
よってフィルタリングします。aws ec2 describe-instances --filters "Name=metadata-options.http-tokens,Values=optional" --query "Reservations[*].Instances[*].[InstanceId]" --output text
手順 5: すべてのインスタンスが IMDSv2 に移行された時点
IAM 条件キーの ec2:MetadataHttpTokens
、ec2:MetadataHttpPutResponseHopLimit
、および ec2:MetadataHttpEndpoint
により、RunInstances と ModifyInstanceMetadataOptions API、および対応する CLI の使用をコントロールできます。ポリシーを作成し、条件キーを使用してポリシーに指定した状態と API コールのパラメータが一致しない場合、API コールまたは CLI コールは失敗して UnauthorizedOperation
レスポンスが返されます。IAM ポリシーの例は、インスタンスメタデータの使用を参照してください。
さらに、IMDSv1 を無効にした後、MetadataNoTokenRejected
CloudWatch メトリクスを使用して、IMDSv1 呼び出しが試行および拒否された回数を追跡できます。IMDSv1 を無効にした後、正常に動作していないソフトウェアがあり、MetadataNoTokenRejected
メトリクスに IMDSv1 呼び出しが記録されている場合は、IMDSv2 を使用するようにこのソフトウェアを更新する必要がある可能性があります。