全部產品
Search
文件中心

ApsaraVideo VOD:使用STS臨時授權方案上傳視頻

更新時間:Jul 13, 2024

使用STS臨時授權可以有效避免RAM使用者密碼泄露導致的安全風險,本文介紹如何使用STS臨時授權方案上傳視頻。

步驟一:建立RAM使用者

說明
  • 下述步驟4中,建議您將登入名稱稱設定為vod,本文後續描述都以登入名稱稱vod為例。

  • 下述步驟5中,建議您訪問方式選擇OpenAPI調用訪問方式。

  1. 使用阿里雲帳號(主帳號)或Resource Access Management員登入RAM控制台

  2. 在左側導覽列,選擇身份管理 > 使用者

  3. 使用者頁面,單擊建立使用者

  4. 建立使用者頁面的使用者帳號資訊地區,設定使用者基本資料。

    • 登入名稱稱:可包含英文字母、數字、半形句號(.)、短劃線(-)和底線(_),最多64個字元。

    • 顯示名稱:最多包含128個字元或漢字。

    • 標籤:單擊edit,然後輸入標籤鍵和標籤值。為RAM使用者綁定標籤,便於後續基於標籤的使用者管理。

    說明

    單擊添加使用者,可以大量建立多個RAM使用者。

  5. 訪問方式地區,選擇訪問方式,然後設定對應參數。

    為了帳號安全,建議您只選擇以下訪問方式中的一種,將人員使用者和應用程式使用者分離,避免混用。

    • 控制台訪問

      如果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只在建立時顯示,不支援查看,請妥善保管。

  6. 單擊確定

  7. 根據介面提示,完成安全驗證。

步驟二:為RAM使用者授予調用STS服務AssumeRole介面的許可權

  1. 在RAM控制台的使用者頁面,單擊目標RAM使用者(上述建立的vod使用者)操作列的添加許可權

  2. 新增授權面板,為RAM使用者添加許可權。

    說明

    vod使用者添加調用STS服務AssumeRole介面的權限原則AliyunSTSAssumeRoleAccess,可通過在系統策略的搜尋輸入框中輸入AliyunSTSAssumeRoleAccess尋找。

    選擇策略

    1. 選擇資源範圍。

    2. 選擇授權主體。

      授權主體即需要添加許可權的RAM使用者。系統會自動選擇當前的RAM使用者。

    3. 選擇權限原則。

      權限原則是一組存取權限的集合,分為以下兩種。支援批量選中多條權限原則。

      • 系統策略:由阿里雲建立,策略的版本更新由阿里雲維護,使用者只能使用不能修改。更多資訊,請參見支援RAM的雲端服務

        說明

        系統會自動標識出高風險系統策略(例如:AdministratorAccess、AliyunRAMFullAccess等),授權時,盡量避免授予不必要的高風險權限原則。

      • 自訂策略:由使用者管理,策略的版本更新由使用者維護。使用者可以自主建立、更新和刪除自訂策略。更多資訊,請參見建立自訂權限原則

    4. 單擊確認新增授權

  3. 單擊關閉

步驟三:建立RAM角色

說明

下述步驟5中,建議您將角色名稱設定為vodrole,本文後續描述都以角色名稱vodrole為例。

  1. 使用Resource Access Management員登入RAM控制台

  2. 在左側導覽列,選擇身份管理 > 角色

  3. 角色頁面,單擊建立角色

  4. 建立角色頁面,選擇可信實體類型為阿里雲帳號,然後單擊下一步

  5. 設定角色資訊。

    1. 輸入角色名稱

    2. 輸入備忘

    3. 選擇信任的雲帳號。

      • 當前雲帳號:當您允許當前阿里雲帳號下的所有RAM使用者扮演該RAM角色時,您可以選擇當前雲帳號

      • 其他雲帳號:當您允許其他阿里雲帳號下的所有RAM使用者扮演該RAM角色時,您可以選擇其他雲帳號,然後輸入其他阿里雲帳號(主帳號)ID。該項主要針對跨阿里雲帳號的資源授權訪問情境,相關教程,請參見跨阿里雲帳號的資源授權

        您可以在安全設定頁面查看阿里雲帳號(主帳號)ID。

      重要

      如果您僅允許指定的RAM使用者扮演該RAM角色,而不是阿里雲帳號(主帳號)下的所有RAM使用者,您可以採取以下兩種方式:

  6. 單擊完成

  7. 單擊關閉

步驟四:為RAM角色授予管理VOD的許可權

  1. 在RAM控制台的角色頁面,單擊目標RAM角色(上述建立的vodrole角色)操作列的添加許可權

  2. 新增授權面板,為RAM角色添加許可權。

    說明
    • 為控制風險,建議採用最小許可權。

    • 如需vodrole角色可以訪問和管理ApsaraVideo for VOD的資源,則建議為vodrole角色添加可以管理和操作ApsaraVideo for VOD所有資源的系統策略許可權AliyunVODFullAccess,可通過在系統策略的搜尋輸入框中輸入AliyunVODFullAccess尋找,更多有關ApsaraVideo for VOD系統策略的定義及許可權資訊請參見系統授權策略

    授權

    1. 選擇資源範圍。

    2. 選擇授權主體。

      授權主體即需要添加許可權的RAM使用者。系統會自動選擇當前的RAM使用者。

    3. 選擇權限原則。

      權限原則是一組存取權限的集合,分為以下兩種。支援批量選中多條權限原則。

      • 系統策略:由阿里雲建立,策略的版本更新由阿里雲維護,使用者只能使用不能修改。更多資訊,請參見支援RAM的雲端服務

        說明

        系統會自動標識出高風險系統策略(例如:AdministratorAccess、AliyunRAMFullAccess等),授權時,盡量避免授予不必要的高風險權限原則。

      • 自訂策略:由使用者管理,策略的版本更新由使用者維護。使用者可以自主建立、更新和刪除自訂策略。更多資訊,請參見建立自訂權限原則

    4. 單擊確認新增授權

    完成授權後,會產生一條授權成功的記錄。授權成功

  3. 單擊關閉

步驟五:通過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();
        }
    }
}