实例元数据

重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

运行于ECS实例的应用,可通过元数据服务动态查询实例ID、IP等实例元数据信息,避免硬编码。为防范SSRF攻击导致元数据泄露,建议通过加固模式访问元数据(需先获取访问令牌),并配置实例仅允许加固模式访问,以有效规避普通模式下的安全风险。

获取实例元数据

实例元数据是实例自身属性的集合,包含实例ID、网络环境、凭证等关键属性。

方式一:加固模式(推荐)

通过加固模式访问元数据时,需先获取临时访问令牌(Token),然后携带令牌获取元数据。

Linux

  1. 登录实例。

  2. 获取临时令牌(Token)。

    TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:21600"`
    参数X-aliyun-ecs-metadata-token-ttl-seconds: 令牌有效期,取值范围:1~21600(秒)
  3. 携带令牌(Token)获取元数据。

    curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/instance-id
    命令末尾的instance-id代表获取实例ID,可替换为其他需要获取的元数据项。例如mac(获取MAC地址)或hostname(获取主机名)。

    成功执行后,终端将仅输出实例ID字符串,例如:i-bp1******

Windows

  1. 登录实例。

  2. 获取临时令牌(Token)。

    $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "21600"} -Method PUT -Uri http://100.100.100.200/latest/api/token
    参数X-aliyun-ecs-metadata-token-ttl-seconds: 令牌有效期,取值范围1~21600(秒)。
  3. 携带令牌(Token)获取元数据。

    Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/instance-id
    命令末尾的instance-id代表获取实例ID,可替换为其他需要获取的元数据项。例如mac(获取MAC地址)或hostname(获取主机名)。

    成功执行后,终端将仅输出实例ID字符串,例如:i-bp1******

方式二:普通模式

警告

普通模式是一种不安全的访问方式,不推荐使用。

  • Linux:

    # 直接发送GET请求获取实例ID
    curl http://100.100.100.200/latest/meta-data/instance-id
  • Windows:

    # 直接发送GET请求获取实例ID。
    Invoke-RestMethod -Uri http://100.100.100.200/latest/meta-data/instance-id -Method Get

开启仅允许加固模式访问元数据

为防范严重安全风险,建议为ECS实例启用仅加固模式,启用后,仅能通过加固模式访问元数据,任何普通模式访问都会报错(403 - Forbidden)。默认情况下,ECS实例支持无令牌访问元数据(普通模式),存在被服务器端请求伪造 (SSRF) 攻击的严重风险。

典型攻击场景:利用应用程序从外部URL下载图片的功能,构造恶意请求,诱使服务器代替其访问内部元数据服务,窃取实例绑定的RAM角色的临时访问凭证,若该角色权限过高,攻击者便可能获得云资源控制权限,甚至接管整个云账号。

创建新实例时启用仅加固模式

控制台

自定义购买实例时,将高级选项 > 元数据访问模式调整为仅加固模式

使用自定义镜像创建实例时,若无仅加固模式选项,需对镜像进行升级

CLI

在通过RunInstancesCreateInstance创建实例时,可通过配置HttpEndpoint=enabledHttpTokens=required设置实例的元数据访问模式为仅加固模式。命令示例如下:

执行该命令后,会创建一台仅加固模式Linux实例。
aliyun ecs RunInstances \
--region cn-hangzhou \
--RegionId 'cn-hangzhou' \
--ImageId 'aliyun_3_x64_20G_alibase_20250629.vhd' \
--InstanceType 'ecs.g7.large' \
--VSwitchId 'vsw-bp1******trg' \
--SecurityGroupId 'sg-bp1******dgl' \
--SystemDisk.Size 40 \
--SystemDisk.Category cloud_essd \
--HttpEndpoint enabled \
--HttpTokens required

API

在通过RunInstancesCreateInstance创建实例时,通过配置HttpEndpoint=enabledHttpTokens=required设置实例的元数据访问策略为仅加固模式

将已有实例升级到仅加固模式

适用范围

  • Windows实例:不支持开启仅加固模式。强行开启将导致实例初始化异常,并影响主机名修改、KMS激活等多项关键功能。

  • Linux实例支持升级,但在操作前必须完成下文所述的依赖项排查与改造。

步骤一:排查并升级代码及依赖项

在切换到仅加固模式之前,实例及其中部署的应用,必须确保满足以下要求:

  • 确保Cloud-init版本不低于23.2.2:可登录实例并执行cloud-init --version命令查看当前版本。若版本过低,切换仅加固模式后将导致实例启动异常,请先升级Cloud-init版本到23.2.2或更高版本。

  • 所有应用代码/脚本已通过方式一:加固模式访问实例元数据。

    重要

    若应用代码依赖Credentials库获取STS Token配置SDK,需将Credentials依赖升级至支持加固模式的版本

