使用安全性權杖(STS Token)可以有效避免RAM使用者AK泄漏導致的安全風險。擷取STS Token的過程較為複雜,您需要提前準備好RAM使用者、RAM角色,並授予相應的許可權,再使用RAM使用者的AK作為憑證調用AssumeRole介面扮演RAM角色,才能從STS服務擷取到STS Token。
步驟一:建立RAM使用者
建立RAM使用者,注意以下幾點:
建議您將登入名稱稱設定為vod,本文後續描述都以登入名稱稱vod為例。
訪問方式設定允許使用永久AccessKey訪問。
妥善保管擷取的AccessKey。
步驟二:為RAM使用者授予調用STS服務AssumeRole介面的許可權
在RAM控制台的使用者頁面,單擊目標RAM使用者(上述建立的vod使用者)操作列的添加許可權。
在新增授權面板,為RAM使用者添加許可權。
說明為vod使用者添加調用STS服務AssumeRole介面的權限原則AliyunSTSAssumeRoleAccess,可通過在系統策略的搜尋輸入框中輸入
AliyunSTSAssumeRoleAccess尋找。
選擇資源範圍。
帳號層級:許可權在當前阿里雲帳號內生效。
資源群組層級:許可權在指定的資源群組內生效。
重要指定資源群組授權生效的前提是該雲端服務及資源類型已支援資源群組,詳情請參見支援資源群組的雲端服務。資源群組授權樣本,請參見使用資源群組限制RAM使用者管理指定的ECS執行個體。
選擇授權主體。
授權主體即需要添加許可權的RAM使用者。系統會自動選擇當前的RAM使用者。
選擇權限原則。
權限原則是一組存取權限的集合,分為以下兩種。支援批量選中多條權限原則。
系統策略:由阿里雲建立,策略的版本更新由阿里雲維護,使用者只能使用不能修改。更多資訊,請參見支援RAM的雲端服務。
說明系統會自動標識出高風險系統策略(例如:AdministratorAccess、AliyunRAMFullAccess等),授權時,盡量避免授予不必要的高風險權限原則。
自訂策略:由使用者管理,策略的版本更新由使用者維護。使用者可以自主建立、更新和刪除自訂策略。更多資訊,請參見建立自訂權限原則。
單擊確認新增授權。
單擊關閉。
步驟三:建立RAM角色
下述步驟5中,建議您將角色名稱設定為vodrole,本文後續描述都以角色名稱vodrole為例。
使用Resource Access Management員登入RAM控制台。
在左側導覽列,選擇。
在角色頁面,單擊建立角色。

在建立角色頁面,選擇信任主體類型為雲帳號,然後設定具體的阿里雲帳號,最後單擊確定。

當前雲帳號:當您允許當前阿里雲帳號下的所有RAM使用者和RAM角色扮演當前正在建立的RAM角色時,您可以選擇當前雲帳號。
其他雲帳號:當您允許其他阿里雲帳號下的所有RAM使用者和RAM角色扮演當前正在建立的RAM角色時,您可以選擇其他雲帳號,然後輸入其他阿里雲帳號(主帳號)ID。該項主要針對跨阿里雲帳號的資源授權訪問情境,相關教程,請參見跨阿里雲帳號的資源授權。您可以在安全設定頁面查看阿里雲帳號(主帳號)ID。
(可選)如果您想設定RAM角色只能被可信阿里雲帳號下的指定RAM使用者或RAM角色扮演,您可以單擊切換編輯器,在編輯器中修改RAM角色的信任策略。
編輯器支援可視化編輯和指令碼編輯兩種模式,您可以任選其一。以下樣本表示當前建立的RAM角色只能被當前阿里雲帳號(AccountID=100******0719)下的RAM使用者
Alice扮演。可視化編輯
在主體中指定具體的RAM使用者名稱稱。


