インスタンスメタデータサービスバージョン 2 の使用への移行 - Amazon Elastic Compute Cloud

インスタンスメタデータサービスバージョン 2 の使用への移行

インスタンスメタデータサービスバージョン 2 (IMDSv2) 呼び出しのみを許可するようにインスタンスを設定する場合は、次のツールと移行パスを使用することをお勧めします。

IMDSv2 に移行するためのツール

次のツールは、IMDSv1 から IMDSv2 へのソフトウェアの移行を特定、モニタリング、管理するのに役立ちます。これらのツールの使用方法については、「IMDSv2 を必要とする推奨パス」を参照してください。

AWS ソフトウェア

最新バージョンの AWS CLI および AWS SDK ではIMDSv2 をサポートしています。IMDSv2 を使用するには、EC2 インスタンスを更新して最新バージョンを使用してください。IMDSv2 をサポートする最低限の AWS SDK バージョンについては「サポートされる AWS SDK を使用する」を参照してください。

すべての Amazon Linux 2 と Amazon Linux 2023 ソフトウェアパッケージが IMDSv2 をサポートしています。Amazon Linux 2023 では、IMDSv1 はデフォルトで無効になっています。

IMDS パケットアナライザー

IMDS パケットアナライザーは、インスタンスの起動フェーズおよびランタイムオペレーション時の IMDSv1 呼び出しを特定してログに記録する、オープンソースツールです。これらのログを解析すると、お使いのインスタンスで IMDSv1 呼び出しを行うソフトウェアを正確に特定し、お使いのインスタンスでのみ IMDSv2 をサポートするために更新する必要があるものを特定できます。IMDS パケットアナライザーはコマンドラインから実行することも、サービスとしてインストールすることもできます。詳細についてはGitHubAWS ImdsPacketAnalyzer のページを参照してください

CloudWatch

CloudWatch では、インスタンスのモニタリング用に次の 2 つのメトリクスが用意されています。

MetadataNoToken – IMDSv2 はトークンベースのセッションを使用します。ただし、IMDSv1 はこれを使用しません。MetadataNoToken メトリクスは IMDSv1 を使用しているインスタンスメタデータサービス (IMDS) への呼び出しの数を追跡します。このメトリクスをゼロまでトラッキングすることにより、すべてのソフトウェアが IMDSv2 を使用するようアップグレードされたかどうか、およびいつアップデートが行われたかを測定できます。

MetadataNoTokenRejected – IMDSv1 を無効にした後、MetadataNoTokenRejected メトリクスを使用して、IMDSv1 呼び出しが試行および拒否された回数を追跡できます。このメトリクスを追跡することで、IMDSv2 を使用するようにソフトウェアを更新する必要があるかどうかを確認できます。

詳細については、「インスタンスメトリクス」を参照してください。

API の起動

新しいインスタンス: RunInstances API を使用して、IMDSv2 の使用を義務付ける新しいインスタンスを起動します。詳細については、「新規インスタンスのインスタンスメタデータオプションの設定」を参照してください。

既存のインスタンス: ModifyInstanceMetadataOptions API を使用して、既存のインスタンスで IMDSv2 の使用を要求します。詳細については、「既存インスタンスのインスタンスメタデータオプションの変更」を参照してください。

Amazon EC2 Auto Scaling グループによって起動された新しいインスタンス: Amazon EC2 Auto Scalingによって起動されたすべての新しいインスタンスで IMDSv2 の使用を義務付けるために、Amazon EC2 Auto Scaling グループは起動テンプレートまたは起動設定を使用できます。起動テンプレートの作成時や起動設定の作成時に、IMDSv2 の使用が必須となるように MetadataOptions パラメータを設定する必要があります。Amazon EC2 Auto Scaling グループは新しい起動テンプレートまたは起動設定を使用して新しいインスタンスを起動しますが、既存のインスタンスは影響を受けません。