升级完成后,可如何检测ECS实例是否存在普通模式的元数据访问?,在确定不存在普通模式访问后,开启实例的仅加固模式

步骤二:切换到仅加固模式

控制台

  1. 进入ECS控制台-实例,选择地域与资源组。

  2. 在操作列单击image > 修改实例元数据访问信息

  3. 开启是否启用实例元数据访问通道开关,并设置实例元数据访问模式仅加固模式,然后单击确定

    image

CLI

调用ModifyInstanceMetadataOptions,设置HttpEndpoint=enabledHttpTokens=required切换实例元数据访问模式为仅加固模式。命令示例:

aliyun ecs ModifyInstanceMetadataOptions \
--region cn-hangzhou \
--RegionId 'cn-hangzhou' \
--InstanceId 'i-bp1******ke' \
--HttpEndpoint enabled \
--HttpTokens required

API

调用ModifyInstanceMetadataOptions,设置HttpEndpoint=enabledHttpTokens=required切换实例元数据访问模式为仅加固模式

切换完成后,建议持续监控实例的元数据访问情况和应用运行状态,确保业务平稳运行,避免因遗漏改造的应用而导致服务中断。若出现异常,建议先切换回普通模式和加固模式,优先恢复业务,然后重新进一步步骤一:排查并升级代码及依赖项

实例元数据明细

分类

元数据

说明

示例

实例基本信息

instance-id

实例ID。

i-bp13znx0m0me8cquu****

instance/instance-name

实例名称。

iZbp1bfqfsvqzxhmnd5****

hostname

实例的主机名。

iZbp13znx0m0me8cquu****

instance/instance-type

实例规格。

ecs.g6e.large

serial-number

实例所对应的序列号。

4acd2b47-b328-4762-852f-998****

region-id

实例所属地域ID。

cn-hangzhou

zone-id

实例所属可用区。

cn-hangzhou-i

owner-account-id

实例拥有者的阿里云账号ID。

1609****

镜像信息

image-id

创建实例时所使用的镜像ID。

aliyun_3_x64_20G_alibase_20210425.vhd

image/market-place/product-code

云市场镜像的商品码。

cmjj01****

image/market-place/charge-type

云市场镜像的计费方式。

PrePaid

source-address

镜像库地址,主要为yum源或者apt源,供Linux实例的包管理软件获取更新。

http://mirrors.cloud.aliyuncs.com

基础网络配置

network-type

网络类型,只支持VPC类型实例。

vpc

vpc-id

实例所属VPC ID。

vpc-bp1e0g399hkd7c8q****

vpc-cidr-block

实例所属VPC CIDR段。

192.168.XX.XX/16

vswitch-id

实例所属虚拟交换机ID。

vsw-bp1ygryo03m39xhsy****

vswitch-cidr-block

实例所属虚拟交换机CIDR段。

192.168.XX.XX/24

instance/max-netbw-egress

实例规格的出方向内网最大带宽。单位:Kbit/s。

1228800

dns-conf/nameservers

实例的DNS配置。

100.100.XX.XX

ntp-conf/ntp-servers

NTP服务器地址。

ntp1.aliyun.com

主网卡IP地址

mac

实例的MAC地址,如果实例存在多个网卡,则只显示eth0上的MAC地址。

00:16:3e:0f:XX:XX

private-ipv4

实例主网卡的私网IPv4地址。

192.168.XX.XX

public-ipv4

实例主网卡的公网IPv4地址。

120.55.XX.XX

eipv4

获取实例的固定公网IPv4地址或主网卡挂载的弹性公网IPv4地址。

120.55.XX.XX

弹性网卡详细信息

network/interfaces/macs/[mac]/network-interface-id

网卡的标识ID。

[mac]参数需要替换为实例的MAC地址(可通过元数据mac获取),下同。

eni-bp1b2c0jvnj0g17b****

network/interfaces/macs/[mac]/vpc-id

网卡所属的VPC ID。

vpc-bp1e0g399hkd7c8q3****

network/interfaces/macs/[mac]/vswitch-id

网卡所属的虚拟交换机ID。

vsw-bp1ygryo03m39xhsy****

network/interfaces/macs/[mac]/primary-ip-address

网卡主私有IP地址。

192.168.XX.XX

network/interfaces/macs/[mac]/private-ipv4s

网卡分配的私网IPv4地址列表。

["192.168.XX.XX"]

network/interfaces/macs/[mac]/ipv4-prefixes

网卡分配的私网IPv4前缀列表。

192.168.XX.XX/28

network/interfaces/macs/[mac]/netmask

