通过元数据服务从ECS实例内部获取实例属性等信息

ECS实例元数据是指实例ID、VPC信息、网卡信息等实例属性信息,支持在ECS实例内部通过访问元数据服务(Metadata Service)获取。通过该获取方式,您无需登录控制台或调用API,在实例内部即可访问实例信息,可以更便捷、安全地配置或管理正在运行的实例或实例上的程序。例如,运行在ECS实例中的应用程序,可以通过访问实例元数据服务获取绑定到实例上的RAM角色身份凭证(STS),以在不硬编码凭证的情况下访问授权资源(如OSS、KMS、其他ECS等)。

使用限制

  • ECS实例的网络类型为专有网络VPC。

  • 仅支持在实例内部访问元数据服务器来访问实例元数据,且实例需处于运行中状态。

  • 单实例高频访问元数据服务器获取元数据时,可能会导致限流。

    在高频访问场景下,建议缓存已获取的实例元数据。以RAM临时安全凭证为例,获取到凭证后建议将其缓存,并在凭证接近过期时间前重新获取新的凭证,以避免因频繁访问实例元数据服务器而导致的访问限流。

获取实例元数据

通过访问元数据服务(Metadata Service)来获取实例元数据,例如实例ID、VPC信息、网卡信息等。

操作步骤

说明
  • 如果实例或实例元数据中包含了敏感数据,建议您采取适当的措施来保护敏感数据,例如访问控制、数据加密等。

  • 访问元数据服务器获取实例元数据有加固模式和普通模式两种。两种模式的说明,请参见元数据服务器访问模式

加固模式

重要

请确保实例的cloud-init版本为23.2.2。如果实例的cloud-init版本不满足要求,您可以升级cloud-init版本。检查cloud-init版本及升级方法,请参见安装cloud-init

  • Linux实例

    # 获取访问元数据服务器访问凭证,需设置有效期,不可包含标头X-Forwarded-For
    TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:<元数据服务器访问凭证有效期>"`
    # 访问实例元数据
    curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/<metadata>
  • Windows实例

    # 获取访问元数据服务器访问凭证,需设置有效期,不可包含标头X-Forwarded-For
    $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "<元数据服务器访问凭证有效期>"} -Method PUT –Uri http://100.100.100.200/latest/api/token
    # 访问实例元数据
    Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/<metadata>
    • <元数据服务器访问凭证有效期>:访问凭证用于鉴权以加强数据安全。有效期取值范围为1~21600,单位为秒。

      • 在有效期内可重复使用实例元数据访问命令访问任何元数据信息;超过有效期后,凭证失效需要重新获取,否则无法访问实例元数据。

      • 访问凭证仅适用于一台实例,如果将凭证复制到其他实例使用,会被拒绝访问。

    • <metadata>:需替换为具体要查询的实例元数据,可查阅实例元数据列表

普通模式

重要

普通模式请求是通过IP地址鉴权,如果您的ECS实例上存在错误配置的反向代理、未修补的SSRF漏洞等,可能导致与实例绑定的RAM角色STS临时访问凭证泄露。

  • Linux实例

    curl http://100.100.100.200/latest/meta-data/<metadata>
  • Windows实例(PowerShell)

    Invoke-RestMethod http://100.100.100.200/latest/meta-data/<metadata>

<metadata>:需替换为具体要查询的实例元数据,可查阅实例元数据列表

获取示例

以访问实例所属VPC ID为例,命令如下。

加固模式

假设,设置元数据服务器访问凭证有效期为180秒。

  • Linux实例

    TOKEN=`curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-aliyun-ecs-metadata-token-ttl-seconds:180"`
    curl -H "X-aliyun-ecs-metadata-token: $TOKEN" http://100.100.100.200/latest/meta-data/vpc-id
  • Windows实例

    $token = Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token-ttl-seconds" = "180"} -Method PUT –Uri http://100.100.100.200/latest/api/token
    Invoke-RestMethod -Headers @{"X-aliyun-ecs-metadata-token" = $token} -Method GET -Uri http://100.100.100.200/latest/meta-data/vpc-id