Amazon EC2 Auto Scaling グループ内の既存のインスタンス: ModifyInstanceMetadataOptions API を使用して、既存のインスタンスで IMDSv2 の使用を要求するかインスタンスを終了すると、Amazon EC2 Auto Scaling グループは新しい起動テンプレートまたは起動設定で定義されているインスタンスメタデータオプション設定で、新しい置き換えインスタンスを起動します。

AMI

ImdsSupport パラメータを v2.0 に設定して構成された AMI は、デフォルトで IMDSv2 を必要とするインスタンスを起動します。Amazon Linux 2023 は ImdsSupport = v2.0 を使用して設定されます。

新しい AMI: 新しい AMI を作成するときは、register-image CLI コマンドを使用して ImdsSupport パラメータを v2.0 に設定してください。

既存の AMI: 既存の AMI を変更するときは、modify-image-attribute CLI コマンドを使用して ImdsSupport パラメータを v2.0 に設定してください。

詳細については、「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)」を参照してください。

宣言型ポリシー

宣言型ポリシー (AWS Organizations の機能) を使用して、IMDSv2 を組織全体のデフォルトの IMDS バージョンとして一元的に設定して適用します。ポリシーの例については、「AWS Organizations ユーザーガイド」で「サポートされている宣言型ポリシー」セクションの「インスタンスメタデータのデフォルト」タブを参照してください。

ステップ 1: IMDSv2=optional を使用するインスタンスを特定し、IMDSv1 の使用状況を監査する

IMDSv2 移行の範囲を評価するには、IMDSv1 または IMDSv2 のいずれかを許可するように設定されたインスタンスを特定し、IMDSv1 呼び出しを監査します。

  1. IMDSv1 または IMDSv2 のいずれかを許可するように設定されたインスタンスを特定する:

    Amazon EC2 console
    1. Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。

    2. ナビゲーションペインで、[インスタンス] を選択してください。

    3. IMDSv1 または IMDSv2 を許可するように設定されたインスタンスのみを表示するには、フィルター「IMDSv2 = optional」を追加します。

    4. または、IMDSv2 がすべてのインスタンスでオプション必須かを確認するには、[設定] ウィンドウ (歯車アイコン) を開き、[IMDSv2] をオンにして [確認] を選択します。これにより IMDSv2 列がインスタンステーブルに追加されます。

    AWS CLI

    describe-instances コマンドを使用して、次のように metadata-options.http-tokens = optional でフィルタリングします。

    aws ec2 describe-instances --filters "Name=metadata-options.http-tokens,Values=optional" --query "Reservations[*].Instances[*].[InstanceId]" --output text
  2. 各インスタンスで IMDSv1 呼び出しを監査する:

    CloudWatch メトリクス MetadataNoToken を使用します。このメトリクスはインスタンスの IMDS に対する IMDSv1 呼び出しの数を示します。詳細については、「インスタンスのメトリクス」を参照してください。

  3. IMDSv1 呼び出しを行うインスタンス上のソフトウェアを特定する:

    オープンソースの IMDS パケットアナライザーを使用して、インスタンスの起動フェーズおよびランタイムオペレーション中に IMDSv1 呼び出しを特定し、ログに記録します。この情報を使用して、更新するソフトウェアを特定し、インスタンスが IMDSv2 のみを使用する準備を行います。IMDS パケットアナライザーはコマンドラインから実行することも、サービスとしてインストールすることもできます。

ステップ 2: ソフトウェアを IMDSv2 に更新する

インスタンスでロール認証情報を使用するすべてのSDK、CLI、ソフトウェアを IMDSv2 対応バージョンに更新します。詳細については AWS Command Line Interface ユーザーガイド」の「AWS CLI の最新バージョンをインストールまたは更新」を参照してください

ステップ 3: インスタンスで IMDSv2 を要求する

