EC2インスタンスメタデータサービスでIMDSv1が利用されている場合の修正手順

このブログシリーズ 「クラウドセキュリティ 実践集」 では、一般的なセキュリティ課題を取り上げ、「なぜ危険なのか?」 というリスクの解説から、「どうやって直すのか?」 という具体的な修復手順(コンソール、AWS CLI、Terraformなど)まで、分かりやすく解説します。
この記事では、Security Hubで検出された「[EC2.8] EC2 インスタンスは、インスタンスメタデータサービスバージョン 2 (IMDSv2) を使用することをお勧めします」というセキュリティ課題の修正方法について解説します。

ポリシーの説明
[EC2.8] EC2 インスタンスは、インスタンスメタデータサービスバージョン 2 (IMDSv2) を使用することをお勧めします
Amazon EC2 の Security Hub コントロール – AWS Security Hub
このコントロールは、EC2 インスタンスメタデータバージョンが、インスタンスメタデータサービスバージョン 2 (IMDSv2) で設定されているかどうかをチェックします。IMDSv2 で
HttpTokens
が必須に設定されている場合、コントロールは成功します。HttpTokens
がoptional
に設定されている場合、コントロールは失敗します。
修復方法
AWSコンソールでの修正手順
- EC2 > インスタンスに移動する
- 対象インスタンスを選択し、アクション > インスタンスの設定 > インスタンスメタデータオプションの変更を選択する
- IMDSv2の設定で「必須」を選択し、保存する


Terraformでの修復手順
EC2インスタンスのメタデータサービス設定を安全に構成するためのTerraformコードを作成します。
# 新規EC2インスタンス作成時の設定
resource "aws_instance" "secure_instance" {
ami = "ami-xxxxxxxxxxxxx" # AMI IDを指定
instance_type = "t3.micro"
# IMDSv2の設定
metadata_options {
# IMDSv2を必須に設定
http_tokens = "required"
# メタデータサービスを有効化(または"disabled"で無効化)
http_endpoint = "enabled"
# ホップ制限を1に制限(セキュリティ推奨値)
http_put_response_hop_limit = 1
# インスタンスメタデータタグを有効化
instance_metadata_tags = "enabled"
}
# その他の必要な設定
subnet_id = var.subnet_id
vpc_security_group_ids = [var.security_group_id]
tags = {
Name = "secure-instance"
}
}
# 既存のインスタンスを修正するための設定
resource "aws_instance_metadata_options" "existing_instance" {
instance_id = "i-1234567890abcdef0" # 既存のインスタンスIDを指定
# IMDSv2を必須に設定
http_tokens = "required"
# メタデータサービスを有効化
http_endpoint = "enabled"
# ホップ制限を1に制限
http_put_response_hop_limit = 1
# インスタンスメタデータタグを有効化
instance_metadata_tags = "enabled"
}
# Launch Templateを使用する場合の設定
resource "aws_launch_template" "secure_template" {
name = "secure-launch-template"
metadata_options {
# IMDSv2を必須に設定
http_tokens = "required"
# メタデータサービスを有効化
http_endpoint = "enabled"
# ホップ制限を1に制限
http_put_response_hop_limit = 1
# インスタンスメタデータタグを有効化
instance_metadata_tags = "enabled"
}
# その他の必要な設定
image_id = "ami-xxxxxxxxxxxxx"
instance_type = "t3.micro"
}
# Auto Scaling Groupを使用する場合の設定
resource "aws_autoscaling_group" "secure_asg" {
name = "secure-asg"
desired_capacity = 1
max_size = 3
min_size = 1
target_group_arns = [var.target_group_arn]
vpc_zone_identifier = [var.subnet_id]
launch_template {
id = aws_launch_template.secure_template.id
version = "$Latest"
}
}
# 必要な変数の定義
variable "subnet_id" {
type = string
description = "Subnet ID where the instance will be launched"
}
variable "security_group_id" {
type = string
description = "Security Group ID for the instance"
}
variable "target_group_arn" {
type = string
description = "Target Group ARN for Auto Scaling Group"
}
修正すべき重要なポイントと手順を説明します:
- 新規インスタンスを作成する場合:
metadata_options
ブロックで以下の設定を行う:
metadata_options {
http_tokens = "required" # IMDSv2を必須に
http_endpoint = "enabled" # メタデータサービスを有効化
http_put_response_hop_limit = 1 # ホップ制限を1に制限
}
- 既存インスタンスを修正する場合:
aws_instance_metadata_options
リソースを使用- 既存のインスタンスIDを指定して設定を変更
- Launch Templateを使用する場合:
- テンプレートの
metadata_options
で同様の設定を実施 - 新規インスタンス作成時に使用
- テンプレートの
- Auto Scaling Groupの場合:
- セキュアなLaunch Templateを参照
- 新規インスタンスは自動的にセキュアな設定を継承
注意点:
- 既存インスタンスの修正:
- インスタンスの再起動が必要な場合があります
- 本番環境での変更は計画的に実施
- Auto Scaling Group:
- 既存のインスタンスは自動的には更新されません
- インスタンスの置き換えが必要
- アプリケーションの互換性:
- IMDSv2への移行前にアプリケーションの互換性を確認
- 必要に応じてアプリケーションのコードを更新
最後に
今回は、EC2インスタンスがIMDSv2を使用するように設定する方法についてご紹介しました。IMDSv2への移行は、EC2インスタンスのセキュリティを向上させるための重要なステップです。SSRF攻撃のリスクを軽減し、より安全な環境を構築するために、可能な限りIMDSv2への移行を推奨します。
この問題の検出は弊社が提供するSecurifyのCSPM機能で簡単に検出及び管理する事が可能です。
運用が非常に楽に出来る製品になっていますので、ぜひ興味がある方はお問い合わせお待ちしております。
最後までお読みいただきありがとうございました。この記事が皆さんの役に立てば幸いです。