网卡对应的子网掩码。

255.255.XX.XX

network/interfaces/macs/[mac]/gateway

网卡对应的IPv4网关地址。

192.168.XX.XX

network/interfaces/macs/[mac]/vswitch-cidr-block

网卡所属的虚拟交换机IPv4 CIDR段。

192.168.XX.XX/24

network/interfaces/macs/[mac]/vpc-cidr-block

网卡所属的VPC IPv4 CIDR段。

192.168.XX.XX/16

network/interfaces/macs/[mac]/ipv6s

网卡分配的IPv6地址列表,仅支持已配置了IPv6VPC类型实例。

[2408:XXXX:325:a204:1875:217f:184a:e4e]

network/interfaces/macs/[mac]/ipv6-prefixes

网卡分配的IPv6前缀列表。

2001:db8:1234:1a00:XXXX::/80

network/interfaces/macs/[mac]/ipv6-gateway

网卡所属的VPCIPv6网关地址。

2408:XXXX:325:a204:ffff:ffff:ffff:fff7

network/interfaces/macs/[mac]/vswitch-ipv6-cidr-block

网卡所属的虚拟交换机IPv6 CIDR段,仅支持已配置了IPv6VPC类型实例。

2408:XXXX:325:a204::/64

network/interfaces/macs/[mac]/vpc-ipv6-cidr-blocks

网卡所属的VPC IPv6 CIDR段,仅支持已配置了IPv6VPC类型实例。

[2408:XXXX:325:a200::/56]

云盘信息

disks/

云盘序列号。

bp131n0q38u3a4zi****

disks/[disk-serial]/id

云盘ID。

d-bp131n0q38u3a4zi****

disks/[disk-serial]/name

云盘名称。

testDiskName

安全与凭证

public-keys/[keypair-id]/openssh-key

公有密钥。仅在实例启动时提供了公有密钥的情况下可用。

ssh-rsa ****3NzaC1yc2EAAAADAQABAAABAQDLNbE7pS****@****.com

ram/security-credentials/[role-name]

与实例关联的RAM角色的临时安全凭证。[role-name]需替换为角色名称。凭证在Expiration字段指定时间后失效,需重新调用接口获取。

{
    "AccessKeyId": "****",
    "AccessKeySecret": "****",
    "Expiration": "2024-11-08T09:44:50Z",
    "SecurityToken": "****",
    "LastUpdated": "2024-11-08T03:44:50Z",
    "Code": "Success"
}

实例高级属性

instance/virtualization-solution

ECS虚拟化方案,支持Virt 1.0Virt 2.0。

ECS Virt

instance/virtualization-solution-version

内部Build号。

2

instance/spot/termination-time

抢占式实例的操作系统设置的停机释放时间,时区标准为UTC+0,格式为yyyy-MM-ddThh:mm:ssZ。

2020-04-07T17:03:00Z

Windows特定配置

kms-server

Windows实例的KMS激活服务器。

kms.cloud.aliyuncs.com

wsus-server/wu-server

Windows实例的更新服务器。

http://update.cloud.aliyuncs.com

wsus-server/wu-status-server

Windows实例的更新状态监控服务器。

http://update.cloud.aliyuncs.com