指令碼編輯
在
Principal的RAM欄位中指定具體的RAM使用者。{ "Version": "1", "Statement": [ { "Effect": "Allow", "Principal": { "RAM": "acs:ram::100******0719:user/Alice" }, "Action": "sts:AssumeRole" } ] }
在建立角色對話方塊,輸入角色名稱,然後單擊確定。
步驟四:為RAM角色授予管理VOD的許可權
在RAM控制台的角色頁面,單擊目標RAM角色(上述建立的vodrole角色)操作列的新增授權。
在新增授權面板,為RAM角色添加許可權。
說明為控制風險,建議採用最小許可權。
如需vodrole角色可以訪問和管理ApsaraVideo for VOD的資源,則建議為vodrole角色添加可以管理和操作ApsaraVideo for VOD所有資源的系統策略許可權AliyunVODFullAccess,可通過在系統策略的搜尋輸入框中輸入
AliyunVODFullAccess尋找,更多有關ApsaraVideo for VOD系統策略的定義及許可權資訊請參見系統授權策略。

選擇資源範圍。
帳號層級:許可權在當前阿里雲帳號內生效。
資源群組層級:許可權在指定的資源群組內生效。
重要指定資源群組授權生效的前提是該雲端服務及資源類型已支援資源群組,詳情請參見支援資源群組的雲端服務。資源群組授權樣本,請參見使用資源群組限制RAM使用者管理指定的ECS執行個體。
選擇授權主體。
授權主體即需要添加許可權的RAM使用者。系統會自動選擇當前的RAM使用者。
選擇權限原則。
權限原則是一組存取權限的集合,分為以下兩種。支援批量選中多條權限原則。
系統策略:由阿里雲建立,策略的版本更新由阿里雲維護,使用者只能使用不能修改。更多資訊,請參見支援RAM的雲端服務。
說明系統會自動標識出高風險系統策略(例如:AdministratorAccess、AliyunRAMFullAccess等),授權時,盡量避免授予不必要的高風險權限原則。
自訂策略:由使用者管理,策略的版本更新由使用者維護。使用者可以自主建立、更新和刪除自訂策略。更多資訊,請參見建立自訂權限原則。
單擊確認新增授權。
完成授權後,會產生一條授權成功的記錄。

