IMDSv2 の使用
次のいずれかのメソッドを使って、実行中のインスタンスからインスタンスメタデータにアクセスできます。
-
インスタンスメタデータサービスバージョン 1 (IMDSv1) – リクエスト/レスポンスメソッド
-
インスタンスメタデータサービスバージョン 2 (IMDSv2) – セッション志向メソッド
デフォルトでは、IMDSv1またはIMDSv2のいずれか、あるいは両方を使用できます。インスタンスメタデータサービスは、所定のリクエストについて、IMDSv2 に固有の PUT
または GET
ヘッダーがそのリクエストに存在するかどうかによって、IMDSv1 と IMDSv2 リクエストを区別します。詳細については、「EC2 Instance Metadata Service の拡張により、オープンファイアウォール、リバースプロキシ、および SSRF の脆弱性に対して多層防御を追加
ローカルコードまたはユーザーに IMDSv2を使用させるように、各インスタンスのインスタンスメタデータサービスを構成することができます。IMDSv2を使用しなければならないように指定すると、IMDSv1はもう機能しなくなります。詳細については、インスタンスメタデータオプションの設定 を参照してください。
インスタンスメタデータを取得するには、「インスタンスメタデータの取得」を参照してください。
このセクションの例では、インスタンスメタデータサービスの IPv4 アドレスを使用します。169.254.169.254
。IPv6 アドレスを使用して EC2 インスタンスのインスタンスメタデータを取得する場合は、IPv6 アドレスを有効にして使用してください。fd00:ec2::254
。インスタンスメタデータサービスの IPv6 アドレスは、IMDSv2 コマンドと互換性があります。IPv6 アドレスは、Nitro System 上に構築されたインスタンス上でのみアクセスできます。
インスタンスメタデータサービスバージョン 2 の仕組み
IMDSv2は、セッション指向リクエストを使用します。セッション指向リクエストを使用して、セッション期間 (1 秒~6 時間) を定義するセッショントークンを作成します。指定した期間中、それ以降のリクエストに同じセッショントークンを使用できます。指定した期間が期限切れになった後、将来のリクエストに使用する新しいセッショントークンを作成する必要があります。
次の例では、PowerShellシェルスクリプトとIMDSv2を使って、最上位インスタンスメタデータアイテムを取得しています。例:
-
PUT
リクエストを使って、6 時間 (21,600 秒) のセッショントークンを作成する -
セッショントークンヘッダーを
token
という名前の変数に保管する -
トークンを使って最上位メタデータアイテムをリクエストする
PS C:\>
[string]$token = Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://169.254.169.254/latest/api/token
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} -Method GET -Uri http://169.254.169.254/latest/meta-data/
トークンを作成した後、期限切れになるまで再使用することができます。次のコマンド例では、インスタンスの起動に AMI の ID が使用されていますが、前の例で $token
に保管されたトークンが再使用されています。
PS C:\>
Invoke-RestMethod -Headers @{"X-aws-ec2-metadata-token" = $token} ` -Method GET -uri http://169.254.169.254/latest/meta-data/ami-id
IMDSv2を使ってインスタンスメタデータをリクエストする際は、リクエストに次の項目が含まれている必要があります。
-
PUT
リクエストを使って、インスタンスメタデータサービスに対してセッションを開始します。PUT
リクエストは、インスタンスメタデータサービスに対するそれ以降のGET
リクエストに含まれるべきトークンを返します。このトークンは、IMDSv2を使ってメタデータにアクセスするのに必要です。 -
トークンを、インスタンスメタデータサービスに対するすべての
GET
リクエストに含めます。トークン使用がrequired
に設定されている場合、有効なトークンがないリクエスト、または有効期限切れのトークンを持つリクエストは401 - Unauthorized
HTTP エラーコードを受け取ります。トークン使用要件の変更に関する情報については、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 ソフトウェア
-
最新バージョンの AWS CLI および AWS SDK では、IMDSv2 をサポートしています。IMDSv2 を使用するには、EC2 インスタンスで、最新バージョンの CLI および SDK を使用している必要があります。CLI の更新の詳細については、 AWS Command Line Interface ユーザーガイドの、「AWS CLI のインストール、更新、およびアンインストール」を参照してください。
すべての Amazon Linux 2 ソフトウェアパッケージが IMDSv2 をサポートしています。
- CloudWatch
-
IMDSv2 では、IMDSv1 がサポートしていない、トークンベースのセッションが利用できます。
MetadataNoToken
CloudWatch メトリクスは、IMDSv1 を使用しているインスタンスメタデータサービスへの呼び出しの数を追跡します。このメトリクスをゼロまでトラッキングすることにより、すべてのソフトウェアがIMDSv2を使用するようアップグレードされたかどうか、そしてそのタイミングを判断できます。詳細については、「インスタンスメトリクス」を参照してください。 - EC2 API および CLI への更新
-
既存のインスタンスについては、modify-instance-metadata-options CLI コマンド (または ModifyInstanceMetadataOptions API) を使用して、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 グループは、起動テンプレートまたは起動設定で定義されたインスタンスメタデータオプション設定を使用して新しい代替インスタンスを起動します。
- デフォルトで IMDSv2 を設定する AMI を使用する
-
ImdsSupport
パラメータにv2.0
を設定した AMI により、インスタンスを (HttpTokens
パラメータにrequired
を設定して) 起動する場合は、デフォルトで IMDSv2 を使用するように自動的に設定できます。register-image CLI コマンドを使用して AMI を登録する際に、ImdsSupport
パラメータにv2.0
を設定します。詳細については、「AMI を設定する」を参照してください。 - IAM ポリシーおよび SCP
-
以下に示すように、IAM ユーザーの管理には、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 を使用しない) ソフトウェアを変更します。
ステップ 2: 移行の進行状況を追跡する
CloudWatch の MetadataNoToken
メトリクスを使用して、移行の進行状況を追跡します。このメトリクスは、インスタンスで IMDSv1 を使用しているインスタンスメタデータサービスへの呼び出しの数を示します。詳細については、「インスタンスメトリクス」を参照してください。
ステップ 3: IMDSv1 をまったく使用していない場合
CloudWatch メトリクス MetadataNoToken
で記録される IMDSv1 の使用率がゼロであれば、そのインスタンスは IMDSv2 の使用に完全に移行するための準備が整っています。この段階で、次の操作を実行できます。
-
新規のインスタンス
新しいインスタンスを起動する際には、以下のいずれかを実行できます。
-
Amazon EC2 コンソール: インスタンス起動ウィザードで、[Metadata accessible] (メタデータにアクセス可能) を [Enabled] (有効) に、[Metadata version] (メタデータバージョン) を [V2 only (token required)] (V2 のみ (トークンが必須)) に設定します。詳細については、「起動時にインスタンスを設定する」を参照してください。
-
AWS CLI: IMDSv2 のみを使用するように指定するには、run-instances CLI コマンドを使用します。
-
-
既存のインスタンス
modify-instance-metadata-options CLI コマンドを通じて、IMDSv2 の使用を要求できます。これらの変更は、インスタンスを再起動することなく、実行中のインスタンスに対し行えます。
既存のインスタンスのインスタンスメタデータオプションの更新は、API または AWS CLI を介してのみ使用できます。現在のところ、Amazon EC2 コンソールでは使用できません。詳細については、インスタンスメタデータオプションの設定 を参照してください。
ステップ 4: すべてのインスタンスが IMDSv2 に移行された時点
IAM 条件キーの ec2:MetadataHttpTokens
、ec2:MetadataHttpPutResponseHopLimit
、および ec2:MetadataHttpEndpoint
により、RunInstances と ModifyInstanceMetadataOptions API、および対応する CLI の使用を制御できます。ポリシーを作成し、条件キーを使用してポリシーに指定した状態と API コールのパラメータが一致しない場合、API コールまたは CLI コールは失敗して UnauthorizedOperation
レスポンスが返されます。IAM ポリシーの例は、「インスタンスメタデータの使用」を参照してください。