インスタンスメタデータサービスの設定 - Amazon Elastic Compute Cloud

インスタンスメタデータサービスの設定

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

  • インスタンスメタデータサービスバージョン 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という名前の変数に保管する

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

[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 Command Referencemodify-instance-metadata-optionsを参照してください。

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

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

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

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

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

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

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

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

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

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

  • AWS ソフトウェア:最新バージョンの AWS SDK および CLI サポートIMDSv2。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 グループで起動テンプレートを使用する必要があります。起動テンプレートを作成するときに、MetadataOptions パラメータを設定して、IMDSv2 の使用を要求します。起動設定を使用する Auto Scaling グループの場合、起動設定を起動テンプレートに置き換えます。起動設定を起動テンプレートに置き換えると、Auto Scaling グループは新しい起動テンプレートを使用して新しいインスタンスを起動しますが、既存のインスタンスには影響しません。既存のインスタンスで IMDSv2 の使用を要求するには、modify-instance-metadata-options CLI コマンド (または ModifyInstanceMetadataOptions API) を使用します。または、インスタンスを終了すると、Auto Scaling グループは、起動テンプレートで定義されたインスタンスメタデータオプション設定を使用して新しい代替インスタンスを起動します。

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

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

    さらに、追加の保護レイヤーを選択して、IMDSv1からIMDSv2の変更を強制することもできます。EC2 ロール資格情報経由で呼び出された API に関するアクセス管理レイヤーでは、IAMポリシーまたは AWS Organization サービスコントロールポリシー (SCP) で新しい条件キーを使用することができます。具体的には、IAM ポリシーで値 2.0 を設定してポリシー条件キー ec2:RoleDelivery を使用すると、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 を使用することを要求できます。実行中のインスタンスでこれらの変更を行うことができます。インスタンスを再起動する必要はありません。

  • 新しいインスタンスの場合: 新しいインスタンスを起動するときに、run-instances コマンドを使用して IMDSv2 のみを使用するよう指定できます。

インスタンスメタデータオプションの指定は、API または AWS CLI でのみ使用できます。現在、AWS マネジメントコンソール では使用できません。詳細については、「インスタンスメタデータオプションの設定」を参照してください。

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

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

インスタンスメタデータオプションの設定

インスタンスメタデータオプションを使用すると、新規または既存のインスタンスで次の操作を実行するように設定できます。

  • インスタンスメタデータをリクエストするときに IMDSv2 の使用を要求する

  • PUT レスポンスのホップ制限を指定する

  • インスタンスメタデータへのアクセスを無効にする

IAM ポリシーまたは SCP で IAM 条件キーを使用して、次の操作を行うこともできます。

  • IMDSv2 の使用を要求するようにインスタンスが設定されている場合にのみ、インスタンスの起動を許可する

  • ホップの許可数を制限する

  • インスタンスメタデータへのアクセスを無効にする

新規または既存インスタンスでインスタンスメタデータオプションを構成するには、 AWS SDK または CLI を使用します。詳細については、AWS CLI Command Referencerun-instancesおよびmodify-instance-metadata-optionsを参照してください。

注記

注意深く実行し、変更を行う前に慎重なテストを実施する必要があります。以下の情報を記録します。

  • IMDSv2の使用を強制する場合、インスタンスメタデータアクセスのためにIMDSv1を使用するアプリケーションまたはエージェントは休憩します。

  • インスタンスメタデータへのアクセスをすべてオフにする場合、インスタンスメタデータアクセスに依存して機能するアプリケーションまたはエージェントは休憩します。

新規インスタンスのインスタンスメタデータオプションの設定

インスタンスの起動時に、インスタンスで IMDSv2 を使用することを要求できます。また、新しいインスタンスで IMDSv2 の使用を要求しない限り、新しいインスタンスの起動をユーザーに禁止する IAM ポリシーを作成することもできます。

新しいインスタンスで IMDSv2 の使用を要求するには

次の run-instances の例では、metadata-optionsHttpTokens=required に設定して c3.large インスタンスを起動します。メタデータの取得リクエストではセキュリティで保護されたトークンヘッダーが required に設定されるため、インスタンスメタデータをリクエストするときに IMDSv2 の使用を要求するようにインスタンスが設定されます。

注記
  • HttpTokens の値を指定する場合は、HttpEndpointenabled に設定することも必要です。

  • この例では、--security-group パラメータ --count とパラメータは含まれていません。--count の場合、デフォルトは 1 です。デフォルトの VPC とデフォルトのセキュリティグループがある場合は、これらが使用されます。

aws ec2 run-instances \ --image-id ami-1a2b3c4d \ --instance-type c3.large \ --key-name MyKeyPair \ --metadata-options "HttpEndpoint=enabled,HttpTokens=required"

すべての新しいインスタンスでIMDSv2の使用を強制するには

IAM ユーザーがインスタンスメタデータをリクエストする際にIMDSv2の使用を義務付けるインスタンスみを起動できるようにするには、IMDSv2を必要とする条件が満たされないとインスタンスを起動できないように指定することができます。IAM ポリシーの例については、「インスタンスメタデータの使用」を参照してください。

既存インスタンスのインスタンスメタデータオプションの設定

既存インスタンスで IMDSv2 を使用することを要求できます。また、既存インスタンスで PUT レスポンスのホップ制限を変更したり、インスタンスメタデータへのアクセスを無効にしたりすることもできます。また、既存インスタンスでインスタンスメタデータオプションを変更することをユーザーに禁止する IAM ポリシーを作成することもできます。

既存インスタンスでIMDSv2の使用を義務付けるには

既存インスタンスに対して、インスタンスメタデータをリクエストする際に IMDSv2 の使用を義務付けるようオプトインすることができます。modify-instance-metadata-optionsCLI コマンドを使って、http-tokensパラメータをrequiredに設定できます。

注記

http-tokens の値を指定する場合は、http-endpointenabled に設定することも必要です。

aws ec2 modify-instance-metadata-options \ --instance-id i-1234567898abcdef0 \ --http-tokens required \ --http-endpoint enabled

既存インスタンスで PUT レスポンスホップリミットを変更するには

既存インスタンスについて、PUTリスポンスホップリミットの設定を変更することができます。modify-instance-metadata-optionsCLI コマンドを使って、http-put-response-hop-limitパラメータを必要なホップ数に設定できます。以下の例では、ホップリミットが3に設定されています。http-put-response-hop-limit の値を指定する場合は、http-endpointenabled に設定することも必要です。

aws ec2 modify-instance-metadata-options \ --instance-id i-1234567898abcdef0 \ --http-put-response-hop-limit 3 \ --http-endpoint enabled

既存インスタンスのインスタンスメタデータへのアクセスをオフにするには

既存インスタンスについて、使用中のインスタンスメタデータサービスのバージョンに関係なく、インスタンスメタデータサービスの HTTP エンドポイントを無効化することによりインスタンスメタデータへのアクセスをオフにすることができます。HTTP エンドポイントを有効化することにより、この変更はいつでも元に戻すことができます。modify-instance-metadata-optionsCLI コマンドを使って、http-endpointパラメータを disabledに設定できます。

aws ec2 modify-instance-metadata-options \ --instance-id i-1234567898abcdef0 \ --http-endpoint disabled

modify-instance-metadata-options の使用を制御するには

既存インスタンスでインスタンスメタデータオプションを変更できる IAM ユーザーを制御するには、指定したロールを持つユーザー以外のすべてのユーザーに ModifyInstanceMetadataOptions API の使用を禁止するポリシーを指定できます。IAM ポリシーの例については、「インスタンスメタデータの使用」を参照してください。