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]/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/ | 云盤序列號。 | 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 |
常見問題
請確認命令是否正確。常見錯誤命令如下:
元數據服務器訪問憑證的有效期超出范圍(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/