使用STS臨時授權可以有效避免RAM用戶密碼泄露導致的安全風險,本文介紹如何使用STS臨時授權方案上傳視頻。
步驟一:創建RAM用戶
下述步驟4中,建議您將登錄名稱設置為vod,本文后續描述都以登錄名稱vod為例。
下述步驟5中,建議您訪問方式選擇OpenAPI調用訪問方式。
使用阿里云賬號(主賬號)或RAM管理員登錄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角色
下述步驟5中,建議您將角色名稱設置為vodrole,本文后續描述都以角色名稱vodrole為例。
使用RAM管理員登錄RAM控制臺。
在左側導航欄,選擇 。
在角色頁面,單擊創建角色。
在創建角色頁面,選擇可信實體類型為阿里云賬號,然后單擊下一步。
設置角色信息。
輸入角色名稱。
輸入備注。
選擇信任的云賬號。
當前云賬號:當您允許當前阿里云賬號下的所有RAM用戶扮演該RAM角色時,您可以選擇當前云賬號。
其他云賬號:當您允許其他阿里云賬號下的所有RAM用戶扮演該RAM角色時,您可以選擇其他云賬號,然后輸入其他阿里云賬號(主賬號)ID。該項主要針對跨阿里云賬號的資源授權訪問場景,相關教程,請參見跨阿里云賬號的資源授權。
您可以在安全設置頁面查看阿里云賬號(主賬號)ID。
重要如果您僅允許指定的RAM用戶扮演該RAM角色,而不是阿里云賬號(主賬號)下的所有RAM用戶,您可以采取以下兩種方式:
修改RAM角色的信任策略。具體操作,請參見示例一:修改RAM角色的可信實體為阿里云賬號。
修改RAM用戶的角色扮演權限策略。具體操作,請參見能否指定RAM用戶具體可以扮演哪個RAM角色?。
單擊完成。
單擊關閉。
步驟四:為RAM角色授予管理VOD的權限
在RAM控制臺的角色頁面,單擊目標RAM角色(上述創建的vodrole角色)操作列的添加權限。
在新增授權面板,為RAM角色添加權限。
說明為控制風險,建議采用最小權限。
如需vodrole角色可以訪問和管理視頻點播的資源,則建議為vodrole角色添加可以管理和操作視頻點播所有資源的系統策略權限AliyunVODFullAccess,可通過在系統策略的搜索輸入框中輸入
AliyunVODFullAccess
查找,更多有關視頻點播系統策略的定義及權限信息請參見系統授權策略。
選擇資源范圍。
賬號級別:權限在當前阿里云賬號內生效。
資源組級別:權限在指定的資源組內生效。
重要指定資源組授權生效的前提是該云服務及資源類型已支持資源組,詳情請參見支持資源組的云服務。資源組授權示例,請參見使用資源組限制RAM用戶管理指定的ECS實例。
選擇授權主體。
授權主體即需要添加權限的RAM用戶。系統會自動選擇當前的RAM用戶。
選擇權限策略。
權限策略是一組訪問權限的集合,分為以下兩種。支持批量選中多條權限策略。
單擊確認新增授權。
完成授權后,會生成一條授權成功的記錄。
單擊關閉。
步驟五:通過STS授權訪問視頻點播
本文僅介紹通過調用API扮演RAM角色獲取并使用安全令牌(STS Token)訪問視頻點播的方法。
使用創建的RAM用戶調用STS APIAssumeRole - 獲取扮演角色的臨時身份憑證獲得RAM角色的安全令牌(STS Token),并使用安全令牌訪問視頻點播API。
本文僅提供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();
}
}
}