常见问题

  • 什么是SSRF攻击?仅加固模式防御SSRF攻击原理是什么?

    SSRF(Server-Side Request Forgery,服务端请求伪造)是一种安全漏洞,攻击者通过诱导服务器发起任意网络请求,从而访问受保护的内部系统(如元数据服务、数据库等)。例如,攻击者提交包含http://100.100.100.200/latest/meta-data/URL,诱使应用抓取并返回元数据中的敏感信息,造成元数据泄露。

    默认情况下,ECS实例支持无令牌访问元数据(普通模式)。开启仅加固模式后,会强制启用令牌验证机制:客户端必须先发送PUT请求获取临时令牌,并在后续GET请求中携带该令牌。由于SSRF攻击难以发起PUT请求,无法获取令牌,从而有效阻断访问,提升元数据安全。

  • 加固模式下,使用命令无法访问实例元数据,如何处理?

    常见错误命令如下:

    • 实例元数据访问凭证的有效期超出范围(400 - Missing or Invalid Parameters)

      实例元数据访问凭证有效期范围为1秒~21600秒,超过这个限制,会报错400 - Missing or Invalid Parameters

      curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds: 21700"
    • 请求中存在X-Forwarded-For标头(403 - Forbidden)

      curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-Forwarded-For: www.ba****.com"
    • 指定的实例元数据访问凭证无效(401 - Unauthorized)

      curl -H "X-aliyun-ecs-metadata-token: aaa" -v http://100.100.100.200/latest/meta-data/
  • 高频访问元数据服务被限流怎么办?

    元数据服务存在访问频率限制。最佳实践是在应用启动时获取一次基本不变的元数据项(如instance-id),然后将其缓存在本地内存或文件中,并设置合理的缓存过期时间。

  • 将实例元数据访问模式修改为仅加固模式后,应用无法正常工作如何排查?

    可能是实例中应用或脚本中仍在使用旧的普通模式。请按照升级到仅加固模式彻底排查并升级依赖普通模式的应用。

  • 能否从本地主机访问这个元数据地址?

    不能。100.100.100.200 是一个本地地址,仅在ECS实例内部的虚拟网络接口上有效。任何从实例外部发往该地址的请求都无法路由,这是保障元数据安全的基础设计之一。

  • 使自定义镜像创建实例时,不支持选择仅加固模式,如何解决?

    当使用自定义Linux镜像创建ECS实例时,若发现无法选择或启用仅加固模式,这通常意味着该镜像尚未满足支持此安全特性的必要条件。需参考以下流程对镜像进行升级:

    1. 创建临时实例:使用需升级的自定义镜像,创建一个用于诊断改造的临时ECS实例。

    2. 改造临时实例:在第一步创建的临时实例上,参考将已有实例升级到仅加固模式完成以下改造:

      • 升级 Cloud-init:将其升级到 23.2.2 或更高版本。

      • 改造应用/脚本:修改所有依赖“普通模式”的应用或脚本,使其适配“加固模式”。

    3. 创建新镜像并修改属性:改造完成后,基于这台实例创建新版自定义镜像。然后调用ModifyImageAttribute调整镜像属性Features.ImdsSupport=v2

    4. 释放资源:新镜像制作完成后,及时释放用于诊断和改造的临时实例,以节省成本。

  • Credentials工具支持加固模式的版本

    低版本的Credentials不支持通过加固模式访问元数据,在切换到仅加固模式时,会导致其无法通过普通模式获取元数据中的STS Token初始化SDK,造成业务异常。

    在切换前,请升级Credentials依赖至支持加固模式的版本,具体版本要求如下:

    • Java:credentials-java版本 >= 0.3.10

    • Node.js:credentials版本 >= 2.3.1

    • PHP:credentials版本 >= 1.2.0

    • Python:alibabacloud_credentials版本 >= 0.3.6

    • Go:credentials-go版本 >= 1.3.10

  • 如何检测ECS实例是否存在普通模式的元数据访问?

    在排查实例中依赖普通模式的应用代码时,可通过以下两种方式,检测并定位到具体进程,以便后续进行改造升级。

    方式一:通过云监控确认是否存在普通模式访问

    在云监控控制台,通过查看ECS元数据监控,可以快速确认近期实例是否存在普通模式的访问。

    1. 进入云监控控制台

    2. 在左侧导航栏选择云资源监控 > 云产品监控页面,搜索并进入ECS元数据监控页面。

    3. 查看目标实例的普通模式访问成功次数指标。

    4. 若该指标值不为0,证明实例存在普通模式对元数据的访问,需要进一步找到依赖该模式的应用,并将其升级至加固模式。

    方式二:通过云助手插件定位具体进程

    使用云助手插件,可以辅助在实例内部,精准定位在使用普通模式访问元数据的进程。

    适用操作系统

    • Alibaba Cloud Linux 3

    • Alibaba Cloud Linux 3 Pro

    • Anolis OS 8

    • CentOS Stream 8/9

    • CentOS 8

    • Ubuntu: 20/24

    • Debian:10,11,12

    • Fedora 35+

    • AlmaLinux 8/9

    • Rocky Linux 8/9

    • Red Hat Enterprise Linux 8/9

    • Red Hat中需要自行下载rpm安装云助手Agent

    • SUSE 15.1/15.2/15.3/15.4/15.5/15.6

    • OpenSuse 15.2/15.3/15.4/15.5/15.6

    操作步骤

    1. 安装并启用云助手插件

      登录ECS实例,执行以下命令安装并启动监控服务,启用后会占用部分实例性能。

      # 部署监控服务
      sudo acs-plugin-manager --exec --plugin ACS-ECS-ImdsPacketAnalyzer
      
      # 查看监控服务状态
      sudo systemctl status imds_tracer_tool

      p940998

    2. 定位问题进程 运行命令,查看哪些进程仍在以普通模式访问元数据。日志会显示相关进程的PID。

      cat /var/log/imds/imds-trace.* | grep WARNING

      p940995

    3. 分析并改造 根据日志中的PID,找到对应的应用程序或脚本,并对其进行升级改造,通过加固模式访问元数据。