IMDSv2 の使用 - Amazon Elastic Compute Cloud

IMDSv2 の使用

次のいずれかのメソッドを使って、実行中のインスタンスからインスタンスメタデータにアクセスできます。

  • インスタンスメタデータサービスバージョン 1 (IMDSv1) – リクエスト/レスポンスメソッド

  • インスタンスメタデータサービスバージョン 2 (IMDSv2) – セッション志向メソッド

デフォルトでは、IMDSv1またはIMDSv2のいずれか、あるいは両方を使用できます。インスタンスメタデータサービスは(所定のリクエストについて)、IMDSv2 に固有の PUT または GET ヘッダーがリクエストに存在するかどうかを基準にして、IMDSv1 と IMDSv2 へのリクエストを識別しています。

各インスタンスのインスタンスメタデータサービスを、ローカルコードまたはユーザーが IMDSv2を使用しなければいけないように構成できます。IMDSv2を使用しなければならないように指定すると、IMDSv1はもう機能しなくなります。詳細については、「インスタンスメタデータオプションの設定」を参照してください。

インスタンスメタデータを取得するには、「インスタンスメタデータの取得」を参照してください。

インスタンスメタデータサービスバージョン 2 の仕組み

IMDSv2は、セッション志向リクエストを使用します。セッション志向リクエストを使用して、セッション期間 (1 秒~6 時間) を定義するセッショントークンを作成します。指定した期間中、それ以降のリクエストに同じセッショントークンを使用できます。指定した期間が期限切れになった後、将来のリクエストに使用する新しいセッショントークンを作成する必要があります。

次の例では、LinuxシェルスクリプトとIMDSv2を使って、最上位インスタンスメタデータアイテムを取得しています。例:

  • PUTリクエストを使って、6 時間 (21,600 秒) のセッショントークンを作成する

  • セッショントークンヘッダーをTOKENという名前の変数に保管する

  • トークンを使って最上位メタデータアイテムをリクエストする

2 つの個別のコマンドを実行することも、それらを組み合わせることもできます。

個別のコマンド

最初に、次のコマンドを使用してトークンを生成します。