普通模式

  • Linux实例

    curl http://100.100.100.200/latest/meta-data/vpc-id
  • Windows实例

    Invoke-RestMethod http://100.100.100.200/latest/meta-data/vpc-id

元数据服务器访问模式

默认情况下,实例元数据服务器可同时通过普通模式和加固模式访问。为了进一步增强安全性,您可以设置实例元数据服务器访问模式为仅加固模式

访问模式说明

对比项

普通模式

加固模式

交互方式

请求/响应

会话

鉴权方式

同VPC内源IP地址鉴权

同VPC内源IP地址鉴权+元数据服务器访问凭证鉴权

该访问凭证具有以下特点:

  • 短时效性:访问凭证有效期,且最长为6小时,超过有效期后将失效,需要重新获取。

  • 绑定实例:仅适用于一台实例,如果将凭证复制到其他实例使用,会被拒绝访问。

  • 不接受代理访问:请求中包含标头X-Forwarded-For,元数据服务器会拒绝签发访问凭证。

查看方法

无需任何访问凭证即可通过命令直接访问endpoint

需要先获取元数据服务器访问凭证进行鉴权,再访问endpoint,提高了元数据访问的安全性

安全级别

较低

请求通过IP地址鉴权,意味着攻击者可以伪造请求的源IP地址,绕过IP地址鉴权,进行SSRF攻击,造成实例元数据信息泄露风险。

较高

访问元数据之前,必须先获取有效的元数据访问凭证进行身份验证和授权,该访问凭证只能在ECS实例内部生成,在特定的ECS实例上使用,且具有时效性,攻击者难以通过猜测或伪造的方式生成,可以防范大多数SSRF攻击。

cloud-init版本限制

需确保实例的cloud-init版本为23.2.2。

重要
  • 部分最新发布的公共镜像支持cloud-init 23.2.2版本。在通过API接口RunInstancesCreateInstance创建新实例时,可以指定ImageId选择cloud-init 23.2.2版本的镜像,选用这些公共镜像创建的实例支持加固模式访问元数据。支持cloud-init 23.2.2版本的公共镜像信息,请参见公共镜像发布记录

  • 如果已有实例的cloud-init版本不满足要求,您可以升级cloud-init版本,从而支持加固模式。检查cloud-init版本及升级方法,请参见安装cloud-init

设置访问模式

新创建实例

  • 控制台方式

    在创建ECS实例过程中,默认支持通过普通模式或加固模式访问实例元数据。

    image

  • API接口方式

    通过API接口RunInstancesCreateInstance创建实例时,通过HttpTokens参数设置实例元数据服务器访问模式。该参数取值范围:

    • optional:默认不强制使用加固模式,支持通过普通模式或加固模式访问实例元数据。

    • required:强制使用加固模式,即仅加固模式。设置该取值后,无法通过普通模式访问实例元数据。

已有实例

  • 控制台方式

    1. 在实例列表页,找到待操作的实例,在操作列,选择icon1 > 实例设置 > 修改实例元数据访问信息

      image.png

    2. 开启是否启用实例元数据访问通道,并设置实例元数据访问模式

      • 普通:支持通过普通模式或加固模式查看实例元数据。

      • 仅加固模式(推荐):仅支持通过加固模式查看实例元数据,普通模式无法访问实例元数据。

  • API接口方式

    通过API接口ModifyInstanceMetadataOptions修改元数据信息时,通过HttpTokens参数设置实例元数据访问模式。该参数取值范围:

    • optional:默认不强制使用加固模式,支持通过普通模式或加固模式访问实例元数据。

    • required:强制使用加固模式,即仅加固模式。设置该取值后,普通模式无法访问实例元数据。

限制RAM用户仅能通过加固模式获取实例元数据

阿里云账号可以通过以下权限策略,实现所有RAM用户(子账号)在通过API接口RunInstancesCreateInstance创建实例或ModifyInstanceMetadataOptions修改已有实例元数据信息时,只能通过仅加固模式访问实例元数据服务器获取数据。权限策略内容如下:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Deny",
      "Action": [
        "ecs:RunInstances",
        "ecs:CreateInstance",
        "ecs:ModifyInstanceMetadataOptions"
      ],
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "ecs:SecurityHardeningMode": [
            "false"
          ]
        }
      }
    }
  ]
}

