使用STS臨時授權可以有效避免RAM使用者密碼泄露導致的安全風險,本文介紹如何使用STS臨時授權方案上傳視頻。
步驟一:建立RAM使用者
下述步驟4中,建議您將登入名稱稱設定為vod,本文後續描述都以登入名稱稱vod為例。
下述步驟5中,建議您訪問方式選擇OpenAPI調用訪問方式。
使用阿里雲帳號(主帳號)或Resource Access Management員登入RAM控制台。
在左側導覽列,選擇 。
在使用者頁面,單擊建立使用者。
在建立使用者頁面的使用者帳號資訊地區,設定使用者基本資料。
登入名稱稱:可包含英文字母、數字、半形句號(.)、短劃線(-)和底線(_),最多64個字元。
顯示名稱:最多包含128個字元或漢字。
標籤:單擊,然後輸入標籤鍵和標籤值。為RAM使用者綁定標籤,便於後續基於標籤的使用者管理。
說明單擊添加使用者,可以大量建立多個RAM使用者。
在訪問方式地區,選擇訪問方式,然後設定對應參數。
為了帳號安全,建議您只選擇以下訪問方式中的一種,將人員使用者和應用程式使用者分離,避免混用。
控制台訪問
如果RAM使用者代表人員,建議啟用控制台訪問,使用使用者名稱和登入密碼訪問阿里雲。您需要設定以下參數:
控制台登入密碼:選擇自動產生密碼或者自訂密碼。自訂登入密碼時,密碼必須滿足密碼複雜度規則。更多資訊,請參見設定RAM使用者密碼強度。
密碼重設策略:選擇RAM使用者在下次登入時是否需要重設密碼。
多因素認證(MFA)策略:選擇是否為當前RAM使用者啟用MFA。啟用MFA後,主帳號還需要為RAM使用者綁定MFA裝置或RAM使用者自行綁定MFA裝置。更多資訊,請參見為RAM使用者綁定MFA裝置。
OpenAPI調用訪問
如果RAM使用者代表應用程式,建議啟用OpenAPI調用訪問,使用存取金鑰(AccessKey)訪問阿里雲。啟用後,系統會自動為RAM使用者產生一個AccessKey ID和AccessKey Secret。更多資訊,請參見建立AccessKey。
重要RAM使用者的AccessKey Secret只在建立時顯示,不支援查看,請妥善保管。
單擊確定。
根據介面提示,完成安全驗證。
步驟二:為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角色時,您可以選擇其他雲帳號,然後輸入其他阿里雲帳號(主帳號)ID。該項主要針對跨阿里雲帳號的資源授權訪問情境,相關教程,請參見跨阿里雲帳號的資源授權。
您可以在安全設定頁面查看阿里雲帳號(主帳號)ID。
重要如果您僅允許指定的RAM使用者扮演該RAM角色,而不是阿里雲帳號(主帳號)下的所有RAM使用者,您可以採取以下兩種方式:
修改RAM角色的信任策略。具體操作,請參見樣本一:修改RAM角色的可信實體為阿里雲帳號。
修改RAM使用者的角色扮演權限原則。具體操作,請參見能否指定RAM使用者具體可以扮演哪個RAM角色?。
單擊完成。
單擊關閉。
步驟四:為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等),授權時,盡量避免授予不必要的高風險權限原則。
自訂策略:由使用者管理,策略的版本更新由使用者維護。使用者可以自主建立、更新和刪除自訂策略。更多資訊,請參見建立自訂權限原則。
單擊確認新增授權。
完成授權後,會產生一條授權成功的記錄。
單擊關閉。
步驟五:通過STS授權訪問ApsaraVideo for VOD
本文僅介紹通過調用API扮演RAM角色擷取並使用安全性權杖(STS Token)訪問ApsaraVideo for VOD的方法。
使用建立的RAM使用者調用STS APIAssumeRole - 擷取扮演角色的臨時身份憑證獲得RAM角色的安全性權杖(STS Token),並使用安全性權杖訪問ApsaraVideo for VODAPI。
本文僅提供Java語言擷取STS臨時Token的程式碼範例,有關STS SDK的整合及其他語言的使用說明請參見STS SDK概覽。
Java程式碼範例
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;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoRequest;
import com.aliyuncs.vod.model.v20170321.CreateUploadVideoResponse;
/**
* @author jack
* @date 2020/5/25
*/
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());
createUploadVideo(response.getCredentials().getAccessKeyId(), response.getCredentials().getAccessKeySecret(), response.getCredentials().getSecurityToken());
} 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;
}
}
static void createUploadVideo(String accessKeyId, String accessKeySecret, String token) {
// 點播服務所在的Region,接入服務中心為上海,則填cn-shanghai
String regionId = "cn-shanghai";
IClientProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret);
DefaultAcsClient client = new DefaultAcsClient(profile);
CreateUploadVideoRequest request = new CreateUploadVideoRequest();
request.setSecurityToken(token);
request.setTitle("t5");
request.setFileName("D:\\TestVideo\\t4.mp4");
request.setFileSize(10240L);
try {
CreateUploadVideoResponse response = client.getAcsResponse(request);
System.out.println("CreateUploadVideoRequest, " + request.getUrl());
System.out.println("CreateUploadVideoRequest, requestId:" + response.getRequestId());
System.out.println("UploadAddress, " + response.getUploadAddress());
System.out.println("UploadAuth, " + response.getUploadAuth());
System.out.println("VideoId, " + response.getVideoId());
} catch (ClientException e) {
System.out.println("action, error:" + e);
e.printStackTrace();
}
}
}