本文主要介紹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,或者使用的是主賬號。