ECS实例元数据是指实例ID、VPC信息、网卡信息等实例属性信息,支持在ECS实例内部通过访问元数据服务(Metadata Service)获取。通过该获取方式,您无需登录控制台或调用API,在实例内部即可访问实例信息,可以更便捷、安全地配置或管理正在运行的实例或实例上的程序。
实例元数据内容列表
元数据服务支持获取主机名(hostname)、实例规格、实例名称、镜像ID等信息,展开下方表格查看所有元数据。
元数据访问模式说明
元数据访问模式有普通模式和加固模式两种方式,其访问方式见获取实例元数据。两种模式对比见下表。
推荐您使用加固模式来访问实例元数据。因为普通模式是通过IP地址鉴权,这意味着攻击者可以伪造请求的源IP地址,绕过IP地址鉴权,进行SSRF攻击,造成实例元数据信息泄露风险。
使用加固模式访问需确保实例的cloud-init版本为23.2.2及以上。如果已有实例的cloud-init版本不满足要求,您可以升级cloud-init版本,从而支持加固模式。检查cloud-init版本及升级方法,请参见安装cloud-init。
访问模式对比
对比项 | 普通模式 | 加固模式 |
对比项 | 普通模式 | 加固模式 |
交互方式 | 请求/响应 | 会话 |
鉴权方式 | 同VPC内源IP地址鉴权 | 同VPC内源IP地址鉴权+实例元数据访问凭证鉴权 该访问凭证具有以下特点:
|
查看方法 | 无需任何访问凭证即可通过命令直接访问endpoint | 需要先获取元数据访问凭证进行鉴权,再访问endpoint,提高了元数据访问的安全性 |
安全级别 | 较低 请求通过IP地址鉴权,意味着攻击者可以伪造请求的源IP地址,绕过IP地址鉴权,进行SSRF攻击,造成实例元数据信息泄露风险。 | 较高 访问元数据之前,必须先获取有效的元数据访问凭证进行身份验证和授权,该访问凭证只能在ECS实例内部生成,在特定的ECS实例上使用,且具有时效性,攻击者难以通过猜测或伪造的方式生成,可以防范大多数SSRF攻击。 |
通过不同模式获取实例元数据
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>
:需替换为具体要查询的实例元数据,详情请参见实例元数据内容列表。
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>
:需替换为具体要查询的实例元数据,可查阅实例元数据内容列表。
ECS实例高频访问元数据服务器获取元数据时,可能会导致限流。建议缓存数据(如RAM凭证)并在过期前刷新。
设置强制加固模式获取实例元数据
为了进一步增强安全性,阿里云支持您设置实例元数据访问模式为仅加固模式(强制加固模式)。设置后,普通模式访问的流量会被拒绝,以防范普通模式访问可能带来的大多数SSRF相关风险。以下为您详细说明两种场景下设置的具体方法。
新创建ECS实例时设置强制加固模式
在实例购买页,展开高级选项区域,设置元数据访问模式为仅加固模式(强制加固模式)。
只有当您使用的镜像支持通过加固模式访问元数据时,在购买ECS实例页面可以选择仅加固模式。
如果您在控制台创建实例时无法选到仅加固模式,则可以先创建实例,然后将cloud-init版本升级到23.2.2及以上,再为已有实例设置强制加固模式。
阿里云最新发布的部分公共镜像已支持通过加固模式访问(指镜像包含的cloud-init版本满足23.2.2及以上)。您可以通过 DescribeImages - 查询可以使用的镜像资源查看镜像ImdsSupport
属性,镜像ImdsSupport
属性为v2
时表示镜像支持加固模式访问元数据。
通过API接口RunInstances或CreateInstance创建实例时,设置HttpTokens
参数为required
,表示实例元数据的访问模式为仅加固模式(强制加固模式)。
只有当您使用的镜像支持通过加固模式访问元数据时,调用上述接口创建实例时才能启动成功。
如果启动失败,则可以先设置HttpTokens
参数为optional
启动实例,然后将cloud-init版本升级到23.2.2及以上,再为已有实例设置强制加固模式。
阿里云最新发布的部分公共镜像已支持通过加固模式访问(指镜像包含的cloud-init版本满足23.2.2及以上)。您可以通过 DescribeImages - 查询可以使用的镜像资源查看镜像ImdsSupport
属性,镜像ImdsSupport
属性为v2
时表示镜像支持加固模式访问元数据。
为已有实例设置强制加固模式
对于已经部署业务的ECS实例,设置强制加固模式会导致原来使用普通模式访问元数据的请求被拒绝。建议您修改应用代码为加固模式访问后,确保ECS实例不存在普通访问模式,再将实例元数据访问模式设置为强制加固模式。
步骤一:修改应用代码为加固模式访问
定位出哪些实例需要修改为加固模式。
在云监控控制台的 页面,搜索ECS元数据。排查出监控图表中普通模式访问成功次数大于0的ECS实例,表示当前实例内存在应用使用普通模式访问元数据服务,这些ECS实例需要切换为强制加固模式。为了保证数据准确,建议您设置查看时长为14天或者更长。
确保上述定位出来的实例cloud-init版本为23.2.2及以上。如果已有实例的cloud-init版本不满足要求,您可以升级cloud-init版本,从而支持加固模式。检查cloud-init版本及升级方法,请参见安装cloud-init。
修改应用代码,先获取元数据访问凭证Token,再将Token设置到请求头中获取元数据,详情请参见通过加固模式获取实例元数据。
确保代码不存在普通访问模式。
在云监控控制台的ECS元数据页面,待需要切换访问模式的ECS实例监控图表中普通模式访问成功次数显示为暂无数据(表示次数为0),您就可以执行步骤二。否则可能导致切换到强制加固模式后普通访问被拒绝,造成业务影响。为了保证数据准确,建议您设置查看时长为14天或者更长。
步骤二:设置实例元数据访问模式为强制加固模式
在页面左侧顶部,选择目标资源所在的资源组和地域。
找到目标实例,进入实例详情页,点击全部操作,搜索 修改实例元数据访问信息。
开启是否启用实例元数据访问通道开关,并设置实例元数据访问模式为仅加固模式。
您可以使用DescribeInstances接口查询HttpTokens
(访问实例元数据时是否强制使用加固模式)选择optional
筛选出哪些实例的应用还在使用普通模式访问元数据。
通过API接口ModifyInstanceMetadataOptions修改实例元数据访问模式,设置HttpTokens
为required
(强制加固模式)。
为了避免设置为强制加固模式后普通访问模式失败造成业务影响,您可以借助云监控控制台配置告警,提醒您普通模式被拒绝。如果设置为强制加固模式后存在普通模式被拒绝,需要先将实例切换回兼容普通模式和加固模式,然后确保ECS实例不存在普通访问模式后再重新设置。