單擊關閉。
步驟五:扮演RAM角色並擷取STS Token
使用RAM使用者調用STS APIAssumeRole - 擷取扮演角色的臨時身份憑證獲得RAM角色的安全性權杖(STS Token)。您可以直接使用STS Token訪問點播服務API,也可將STS Token下發到用戶端完成用戶端直傳等操作。本文提供Java SDK樣本,更多語言樣本請參考STS SDK概覽。
V1.0 SDK
在Maven中添加如下依賴資訊:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-sts</artifactId>
<version>3.1.2</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.7.3</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-vod</artifactId>
<version>2.16.32</version>
</dependency>package pop;
import com.aliyuncs.DefaultAcsClient;
import com.aliyuncs.exceptions.ClientException;
import com.aliyuncs.http.MethodType;
import com.aliyuncs.profile.DefaultProfile;
import com.aliyuncs.profile.IClientProfile;
import com.aliyuncs.sts.model.v20150401.AssumeRoleRequest;
import com.aliyuncs.sts.model.v20150401.AssumeRoleResponse;
public class TestStsService {
public static void main(String[] args) {
// 從環境變數中擷取步驟一產生的RAM使用者的存取金鑰(AccessKey ID和AccessKey Secret)。
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// AssumeRole API 請求參數:RoleArn, RoleSessionName, Policy, and DurationSeconds
// RoleArn需要通過步驟三在RAM控制台上擷取
String roleArn = "<role-arn>";
// RoleSessionName 角色會話名稱,自訂參數
String roleSessionName = "session-name";
// 定製你的policy
String policy = "{\n" +
" \"Version\": \"1\",\n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": \"vod:*\",\n" +
" \"Resource\": \"*\",\n" +
" \"Effect\": \"Allow\"\n" +
" }\n" +
" ]\n" +
"}";
try {
AssumeRoleResponse response = assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName, policy);
System.out.println("Expiration: " + response.getCredentials().getExpiration());
System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
System.out.println("RequestId: " + response.getRequestId());
} catch (ClientException e) {
System.out.println("Failed to get a token.");
System.out.println("Error code: " + e.getErrCode());
System.out.println("Error message: " + e.getErrMsg());
}
}
static AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret, String roleArn, String roleSessionName, String policy) throws ClientException {
try {
//構造default profile(參數留空,無需添加Region ID)
/*
說明:當設定SysEndpoint為sts.aliyuncs.com時,regionId可填可不填;反之,regionId必填,根據使用的服務地區填寫,例如:cn-shanghai
詳情參考STS各地區的Endpoint。
*/
IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
//用profile構造client
DefaultAcsClient client = new DefaultAcsClient(profile);
// 建立一個 AssumeRoleRequest 並佈建要求參數
final AssumeRoleRequest request = new AssumeRoleRequest();
request.setSysEndpoint("sts.aliyuncs.com");
request.setSysMethod(MethodType.POST);
request.setRoleArn(roleArn);
request.setRoleSessionName(roleSessionName);
request.setPolicy(policy);
// 發起請求,並得到response
final AssumeRoleResponse response = client.getAcsResponse(request);
return response;
} catch (ClientException e) {
throw e;
}
}
}V2.0 SDK
在Maven中添加如下依賴資訊:
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>sts20150401</artifactId>
<version>1.1.7</version>
</dependency>
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>vod20170321</artifactId>
<version>3.6.4</version>
</dependency>import com.aliyun.sts20150401.Client;
import com.aliyun.sts20150401.models.AssumeRoleRequest;
import com.aliyun.sts20150401.models.AssumeRoleResponse;
import com.aliyun.sts20150401.models.AssumeRoleResponseBody;
import com.aliyun.teaopenapi.models.Config;
import com.aliyun.teautil.models.RuntimeOptions;
public class TestStsService {
public static void main(String[] args) {
// 從環境變數中擷取步驟一產生的RAM使用者的存取金鑰(AccessKey ID和AccessKey Secret)。
String accessKeyId = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID");
String accessKeySecret = System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET");
// AssumeRole API 請求參數:RoleArn, RoleSessionName, Policy, and DurationSeconds
// RoleArn需要通過步驟三在RAM控制台上擷取
String roleArn = "<role-arn>";
// RoleSessionName 角色會話名稱,自訂參數
String roleSessionName = "session-name";
// 定製你的policy
String policy = "{\n" +
" \"Version\": \"1\",\n" +
" \"Statement\": [\n" +
" {\n" +
" \"Action\": \"vod:*\",\n" +
" \"Resource\": \"*\",\n" +
" \"Effect\": \"Allow\"\n" +
" }\n" +
" ]\n" +
"}";
try {
AssumeRoleResponse assumeRoleResponse = assumeRole(accessKeyId, accessKeySecret, roleArn, roleSessionName, policy);
System.out.println("Expiration: " + response.getCredentials().getExpiration());
System.out.println("Access Key Id: " + response.getCredentials().getAccessKeyId());
System.out.println("Access Key Secret: " + response.getCredentials().getAccessKeySecret());
System.out.println("Security Token: " + response.getCredentials().getSecurityToken());
System.out.println("RequestId: " + response.getRequestId());
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public static AssumeRoleResponse assumeRole(String accessKeyId, String accessKeySecret, String roleArn, String roleSessionName, String policy) throws Exception {
Config config = new Config()
// 從環境變數中擷取AccessKey ID的值
.setAccessKeyId(accessKeyId)
// 從環境變數中擷取AccessKey Secret的值
.setAccessKeySecret(accessKeySecret);
config.endpoint = "sts.cn-hangzhou.aliyuncs.com";
Client client = new Client(config);
AssumeRoleRequest assumeRoleRequest = new AssumeRoleRequest()
.setRoleArn(roleArn)
.setRoleSessionName(roleSessionName)
.setPolicy(policy);
RuntimeOptions runtime = new RuntimeOptions();
return client.assumeRoleWithOptions(assumeRoleRequest, runtime);
}
}