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

测试结果

  1. IMDSv1访问成功

    • 直接访问http://169.254.169.254/latest/meta-data/instance-id
    • 无需token即可获取实例元数据
    • 返回正确的实例ID
  2. IMDSv2访问也成功

    • 先获取session token
    • 使用token访问元数据
    • 同样返回正确的实例ID
  3. 配置覆盖有效

    • AL2023默认的ImdsSupport: "v2.0"设置被Launch Template成功覆盖
    • HttpTokens: "optional"配置生效,允许IMDSv1和IMDSv2共存

✅ AL2023可以通过Launch Template配置成功支持IMDSv1!

实施案例

在EKS 节点中使用AL2023并启用IMDSv1 以兼容遗留的 Java 应用:

  1. 创建Launch Template

    {
      "MetadataOptions": {
        "HttpEndpoint": "enabled",
        "HttpPutResponseHopLimit": 2,
        "HttpTokens": "optional"
      }
    }
    
  2. 在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
    

安全建议

  1. 临时方案:仅在迁移期间启用IMDSv1支持
  2. 监控访问:使用CloudTrail监控metadata访问模式
  3. 逐步迁移:计划将Java应用迁移到IMDSv2或EKS Pod Identity
  4. 最小权限:限制哪些应用可以访问IMDS

优先级顺序

根据AWS文档,IMDS配置的优先级为:

  1. 实例启动时配置(Launch Template)- 最高优先级
  2. 账户级别设置
  3. AMI配置 - 最低优先级

因此Launch Template的HttpTokens: "optional"设置可以成功覆盖AL2023 AMI的默认ImdsSupport: "v2.0"配置。

‹ Next Post Previous Post ›
No Comment
Add Comment
comment url
⬆️