SSRF脆弱性等への攻撃リスクを緩和するIMDSv2が、クイックスタートで起動するEC2のデフォルトとなりました

GUIのクイックスタートで作成したEC2インスタンス、Amazon Linux 2023以外のAMIでも、 デフォルトでサポートするインスタンスメタデータサービスのバージョンがV2(IMDSv2)のみとなり、セキュアな利用が可能になりました。
2023.11.08

2023年11月6日、 AWSマネージドコンソールで クイックスタートを利用して新規作成した EC2インスタンスで、 サポートするメタデータのデフォルトバージョンが 「V2」(IMDSv2) となるアップデートがありました。

その動作について確認する機会がありましたので、紹介させていただきます。

マネージドコンソール

クイックスタート

クイックスタート画面で選択できるAMIを選択

Ec2-imds-v2-01

「高度な詳細」で確認できる「メタデータのバージョン」、デフォルトで「V2 のみ (トークンは必須)」 になりました。

Ec2-imds-v2-02

メターデータのサポートバージョン、デフォルトから 「V1 及び V2 (トークンはオプション)」に変更する事で、従来通りの利用を継続する事は可能です。

Ec2-imds-v2-03

クイックスタート以外

マネージドコンソール、AMIの検索から EC2インスタンスの起動を試しました。

Amazon Linux 2

Quikck Start では、IMDSv2 デフォルトとなる、 Amazon Linux 2 のAMI ID を指定しました。

Ec2-imds-v2-04

  • Amazon マシンイメージ (AMI)
    • amzn2-ami-graphics-hvm-2.0.20231012.1-x86_64-gp2
    • ami-0c59c4a76b3211b50

「高度な詳細」の「メタデータのバージョン」は従来通り、未選択の状態でした。

Ec2-imds-v2-05

起動したEC2インスタンス、インスタンスメタデータオプションは、IMDSv2は Optional。 IMDSv1 が有効な状態で起動しました。

Ec2-imds-v2-07

Amazon Linux 2023

Amazon Linux 2023 の AMI ID を検索で指定しました。

Ec2-imds-v2-08

  • Amazon マシンイメージ (AMI)
    • al2023-ami-2023.2.20231030.1-kernel-6.1-x86_64
    • ami-098940df4d3292e9a

メタデータのバージョンは「V2のみ」がデフォルトで選択されていました。

Ec2-imds-v2-09

Amazon Linux 2023 は、2023年3月時点で IMDSv2 のみがデフォルトで有効となる仕様でリリース済みであるため、今回のアップデート影響は受けない状態でした。

IMDSv2

デフォルトでIMDSv2のみ使用するようになっています。 Amazon Linux 2023がGAされました

CLI

メターデータの設定は明示せず、AWSCLIを利用して EC2インスタンスを作成。 起動したインスタンスのメタデータオプションを確認しました。

$ aws --version
aws-cli/2.13.31 Python/3.11.6 Linux/4.14.255-322-265.538.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off

Amazon Linux 2

  • 起動
aws ec2 run-instances --instance-type t3.nano --image-id ami-0c59c4a76b3211b50
  • メタデータ確認
$ aws ec2 describe-instances --instance-ids "i-******" | jq .Reservations[].Instances[].MetadataOptions
{
  "State": "applied",
  "HttpTokens": "optional",
  "HttpPutResponseHopLimit": 1,
  "HttpEndpoint": "enabled",
  "HttpProtocolIpv6": "disabled",
  "InstanceMetadataTags": "disabled"
}

「HttpTokens」は「optional」、IMDSv1 が利用可能な状態でした。

Amazon Linux 2023

  • 起動
aws ec2 run-instances --instance-type t3.nano --image-id ami-098940df4d3292e9a
  • メタデータ確認
$ aws ec2 describe-instances --instance-ids "i-******" | jq .Reservations[].Instances[].MetadataOptions
{
  "State": "applied",
  "HttpTokens": "required",
  "HttpPutResponseHopLimit": 2,
  "HttpEndpoint": "enabled",
  "HttpProtocolIpv6": "disabled",
  "InstanceMetadataTags": "disabled"
}

「HttpTokens」は「required」、IMDSv1の利用は制限されていました。

EC2 AutoScall起動

起動テンプレートで、メタデータのバージョン指定を実施していないオートスケール環境(AMIはAmazon Linux2)への影響を確認しました。

  • 起動テンプレート

Ec2-imds-v2-10

  • EC2 インスタンス概要

Ec2-imds-v2-11

IMDSv2は「Optional」、IMDSv1 が利用可能な状態でした。

まとめ

IMDSv2がデフォルトで強制される今回のアップデート、2023年11月時点ではマネージドコンソールのクイックスタートで作成したEC2インスタンスが対象である事が確認できました。

クイックスタートで新規作成したEC2インスタンスで、IMDSv1のみサポートの古いSDKやをミドルウェアなどを利用する必要がある場合、今後はメタデータのサポートバージョンの明示が必要となる点にご留意ください。

AWSブログによると、 2024年以降、IMDSv1の利用制限を実現する新しいAPIの提供や、より広範囲な IMDSv2 デフォルト強制が予定されています。

February 2024 – We plan to introduce a new API function that will allow you to control the use of IMDSv1 as the default at the account level. You can already control IMDSv1 usage in an IAM policy (taking away and limiting existing permission), or as an SCP that is applied globally across an account, an organizational unit (OU), or an entire organization. For example IAM policies read Work with instance metadata.

Mid-2024 – Newly released Amazon EC2 instance types will use IMDSv2 only by default. For transition support, you will still be able to enable/turn on IMDSv1 at launch or after launch on an instance live without the need for a restart or stop/start.

Amazon EC2 Instance Metadata Service IMDSv2 by default

脆弱性や設定不備を狙ったSSRF攻撃対策として、IMDSv2への切り替えは一定の効果が期待できる施策です。

IMDSv1のみをサポートする 古いSDK、ミドルウェアを利用している場合には、IMDSv2をサポートするバージョンへの計画なアップデートの実施。 アップデートが難しい場合には、IMDSv1のメタデータ利用を継続するリスクについて評価、適切な緩和策を手配した上で、EC2インスタンスの起動時にIMDSv1の利用を明示する準備に取り掛かることをおすすめします。

また、UserData などで EC2上で実行するスクリプトが存在する場合、まず点検を実施頂き、 メタデータを参照するスクリプトが利用されている場合には、IMDSv2に対応したスクリプトの更新をお試しください。

  • IMDSv1版
curl -s http://169.254.169.254/latest/meta-data/placement/availability-zone
  • IMDSv2対応版
TOKEN=`curl -X PUT "http://169.254.169.254/latest/api/token" -H "X-aws-ec2-metadata-token-ttl-seconds: 300"`
curl -H "X-aws-ec2-metadata-token: $TOKEN" -s http://169.254.169.254/latest/meta-data/placement/availability-zone