AL2023 启用 IMDSv1 验证测试
AWS于2023年3月15日正式发布的 Amazon Linux 2023 (AL2023) 操作系统默认启用 IMDSv2(Instance Metadata Service Version 2),这是AWS为了增强安全性而推出的重要改进。然而,这一变化可能会导致依赖 IMDSv1 的传统应用,如旧版 Java 应用程序出现兼容性问题。本文将探讨如何为 AL2023 启用 IMDSv1 支持,并通过实际的验证测试来确认配置的有效性,为需要兼容性支持的企业提供可行的方案。
测试目标
验证Amazon Linux 2023 (AL2023)是否可以通过Launch Template配置来支持IMDSv1,以解决Java应用依赖IMDSv1的兼容性问题。
验证环境
- AWS Region: ap-northeast-1 (东京)
- AWS Profile: lab
- 测试时间: 2025-06-12
- AL2023 AMI: ami-07460a3f37dd24dc0 (Amazon Linux 2023 AMI 2023.7.20250609.0 x86_64 HVM kernel-6.12)
测试方法
1. 创建支持IMDSv1的Launch Template
aws ec2 create-launch-template \
--profile lab \
--region ap-northeast-1 \
--launch-template-name "al2023-imdsv1-test-template" \
--launch-template-data '{
"ImageId": "ami-07460a3f37dd24dc0",
"InstanceType": "t3.micro",
"TagSpecifications": [
{
"ResourceType": "instance",
"Tags": [
{"Key": "Name", "Value": "AL2023-IMDSv1-Test"},
{"Key": "Purpose", "Value": "Testing IMDSv1 support on AL2023"}
]
}
],
"MetadataOptions": {
"HttpEndpoint": "enabled",
"HttpPutResponseHopLimit": 2,
"HttpTokens": "optional"
}
}'
关键配置参数:
HttpTokens: "optional"
- 允许IMDSv1和IMDSv2共存HttpEndpoint: "enabled"
- 启用IMDS服务HttpPutResponseHopLimit: 2
- 适合容器环境
2. 启动测试实例
aws ec2 run-instances \
--profile lab \
--region ap-northeast-1 \
--count 1 \
--launch-template LaunchTemplateId=lt-06cb5e9a301782124,Version=1 \
--subnet-id subnet-485edf00
3. 验证IMDS配置
aws ec2 describe-instances \
--profile lab \
--region ap-northeast-1 \
--instance-ids i-0ac038b0160e12345 \
--query 'Reservations[0].Instances[0].MetadataOptions'
验证结果:
{
"State": "applied",
"HttpTokens": "optional",
"HttpPutResponseHopLimit": 2,
"HttpEndpoint": "enabled",
"HttpProtocolIpv6": "disabled",
"InstanceMetadataTags": "disabled"
}
4. 功能测试
使用AWS Systems Manager发送命令测试IMDSv1和IMDSv2访问:
aws ssm send-command \
--profile lab \
--region ap-northeast-1 \
--instance-ids i-0ac038b0160e12345 \
--document-name "AWS-RunShellScript" \
--parameters 'commands=[
"echo \"Testing IMDSv1 (direct access):\"",
"curl -s http://169.254.169.254/latest/meta-data/instance-id",
"echo",
"echo \"Testing IMDSv2 (with token):\"",
"TOKEN=$(curl -X PUT \"http://169.254.169.254/latest/api/token\" -H \"X-aws-ec2-metadata-token-ttl-seconds: 21600\" -s)",
"curl -H \"X-aws-ec2-metadata-token: $TOKEN\" -s http://169.254.169.254/latest/meta-data/instance-id",
"echo"
]'
命令执行输出:
Testing IMDSv1 (direct access):
i-0ac038b0160e12345
Testing IMDSv2 (with token):
i-0ac038b0160e12345
✅ 测试成功!
5. 环境清理
# 终止测试实例
aws ec2 terminate-instances --instance-ids i-0ac038b0160e12345
# 删除Launch Template
aws ec2 delete-launch-template --launch-template-id lt-06cb5e9a301782124
测试结果
IMDSv1访问成功:
- 直接访问
http://169.254.169.254/latest/meta-data/instance-id
- 无需token即可获取实例元数据
- 返回正确的实例ID
- 直接访问
IMDSv2访问也成功:
- 先获取session token
- 使用token访问元数据
- 同样返回正确的实例ID
配置覆盖有效:
- AL2023默认的
ImdsSupport: "v2.0"
设置被Launch Template成功覆盖 HttpTokens: "optional"
配置生效,允许IMDSv1和IMDSv2共存
- AL2023默认的
✅ AL2023可以通过Launch Template配置成功支持IMDSv1!
实施案例
在EKS 节点中使用AL2023并启用IMDSv1 以兼容遗留的 Java 应用:
创建Launch Template:
{ "MetadataOptions": { "HttpEndpoint": "enabled", "HttpPutResponseHopLimit": 2, "HttpTokens": "optional" } }
在EKS节点组中使用Launch Template:
aws eks create-nodegroup \ --cluster-name my-cluster \ --nodegroup-name al2023-imdsv1-nodes \ --launch-template name=al2023-imdsv1-template,version=1 \ --subnets subnet-xxx subnet-yyy \ --node-role arn:aws:iam::account:role/NodeInstanceRole
安全建议
- 临时方案:仅在迁移期间启用IMDSv1支持
- 监控访问:使用CloudTrail监控metadata访问模式
- 逐步迁移:计划将Java应用迁移到IMDSv2或EKS Pod Identity
- 最小权限:限制哪些应用可以访问IMDS
优先级顺序
根据AWS文档,IMDS配置的优先级为:
- 实例启动时配置(Launch Template)- 最高优先级
- 账户级别设置
- AMI配置 - 最低优先级
因此Launch Template的HttpTokens: "optional"
设置可以成功覆盖AL2023 AMI的默认ImdsSupport: "v2.0"
配置。