MetadataNoToken メトリクスを通じて IMDSv1 呼び出しがゼロになったことを確認したら、IMDSv2 を要求するように既存のインスタンスを設定します。また、IMDSv2 を要求するようにすべての新しいインスタンスを設定します。つまり、すべての既存のインスタンスと新しいインスタンスで IMDSv1 を無効にします。

  1. IMDSv2 を要求するように既存のインスタンスを設定する:

    Amazon EC2 console
    1. Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。

    2. ナビゲーションペインで、[Instances] (インスタンス) を選択してください。

    3. インスタンスを選択してください。

    4. [アクション][インスタンスの設定][インスタンスメタデータのオプションを変更] の順に選択してください。

    5. [IMDSv2] の場合は[必須] を選択してください。

    6. [保存] を選択します。

    AWS CLI

    IMDSv2 のみを使用するように指定するには、modify-instance-metadata-options CLI コマンドを使用します。

    注記

    この設定は、実行中のインスタンスで変更できます。変更は、インスタンスを再起動しなくてもすぐに有効になります。

    詳細については、「IMDSv2 の使用を要求する」を参照してください。

  2. IMDSv1 を無効にした後の問題を監視する:

    1. MetadataNoTokenRejected CloudWatch メトリクスを使用して、IMDSv1 呼び出しが試行および拒否された回数を追跡できます。

    2. ソフトウェアの問題が発生しているインスタンスで MetadataNoTokenRejected メトリクスが IMDSv1 呼び出しを記録する場合、これは IMDSv2 を使用するためにソフトウェアを更新する必要があることを示します。

  3. IMDSv2 を要求するように新しいインスタンスを設定する:

    Amazon EC2 console
    1. Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。

    2. インスタンスを起動するには、次のステップに沿って操作します。

    3. [高度な詳細] を展開し、[メタデータバージョン][V2 のみ (トークンが必要)] を選択します。

    4. [Summary] (概要) パネルでインスタンスの設定を確認し、[Launch instance] (インスタンスを起動) を選択してください。

      詳細については、「起動時にインスタンスを設定する」を参照してください。

    AWS CLI

    AWS CLI: run-instances CLI コマンドを使用して、IMDSv2 が必須となるように指定します。

ステップ 4: IMDSv2=required をデフォルトとして設定する

IMDSv2=required は、アカウントレベルまたは組織レベルのいずれかでデフォルト設定として設定できます。これにより、新しく起動されたすべてのインスタンスが IMDSv2 を要求するように自動的に設定されます。

  1. アカウントレベルのデフォルトを設定する:

    Amazon EC2 console
    1. Amazon EC2 コンソールの https://console.aws.amazon.com/ec2/ を開いてください。

    2. EC2 ダッシュボードの [アカウントの属性][データ保護とセキュリティ] を選択します。

    3. [IMDS のデフォルト] で [管理] を選択します。

    4. [インスタンスメタデータサービス] で、[有効にする] を選択します。

    5. [メタデータバージョン] で、[V2 のみ (トークンが必要)] を選択します。

    6. [更新] を選択します。

    AWS CLI

    modify-instance-metadata-defaults CLI コマンドを使用して、--http-tokens required--http-put-response-hop-limit 2 を指定します。

    詳細については、「IMDSv2 をアカウントのデフォルトとして設定する」を参照してください。

  2. または、宣言型ポリシーを使用して組織レベルのデフォルトを設定します。

    宣言型ポリシーを使用して、IMDSv2 の組織のデフォルトを必須に設定します。ポリシーの例については、「AWS Organizations ユーザーガイド」で「サポートされている宣言型ポリシー」セクションの「インスタンスメタデータのデフォルト」タブを参照してください。

ステップ 5: インスタンスに IMDSv2 を要求するように強制する

IMDSv2 の使用を適用するには、次の IAM または SCP 条件キーを使用します。

  • ec2:MetadataHttpTokens

  • ec2:MetadataHttpPutResponseHopLimit

  • ec2:MetadataHttpEndpoint

これらの条件キーは RunInstances API と ModifyInstanceMetadataOptions API、および対応する CLI の使用を制御します。ポリシーを作成し、条件キーを使用してポリシーに指定した状態と API コールのパラメータが一致しない場合、API コールまたは CLI コールは失敗して UnauthorizedOperation レスポンスが返されます。

IAM ポリシーの例はインスタンスメタデータの使用を参照してください。