本文主要介绍RAM角色(STS用户)背景信息、基本概念、如何创建RAM角色及RAM角色授权。
背景信息
在使用5G互联平台产品时,如果有跨账号使用和临时使用的场景,可以通过创建RAM角色(STS用户)来实现,且RAM角色具有一定的规避风险的能力:
使用STS Token,减少长期访问密钥(Accesskey)泄露的风险。
STS Token具有时效性,可以自定义有效期,到期后将自动失效,无需定期轮换。
可以为STS Token绑定自定义权限策略,提供更加灵活和精细的云资源授权。
基本概念
RAM角色(STS用户)是一种虚拟用户,没有确定的身份认证密钥,需要被一个受信的实体用户扮演才能正常使用,根据可信实体的不同,支持三种类型的角色:阿里云账号、阿里云服务、身份提供商。
根据产品的特性,我们推荐使用信任阿里云账号的方式进行使用。扮演的阿里云账号可以是属于自己的账号,也可以是其他账号(解决跨账号问题),同时可以通过令牌来解决临时使用的问题。
创建RAM角色
使用阿里云主账号,或具有管理员权限的RAM用户、RAM角色登录RAM控制台;
单击左侧导航栏的角色,在角色页面单击创建角色,类型选择阿里云账号,单击下一步;
输入角色名称和备注之后,选择信任的云账号,单击完成。
RAM角色授权
首先需要创建一个RAM用户,并对该用户授予创建STS令牌的权限。
创建RAM用户。
在权限策略中对该RAM用户授权系统策略,AliyunSTSAssumeRoleAccess。
获取STS令牌
获取令牌的方式为SDK的方式获取。获取令牌时,也获取到了该RAM角色的AccessKeyId和AccessKeySecret。
前提条件:
创建RAM用户,且创建了该RAM用户的AccessKey;
对该RAM用户授权AliyunSTSAssumeRoleAccess。
获取步骤:
首先在项目的pom.xml文件中加入如下依赖项:
<dependencies>
<dependency>
<groupId>com.alibaba.fastjson2</groupId>
<artifactId>fastjson2</artifactId>
<version>2.0.12</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-sts</artifactId>
<version>3.0.0</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.4.6</version>
</dependency>
</dependencies>
JAVA SDK 实例:
import com.alibaba.fastjson2.JSON;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.IAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.exceptions.ServerException;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.sts.model.v20150401.*;
public class STS {
public static void main(String[] args) {
//构建一个阿里云客户端,用于发起请求。
//构建阿里云客户端时需要设置AccessKey ID和AccessKey Secret。
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", "<accessKeyId>", "<accessSecret>");
IAcsClient client = new DefaultAcsClient(profile);
//构造请求,设置参数。
AssumeRoleRequest request = new AssumeRoleRequest();
request.setRegionId("cn-hangzhou");
request.setRoleArn("<RoleArn>");
request.setRoleSessionName("<RoleSessionName>");
request.setDurationSeconds(1800L);//设置令牌可使用时长(单位:秒),不能超过控制台设置的最大会话时间
//发起请求,并得到响应。
try {
AssumeRoleResponse response = client.getAcsResponse(request);
System.out.println(JSON.toJSONString(response));
} catch (ServerException e) {
e.printStackTrace();
} catch (ClientException e) {
System.out.println("ErrCode:" + e.getErrCode());
System.out.println("ErrMsg:" + e.getErrMsg());
System.out.println("RequestId:" + e.getRequestId());
}
}
}
RoleArn获取方式为:在RAM访问控制台,单击创建的角色名称可查看详情,详情中有ARN,格式为:acs:ram::<阿里云主账号ID>:role/<角色名>
关于令牌生效时长:在RAM访问控制台,单击创建的角色名称可查看详情,详情中有最大会话时间,设置的时间范围为3600~43200 秒,默认为3600秒,在获取STS token时,DurationSeconds可以配置的范围为900~最大会话时间,如果超出该范围,则会提示【The Min/Max value of DurationSeconds is 15min/1hr.】
如果在通过SDK的方式获取STS令牌时报如下提示:
ErrCode:NoPermission
ErrMsg:You are not authorized to do this action. You should be authorized by RAM.
原因在于没有给RAM用户授权AliyunSTSAssumeRoleAccess,或者使用的是主账号。