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地址鉴权+元数据服务器访问凭证鉴权 该访问凭证具有以下特点:
|
查看方法 | 无需任何访问凭证即可通过命令直接访问endpoint | 需要先获取元数据服务器访问凭证进行鉴权,再访问endpoint,提高了元数据访问的安全性 |
安全级别 | 较低 请求通过IP地址鉴权,意味着攻击者可以伪造请求的源IP地址,绕过IP地址鉴权,进行SSRF攻击,造成实例元数据信息泄露风险。 | 较高 访问元数据之前,必须先获取有效的元数据访问凭证进行身份验证和授权,该访问凭证只能在ECS实例内部生成,在特定的ECS实例上使用,且具有时效性,攻击者难以通过猜测或伪造的方式生成,可以防范大多数SSRF攻击。 |
cloud-init版本限制 | 无 | 需确保实例的cloud-init版本为23.2.2。 重要
|
设置访问模式
新创建实例
控制台方式
在创建ECS实例过程中,默认支持通过普通模式或加固模式访问实例元数据。
API接口方式
通过API接口RunInstances或CreateInstance创建实例时,通过
HttpTokens
参数设置实例元数据服务器访问模式。该参数取值范围:optional
:默认不强制使用加固模式,支持通过普通模式或加固模式访问实例元数据。required
:强制使用加固模式,即仅加固模式。设置该取值后,无法通过普通模式访问实例元数据。
已有实例
控制台方式
在实例列表页,找到待操作的实例,在操作列,选择 > 实例设置 > 修改实例元数据访问信息。
开启是否启用实例元数据访问通道,并设置实例元数据访问模式。
普通:支持通过普通模式或加固模式查看实例元数据。
仅加固模式(推荐):仅支持通过加固模式查看实例元数据,普通模式无法访问实例元数据。
API接口方式
通过API接口ModifyInstanceMetadataOptions修改元数据信息时,通过
HttpTokens
参数设置实例元数据访问模式。该参数取值范围:optional
:默认不强制使用加固模式,支持通过普通模式或加固模式访问实例元数据。required
:强制使用加固模式,即仅加固模式。设置该取值后,普通模式无法访问实例元数据。
限制RAM用户仅能通过加固模式获取实例元数据
阿里云账号可以通过以下权限策略,实现所有RAM用户(子账号)在通过API接口RunInstances、CreateInstance创建实例或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]/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]/ipv4-prefixes | 网卡分配的私网IPv4前缀列表。 | 192.168.XX.XX/28 |
network/interfaces/macs/[mac]/ipv6-prefixes | 网卡分配的IPv6前缀列表。 | 2001:db8:1234:1a00:XXXX::/80 |
disks/ | 云盘序列号。 | bp131n0q38u3a4zi**** |
disks/[disk-serial]/id | 云盘ID。 | d-bp131n0q38u3a4zi**** |
disks/[disk-serial]/name | 云盘名称。 | testDiskName |
private-ipv4 | 实例主网卡的私网IPv4地址。 | 192.168.XX.XX |
public-ipv4 | 实例主网卡的公网IPv4地址。 | 120.55.XX.XX |
eipv4 | 该实例元数据项用于获取以下信息:
| 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角色,则 |
|
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 |