本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
运行于ECS实例的应用,可通过元数据服务动态查询实例ID、IP等实例元数据信息,避免硬编码。为防范SSRF攻击导致元数据泄露,建议通过加固模式访问元数据(需先获取访问令牌),并配置实例仅允许加固模式访问,以有效规避普通模式下的安全风险。
获取实例元数据
实例元数据是实例自身属性的集合,包含实例ID、网络环境、凭证等关键属性。
方式一:加固模式(推荐)
通过加固模式访问元数据时,需先获取临时访问令牌(Token),然后携带令牌获取元数据。
Linux
登录实例。
获取临时令牌(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(秒)
携带令牌(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
登录实例。
获取临时令牌(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(秒)。
携带令牌(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
在通过RunInstances或CreateInstance创建实例时,可通过配置HttpEndpoint=enabled
和HttpTokens=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
在通过RunInstances或CreateInstance创建实例时,通过配置HttpEndpoint=enabled
和HttpTokens=required
设置实例的元数据访问策略为仅加固模式。
将已有实例升级到仅加固模式
适用范围
Windows实例:不支持开启仅加固模式。强行开启将导致实例初始化异常,并影响主机名修改、KMS激活等多项关键功能。
Linux实例:支持升级,但在操作前必须完成下文所述的依赖项排查与改造。
步骤一:排查并升级代码及依赖项
在切换到仅加固模式之前,实例及其中部署的应用,必须确保满足以下要求:
确保Cloud-init版本不低于23.2.2:可登录实例并执行
cloud-init --version
命令查看当前版本。若版本过低,切换仅加固模式后将导致实例启动异常,请先升级Cloud-init版本到23.2.2或更高版本。所有应用代码/脚本已通过方式一:加固模式访问实例元数据。
重要若应用代码依赖Credentials库获取STS Token配置SDK,需将Credentials依赖升级至支持加固模式的版本。
升级完成后,可如何检测ECS实例是否存在普通模式的元数据访问?,在确定不存在普通模式访问后,开启实例的仅加固模式。
步骤二:切换到仅加固模式
控制台
进入ECS控制台-实例,选择地域与资源组。
在操作列单击
。开启是否启用实例元数据访问通道开关,并设置实例元数据访问模式为仅加固模式,然后单击确定。
CLI
调用ModifyInstanceMetadataOptions,设置HttpEndpoint=enabled
、HttpTokens=required
切换实例元数据访问模式为仅加固模式。命令示例:
aliyun ecs ModifyInstanceMetadataOptions \
--region cn-hangzhou \
--RegionId 'cn-hangzhou' \
--InstanceId 'i-bp1******ke' \
--HttpEndpoint enabled \
--HttpTokens required
API
调用ModifyInstanceMetadataOptions,设置HttpEndpoint=enabled
、HttpTokens=required
切换实例元数据访问模式为仅加固模式。
切换完成后,建议持续监控实例的元数据访问情况和应用运行状态,确保业务平稳运行,避免因遗漏改造的应用而导致服务中断。若出现异常,建议先切换回普通模式和加固模式,优先恢复业务,然后重新进一步步骤一:排查并升级代码及依赖项。
实例元数据明细
分类 | 元数据 | 说明 | 示例 |
实例基本信息 |
| 实例ID。 |
|
| 实例名称。 |
| |
| 实例的主机名。 |
| |
| 实例规格。 |
| |
| 实例所对应的序列号。 |
| |
| 实例所属地域ID。 |
| |
| 实例所属可用区。 |
| |
| 实例拥有者的阿里云账号ID。 |
| |
镜像信息 |
| 创建实例时所使用的镜像ID。 |
|
| 云市场镜像的商品码。 |
| |
| 云市场镜像的计费方式。 |
| |
| 镜像库地址,主要为yum源或者apt源,供Linux实例的包管理软件获取更新。 |
| |
基础网络配置 |
| 网络类型,只支持VPC类型实例。 |
|
| 实例所属VPC ID。 |
| |
| 实例所属VPC CIDR段。 |
| |
| 实例所属虚拟交换机ID。 |
| |
| 实例所属虚拟交换机CIDR段。 |
| |
| 实例规格的出方向内网最大带宽。单位:Kbit/s。 |
| |
| 实例的DNS配置。 |
| |
| NTP服务器地址。 |
| |
主网卡IP地址 |
| 实例的MAC地址,如果实例存在多个网卡,则只显示eth0上的MAC地址。 |
|
| 实例主网卡的私网IPv4地址。 |
| |
| 实例主网卡的公网IPv4地址。 |
| |
| 获取实例的固定公网IPv4地址或主网卡挂载的弹性公网IPv4地址。 |
| |
弹性网卡详细信息 |
| 网卡的标识ID。 [mac]参数需要替换为实例的MAC地址(可通过元数据mac获取),下同。 |
|
| 网卡所属的VPC ID。 |
| |
| 网卡所属的虚拟交换机ID。 |
| |
| 网卡主私有IP地址。 |
| |
| 网卡分配的私网IPv4地址列表。 |
| |
| 网卡分配的私网IPv4前缀列表。 |
| |
| 网卡对应的子网掩码。 |
| |
| 网卡对应的IPv4网关地址。 |
| |
| 网卡所属的虚拟交换机IPv4 CIDR段。 |
| |
| 网卡所属的VPC IPv4 CIDR段。 |
| |
| 网卡分配的IPv6地址列表,仅支持已配置了IPv6的VPC类型实例。 |
| |
| 网卡分配的IPv6前缀列表。 |
| |
| 网卡所属的VPC的IPv6网关地址。 |
| |
| 网卡所属的虚拟交换机IPv6 CIDR段,仅支持已配置了IPv6的VPC类型实例。 |
| |
| 网卡所属的VPC IPv6 CIDR段,仅支持已配置了IPv6的VPC类型实例。 |
| |
云盘信息 |
| 云盘序列号。 |
|
| 云盘ID。 |
| |
| 云盘名称。 |
| |
安全与凭证 |
| 公有密钥。仅在实例启动时提供了公有密钥的情况下可用。 |
|
| 与实例关联的RAM角色的临时安全凭证。[role-name]需替换为角色名称。凭证在Expiration字段指定时间后失效,需重新调用接口获取。 |
| |
实例高级属性 |
| ECS虚拟化方案,支持Virt 1.0和Virt 2.0。 |
|
| 内部Build号。 |
| |
| 抢占式实例的操作系统设置的停机释放时间,时区标准为UTC+0,格式为yyyy-MM-ddThh:mm:ssZ。 |
| |
Windows特定配置 |
| Windows实例的KMS激活服务器。 |
|
| Windows实例的更新服务器。 |
| |
| Windows实例的更新状态监控服务器。 |
|
常见问题
什么是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实例时,若发现无法选择或启用仅加固模式,这通常意味着该镜像尚未满足支持此安全特性的必要条件。需参考以下流程对镜像进行升级:
创建临时实例:使用需升级的自定义镜像,创建一个用于诊断改造的临时ECS实例。
改造临时实例:在第一步创建的临时实例上,参考将已有实例升级到仅加固模式完成以下改造:
升级 Cloud-init:将其升级到 23.2.2 或更高版本。
改造应用/脚本:修改所有依赖“普通模式”的应用或脚本,使其适配“加固模式”。
创建新镜像并修改属性:改造完成后,基于这台实例创建新版自定义镜像。然后调用ModifyImageAttribute调整镜像属性
Features.ImdsSupport=v2
。释放资源:新镜像制作完成后,及时释放用于诊断和改造的临时实例,以节省成本。
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元数据监控,可以快速确认近期实例是否存在普通模式的访问。
进入云监控控制台。
在左侧导航栏选择
页面,搜索并进入ECS元数据监控页面。查看目标实例的普通模式访问成功次数指标。
若该指标值不为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
操作步骤
安装并启用云助手插件
登录ECS实例,执行以下命令安装并启动监控服务,启用后会占用部分实例性能。
# 部署监控服务 sudo acs-plugin-manager --exec --plugin ACS-ECS-ImdsPacketAnalyzer # 查看监控服务状态 sudo systemctl status imds_tracer_tool
定位问题进程 运行命令,查看哪些进程仍在以普通模式访问元数据。日志会显示相关进程的PID。
cat /var/log/imds/imds-trace.* | grep WARNING
分析并改造 根据日志中的PID,找到对应的应用程序或脚本,并对其进行升级改造,通过加固模式访问元数据。