需要将边缘节点服务 ENS 或协同存储 EOS 的资源访问权限授予他人时,可以使用阿里云安全令牌服务 STS(Security Token Service)生成临时安全凭证,避免共享长期 AccessKey 带来的安全风险。
应用场景
以下场景适合使用 STS 临时凭证访问 ENS 和 EOS 资源:
应用需要代表用户访问 ENS/EOS 资源,但不适合将长期 AccessKey 嵌入应用。
需要为第三方合作伙伴提供有时效限制的资源访问权限。
服务架构要求遵循最小权限原则,使用临时凭证替代永久凭证。
方案说明
整个流程包含以下环节:
创建 RAM 用户进行后续RAM角色扮演。
创建 RAM 角色作为临时凭证的载体。
为 RAM 角色附加 ENS 或 EOS 的权限策略,定义临时凭证的操作范围。
RAM 用户调用 STS AssumeRole 接口,获取包含临时 AccessKeyId、AccessKeySecret 和 SecurityToken 的凭证。
使用临时凭证初始化 ENS 或 EOS SDK 客户端,调用对应 API。
临时凭证具有时效性和权限受限的特点,即使意外泄露也能将安全风险降到最低。
前提条件
已注册阿里云账号并完成实名认证。
已开通边缘节点服务 ENS。如需访问协同存储 EOS 资源,还需开通 EOS 服务。
已了解 RAM 的基本概念。
如使用 CLI 方式调用 STS,已安装并配置阿里云 CLI;如使用 SDK 方式,已安装对应语言的阿里云 SDK。
步骤一:创建RAM用户
进入 RAM 控制台用户管理页面。
单击创建用户。
填写登录名称,并勾选使用控制台访问和使用永久AccessKey访问,按照控制台指示填写登录信息等单击确认。
在用户确认页面,勾选刚创建的用户,然后单击新增授权,搜索添加下述权限策略后确认授权:
AliyunENSFullAccess:ENS 产品的读写策略,具有 ENS 产品下所有服务的操作权限
AliyunENSEOSFullAccess:ENS 边缘协同存储服务的读写权限,仅可操作 ENS 协同存储服务
AliyunSTSAssumeRoleAccess:调用STS服务AssumeRole接口的权限
步骤二:创建 RAM 角色
进入 RAM 控制台角色管理页面。
单击创建角色。
选择可信实体类型为云账号,并选择信任的云账号:
如果是当前账号自身调用 STS,选择当前云账号。
如果是其他云账号调用 STS 来扮演该角色,选择其他云账号并填入对方账号 ID。
单击确定,填写角色名称,例如
EnsStsRole,单击确定。页面返回角色列表并显示新创建的角色名称。记录角色 ARN(格式:
acs:ram::<AccountId>:role/<RoleName>),后续调用 AssumeRole 时需要使用。
步骤三:为 RAM 角色授予 ENS/EOS 权限
为创建的 RAM 角色附加 ENS 或 EOS 的权限策略,控制临时凭证能执行的操作范围。
在 RAM 控制台左侧导航栏选择身份管理 > 角色。
找到步骤一创建的角色(如
EnsStsRole),单击角色名称进入详情页。在权限管理页签,单击新增授权。
搜索添加下述权限策略后确认授权:
AliyunENSFullAccess:ENS 产品的读写策略,具有 ENS 产品下所有服务的操作权限
AliyunENSEOSFullAccess:ENS 边缘协同存储服务的读写权限,仅可操作 ENS 协同存储服务
AliyunSTSAssumeRoleAccess:调用STS服务AssumeRole接口的权限
步骤四:调用 AssumeRole 获取临时凭证
使用步骤一中创建的 RAM 用户调用 STS AssumeRole 接口,获取临时安全凭证。
填写以下参数后单击发起调用:
RoleArn:填写要扮演的RAM角色ARN,即步骤二中获得的格式为
acs:ram::<AccountId>:role/<RoleName>的内容RoleSessionName:填写会话名称,如
test
调用后即可获得临时凭证,关键的返回参数可参考:
参数
说明
SecurityToken
临时安全令牌
AccessKeyId
临时访问密钥 ID
AccessKeySecret
临时访问密钥 Secret
Expiration
凭证过期时间(UTC 格式)
步骤五:使用临时凭证调用 ENS/EOS API
获取临时凭证后,使用临时 AccessKeyId、AccessKeySecret 和 SecurityToken 初始化 ENS 或 EOS 的 SDK 客户端,即可调用对应 API。
使用CLI示例
在您本机的终端中执行:
aliyun configure --profile StsProfile --mode StsToken # 交互式配置按提示输入STS的Access Key Id(对应AccessKeyId)、Access key Secret(对应AccessKeySecret)、Sts Token(对应SecurityToken),其它参数可为空。显示如下界面即为安装成功:
参考PrepareUpload调用EOS接口,进行EOS管理:
输入对应的bucket名,查看EOS的Bucket信息。
aliyun ens GetBucketInfo --BucketName BUCKET_NAME输入对应的bucket名,查看Object信息。
aliyun ens ListObjects --BucketName BUCKET_NAME获取当前的上传地址并上传。
aliyun ens PrepareUpload --BucketName BUCKET_NAME --ClientIp 'CLIENT_IP'获取到地址后,正常使用命令上传即可查看对应的bucket有无对应文件
凭证刷新策略
STS 临时凭证默认有效期为 3600 秒(1 小时),最短 900 秒(15 分钟)。生产环境下,建议凭证过期前主动刷新:
定时刷新:凭证到期前 5~10 分钟重新调用 AssumeRole 获取新凭证。
使用 Credentials 工具:阿里云 SDK 提供了自动刷新凭证的 Credentials 工具,推荐用于生产环境。
Credentials 自动刷新示例(Python)
以下示例使用 Credentials 工具创建自动刷新的凭证客户端。获取 cred_client 后,将其作为 credential 参数传入 open_api_models.Config 初始化 ENS 或 EOS 客户端,替代步骤五中手动指定的临时凭证参数,SDK 将自动完成凭证到期前的刷新。
import os
from alibabacloud_credentials.client import Client as CredClient
from alibabacloud_credentials import models as cred_models
cred_config = cred_models.Config(
type='ram_role_arn',
access_key_id=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_ID'),
access_key_secret=os.environ.get('ALIBABA_CLOUD_ACCESS_KEY_SECRET'),
role_arn='acs:ram::<AccountId>:role/ensstsrole',
role_session_name='ens-auto-session'
)
cred_client = CredClient(cred_config)
# SDK 自动在凭证过期前刷新,无需手动管理安全建议
遵循最小权限原则:为 RAM 角色仅授予业务所需的最小权限,避免使用 FullAccess 策略。
设置合理的凭证有效期:根据业务操作时长设置 DurationSeconds,避免凭证有效期过长。
使用环境变量存储 AccessKey:避免将 AccessKey 硬编码到代码,推荐使用环境变量或阿里云密钥管理服务 KMS。
配置角色信任策略:限制可以扮演该角色的 RAM 用户范围,避免任意用户都能获取临时凭证。
开启操作审计:通过操作审计(ActionTrail)记录 STS 调用日志,便于安全审计。
常见问题
Q:调用 AssumeRole 报错 "NoPermission"
确认调用 AssumeRole 的 RAM 用户已授予 AliyunSTSAssumeRoleAccess 权限策略,且 RAM 角色的信任策略中包含该用户所属的云账号。
Q:使用临时凭证调用 ENS API 报错 "InvalidSecurityToken"
可能原因:
临时凭证已过期,需重新调用 AssumeRole 获取新凭证。
请求中的 SecurityToken 与 AccessKeyId/AccessKeySecret 不匹配,确保三者来自同一次 AssumeRole 响应。
请求时间与服务器时间偏差过大,确保本地时间准确。
Q:ENS 和 EOS 需要分别获取临时凭证吗?
不需要。只要 RAM 角色同时附加了 ENS 和 EOS 的权限策略,一次 AssumeRole 获取的临时凭证即可同时调用 ENS 和 EOS 的 API。