添加权限策略具体操作,请参见通过脚本编辑模式创建自定义权限策略

重要

使用仅加固模式访问实例元数据时,需确保实例的cloud-init版本为23.2.2。如果实例的cloud-init版本不满足要求,可能导致实例无法正常启动。检查cloud-init版本及升级方法,请参见安装cloud-init

实例元数据列表

元数据

说明

示例

dns-conf/nameservers

实例的DNS配置。

100.100.XX.XX

hostname

实例的主机名。

iZbp13znx0m0me8cquu****

instance/instance-type

实例规格。

ecs.g6e.large

instance/instance-name

实例名称

iZbp1bfqfsvqzxhmnd5****

image-id

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

aliyun_3_x64_20G_alibase_20210425.vhd

image/market-place/product-code

云市场镜像的商品码。

cmjj01****

image/market-place/charge-type

云市场镜像的计费方式。

PrePaid

instance-id

实例ID。

i-bp13znx0m0me8cquu****

mac

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

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

network-type

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

vpc

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

网卡的标识ID,其中[mac]参数需要替换为实例的MAC地址。

eni-bp1b2c0jvnj0g17b****

network/interfaces/macs/[mac]/netmask

网卡对应的子网掩码。

255.255.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]/private-ipv4s

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

["192.168.XX.XX"]

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

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

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

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

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

vsw-bp1ygryo03m39xhsy****

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

网卡所属安全组的VPC ID。

vpc-bp1e0g399hkd7c8q3****

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

网卡主私有IP地址。

192.168.XX.XX

network/interfaces/macs/[mac]/gateway

网卡对应的IPv4网关地址。

192.168.XX.XX

instance/max-netbw-egress

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

1228800

network/interfaces/macs/[mac]/ipv6s

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

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

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

网卡所属的VPC的IPv6网关地址。

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

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

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

2408:XXXX:325:a204::/64

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

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

192.168.XX.XX/28

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

网卡分配的IPv6前缀列表。

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

disks/[disk-id]/id

云盘ID。

d-bp131n0q38u3a4zi****

disks/[disk-id]/name

云盘名称。

testDiskName

private-ipv4

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

192.168.XX.XX

public-ipv4

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

120.55.XX.XX

eipv4

该实例元数据项用于获取以下信息:

  • 实例的固定公网IPv4地址。

  • 实例主网卡挂载的弹性公网IPv4地址。

120.55.XX.XX

ntp-conf/ntp-servers

NTP服务器地址。

ntp1.aliyun.com

owner-account-id

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

1609****

region-id

实例所属地域。

cn-hangzhou

zone-id

实例所属可用区。

cn-hangzhou-i

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

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

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

serial-number

实例所对应的序列号。

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

source-address

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

http://mirrors.cloud.aliyuncs.com

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

vpc-id

实例所属VPC ID。

vpc-bp1e0g399hkd7c8q****

vpc-cidr-block

实例所属VPC CIDR段。

192.168.XX.XX/16

vswitch-cidr-block

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

192.168.XX.XX/24

vswitch-id

实例所属虚拟交换机ID。

vsw-bp1ygryo03m39xhsy****

/ram/security-credentials/[role-name]

如果存在与实例关联的RAM角色,则role-name为角色的名称,并且role-name包含与角色关联的临时安全凭证。如果没有,则不显示。

AliyunECSImageExportDefaultRole

instance/spot/termination-time

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

2020-04-07T17:03:00Z

instance/virtualization-solution

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

ECS Virt

instance/virtualization-solution-version

内部Build号。

2.0

常见问题

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

请确认命令是否正确。常见错误命令如下:

  • 元数据服务器访问凭证的有效期超出范围(1秒~21600秒)

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

    curl -X PUT "http://100.100.100.200/latest/api/token" -H "X-Forwarded-For: www.ba****.com"
  • 指定的元数据服务器访问凭证无效

    curl -H "X-aliyun-ecs-metadata-token: aaa" -v http://100.100.100.200/latest/meta-data/