[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"`

その後、次のコマンドを使用して、トークンを使用して上位レベルのメタデータアイテムを生成します。

[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

組み合わされたコマンド

トークンを保存し、コマンドを組み合わせることができます。次の例では、上記の 2 つのコマンドを組み合わせて、セッショントークンヘッダーを TOKEN という名前の変数に格納します。

注記

トークンの作成時にエラーが発生した場合は、有効なトークンの代わりにエラーメッセージが変数に格納され、コマンドは機能しません。

[ec2-user ~]$ TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 21600"` \ && curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/

トークンを作成した後、期限切れになるまで再使用することができます。次のコマンド例では、インスタンスの起動に AMI の ID が使用されていますが、前の例で $TOKENに保管されたトークンが再使用されています。

[ec2-user ~]$ curl -H "X-aws-ec2-metadata-token: $TOKEN" -v http://169.254.169.254/latest/meta-data/ami-id

IMDSv2を使ってインスタンスメタデータをリクエストする際は、リクエストに次の項目が含まれている必要があります。

  1. PUTリクエストを使って、インスタンスメタデータサービスに対してセッションを開始します。PUT リクエストは、インスタンスメタデータサービスに対するそれ以降のGETリクエストに含まれるべきトークンを返します。このトークンは、IMDSv2を使ってメタデータにアクセスするのに必要です。

  2. トークンを、インスタンスメタデータサービスに対するすべてのGETリクエストに含めます。トークン使用がrequiredに設定されている場合、有効なトークンがないリクエスト、または有効期限切れのトークンを持つリクエストは401 - UnauthorizedHTTP エラーコードを受け取ります。トークン使用要件の変更に関する情報については、AWS CLI コマンドリファレンスの「modify-instance-metadata-options」を参照してください。

    • トークンはインスタンス固有のキーです。トークンは他の EC2 インスタンスで有効ではなく、生成されたインスタンスの外で使用しようとすると拒否されます。

    • PUTリクエストには、トークンの有効期限 (TTL) を最大 6 時間 (21,600 秒) まで秒単位で指定するヘッダーが含まれている必要があります。トークンは論理的セッションを表します。TTL は、トークンが有効な時間の長さ、つまりセッションの期間を指定します。

    • トークンの期限が切れた後、インスタンスメタデータにアクセスし続けるためには、別の PUTを使って新しいセッションを作成する必要があります。

    • 各リクエストについてトークンを再使用するか、あるいは新しいトークンを作成することを選択できます。少数のリクエストでは、インスタンスメタデータサービスにアクセスする必要があるたびに、トークンを生成してすぐに使用するほうが簡単かもしれません。ただし、効率を重視するなら、インスタンスメタデータをリクエストする必要があるたびにPUTリクエストを書くより、トークン期間を長く指定して再使用することができます。それぞれが独自のセッションを表すトークンを同時に使用できる数については、実際的に制限がありません。ただし、IMDSv2 では、通常のインスタンスメタデータサービス接続とスロットリングの制限によって制約を受けます。詳細については、「クエリスロットル」を参照してください。

HTTP GETおよびHEADメソッドはIMDSv2インスタンスメタデータリクエストで許可されています。 PUT リクエストは、X-Forwarded-For ヘッダーが含まれている場合、拒否されます。

デフォルトで、PUTリクエストに対するレスポンスには IP プロトコルレベルで1のレスポンスホップリミット (有効期限) があります。ホップリミットを拡大するには、modify-instance-metadata-optionsコマンドを使ってホップリミットを調整できます。たとえば、インスタンスで実行されているコンテナサービスとの下位互換性のためにホップリミットを拡大する必要があるかもしれません。詳細については、AWS CLI コマンドリファレンスの「modify-instance-metadata-options」を参照してください。

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

インスタンスメタデータサービスバージョン 2 (IMDSv2) の使用は任意です。インスタンスメタデータサービスバージョン 1 (IMDSv1) は、終了の期限なく引き続きサポートされます。IMDSv2の使用に移行することを選択した場合、次のツールと移行パスを使用することが推奨されます。

IMDSv2への移行に役立つツール

お使いのソフトウェアでIMDSv1が使用されている場合、次のツールを使ってIMDSv2を使用するようソフトウェアを再構成することができます。

  • AWS ソフトウェア: IMDSv2 をサポートする最新バージョンの AWS SDK および CLI。IMDSv2 を使用するには、EC2 インスタンスの AWS SDK および CLI のバージョンが最新であることを確認する必要があります。CLI の更新の詳細については、 AWS Command Line Interface ユーザーガイドの、「AWS CLI のインストール、更新、およびアンインストール」を参照してください。

  • CloudWatch: IMDSv2 はトークンベースのセッションを使用しますが、IMDSv1 は使用しません。MetadataNoToken CloudWatch メトリクスは、IMDSv1 を使用しているインスタンスメタデータサービスへの呼び出しの数を追跡します。このメトリクスをゼロまでトラッキングすることにより、すべてのソフトウェアがIMDSv2を使用するようアップグレードされたかどうか、そしてそのタイミングを判断できます。詳細については、「インスタンスメトリクス」を参照してください。

  • EC2 API および CLI へ更新する: 既存のインスタンスについては、modify-instance-metadata-optionsCLI コマンド (またはModifyInstanceMetadataOptionsAPI) を使用して、IMDSv2の使用を義務付けることができます。新しいインスタンスについては、run-instancesCLI コマンド (またはRunInstancesAPI) およびmetadata-optionsパラメータを使用して、IMDSv2の使用を義務付ける新しいインスタンスを起動できます。

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

    既存のインスタンスで IMDSv2 の使用を要求するには、modify-instance-metadata-options CLI コマンド (または ModifyInstanceMetadataOptions API) を使用します。または、インスタンスを削除すると、Auto Scaling グループは、起動テンプレートまたは起動設定で定義されたインスタンスメタデータオプション設定を使用して新しい代替インスタンスを起動します。

  • IAM ポリシーおよび SCP: IAM 条件を使用することで、IAM ユーザーが IMDSv2 を使用しない限り、インスタンスを起動できないよう強制できます。また IAM 条件を使って、IAM ユーザーが実行中のインスタンスを変更してIMDSv1を最有効化できないように強制し、さらにインスタンスメタデータサービスがインスタンス上で使用できるよう強制することもできます。

    IAM 条件キーの ec2:MetadataHttpTokensec2:MetadataHttpPutResponseHopLimit、そして ec2:MetadataHttpEndpoint を使用して、RunInstances API と ModifyInstanceMetadataOptions API、および対応する CLI の使用を制御できます。ポリシーを作成し、条件キーを使用してポリシーに指定した状態と API コールのパラメータが一致しない場合、API コールまたは CLI コールは失敗して UnauthorizedOperation レスポンスが返されます。これらの条件キーは、IAM ポリシーまたは AWS Organizations サービスコントロールポリシー (SCP) のいずれかで使用できます。

    さらに、追加の保護レイヤーを選択して、IMDSv1からIMDSv2の変更を強制することもできます。EC2 ロールの認証情報経由で呼び出された各 API に関するアクセス管理レイヤーでは、IAM ポリシーまたは AWS Organizations サービスコントロールポリシー (SCP) で新しい条件キーを使用することができます。具体的には、IAM ポリシーで値 ec2:RoleDelivery を設定してポリシー条件キー 2.0 を使用すると、IMDSv1 から取得した EC2 ロールの認証情報を使用した API コールに対しては、UnauthorizedOperation レスポンスが返されます。同じことは、SCP によって義務付けられる条件を使ってより広く達成できます。これにより、指定した条件と一致しない API コールに対しては UnauthorizedOperation エラーが返されるため、実際に IMDSv1 から取得した認証情報を使用して API を呼び出すことはできなくなります。IAM ポリシーの例は、「インスタンスメタデータの使用」を参照してください。詳細については、AWS Organizations ユーザーガイドサービスコントロールポリシーをご参照ください。

IMDSv2アクセスを必要とする推奨パス

上記のツールを使用する際、IMDSv2への移行にこのパスに従うことを推奨します。

ステップ 1: 開始時

SDK、CLI、および EC2 インスタンスでロール資格情報を使用するソフトウェアを、IMDSv2対応バージョンに更新します。CLI の更新に関する情報については、AWS Command Line Interface ユーザーガイドの「AWS CLI の最新バージョンへのアップグレード」を参照してください。

次に、IMDSv2 リクエストを使ってインスタンスメタデータに直接アクセスする (つまり、SDK を使用しない) ソフトウェアを変更します。

ステップ 2: 移行中

CloudWatch の MetadataNoToken メトリクスを使用して、移行の進行状況を追跡します。このメトリクスは、インスタンスで IMDSv1 を使用しているインスタンスメタデータサービスへの呼び出しの数を示します。詳細については、「インスタンスメトリクス」を参照してください。

ステップ 3: すべてのインスタンスですべての準備が完了した時点

CloudWatch メトリクス MetadataNoToken が IMDSv1 の使用量にゼロを記録した時点で、すべてのインスタンスにおいてすべての準備が完了します。この段階で、次の操作を実行できます。

  • 既存のインスタンスの場合: modify-instance-metadata-options コマンドを通じて IMDSv2 を使用することを要求できます。実行中のインスタンスでこれらの変更を行うことができます。インスタンスを再起動する必要はありません。

  • 新しいインスタンスの場合: 新しいインスタンスを起動するときに、次のいずれかの操作を実行できます。

    • Amazon EC2 コンソール起動インスタンスウィザードで、[Metadata accessible (メタデータにアクセス可能)] を [Enabled (有効)] に、[Metadata version (メタデータバージョン)] を [V2] に設定します。詳細については、「ステップ 3: インスタンスの詳細を設定する」を参照してください。

    • IMDSv2 のみを使用するように指定するには、run-instances コマンドを使用します。

既存のインスタンスのインスタンスメタデータオプションの更新は、API または AWS CLI を介してのみ使用できます。現在のところ、Amazon EC2 コンソールでは使用できません。詳細については、「インスタンスメタデータオプションの設定」を参照してください。

ステップ 4: すべてのインスタンスが IMDSv2 に移行された時点

IAM 条件キーの ec2:MetadataHttpTokensec2:MetadataHttpPutResponseHopLimit、そして ec2:MetadataHttpEndpoint を使用して、RunInstances API と ModifyInstanceMetadataOptions API、および対応する CLI の使用を制御できます。ポリシーを作成し、条件キーを使用してポリシーに指定した状態と API コールのパラメータが一致しない場合、API コールまたは CLI コールは失敗して UnauthorizedOperation レスポンスが返されます。IAM ポリシーの例は、「インスタンスメタデータの使用」を参照してください。