全部产品

创建角色并进行STS临时授权

使用STS临时授权可以有效避免RAM用户密码泄露导致的安全风险,本文为您如何创建RAM用户,创建角色,并进行STS临时授权。

前提条件

如果您之前没有使用过阿里云控制台,需要先开通服务。

背景信息

RAM用户的权限是可长期使用的,易导致安全风险。建议您生成STS临时AK,自定义过期时间,并且指定复杂的策略来对不同的RAM用户进行限制,仅提供最小的权限。

创建RAM用户

  1. 使用阿里云账号登录RAM控制台
  2. 单击左侧导航栏用户,进入用户管理页面,单击页面中的创建用户image
  3. 勾选编程访问,单击确定

    此时创建了一个拥有和主账号一样完全访问ICE权限的RAM用户。

    image.png

    单击确定后会弹出手机验证窗口,完成验证码验证后,自动生成该RAM用户的AccessKey。

    image.png
  4. 单击用户信息右侧的复制,保存用户登录名称、登录密码、AK对等用户信息。

    说明 请保存用户信息并妥善保管,用于后续的访问。

  5. 返回用户管理界面,这里显示账号已创建。创建完成之后,该RAM用户还是没有任何权限,单击右边的添加权限image.png
  6. 添加权限页面,选择AliyunSTSAssumeRoleAccess策略,单击确定add-permission-

创建角色

  1. 打开RAM控制台,进入RAM角色管理页面,单击创建RAM角色image
  2. 创建RAM角色页面,选择阿里云账号,单击下一步image
  3. 输入角色名称,选择当前云账号,单击完成image.png

    创建完成后,进入如下页面:

    image
  4. 返回RAM角色管理页面,找到刚创建的角色,单击角色信息右侧的添加权限image.png
  5. 给角色添加AliyunICEFullAccess系统授权,并单击确定image.png
    说明

    为控制风险,建议采用最小权限。完成授权后,会生成一条授权成功的记录。

    image.png

STS授权访问

请下载和安装对应语言版本的 STS SDK或直接调用 AssumeRole接口。 角色和策略等的配置请参见下文示例(以Java为例)。

调用方法,请参见 什么是STS

  • Java代码示例

完成创建RAM用户和角色后,一切准备就绪,可以正式使用STS来授权访问了。

  • 这里使用一个简单的STS的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.aliyun.ice20201109.models.*;
import com.aliyun.ice20201109.Client;
import com.aliyun.tearpc.models.*;

/**
 * @author xxx
 * @date 2020/12/25
 */
public class TestStsService {
    public static void main(String[] args) {
        // 只有RAM用户(子账号)才能调用 AssumeRole 接口
        // 阿里云主账号的AccessKeys不能用于发起AssumeRole请求
        // 请首先在RAM控制台创建一个RAM用户,并为这个用户创建AccessKeys
        String accessKeyId = "<access-key-id>";
        String accessKeySecret = "<access-key-secret>";
        // AssumeRole API 请求参数: RoleArn, RoleSessionName, Policy, and DurationSeconds
        // RoleArn 需要在 RAM 控制台上获取
        String roleArn = "<role-arn>";
        // RoleSessionName 是临时Token的会话名称,自己指定用于标识你的用户,主要用于审计,或者用于区分Token颁发给谁
        // 但是注意RoleSessionName的长度和规则,不要有空格,只能有'-' '_' 字母和数字等字符
        // 具体规则请参考API文档中的格式要求
        String roleSessionName = "session-name";// 自定义即可
        // 定制你的policy
        String policy = "{\n" +
                "  \"Version\": \"1\",\n" +
                "  \"Statement\": [\n" +
                "    {\n" +
                "      \"Action\": \"ice:*\",\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());
            submitMediaProducing(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,请参见接入地址(https://help.aliyun.com/document_detail/66053.html?spm=a2c4g.11186623.2.16.1db87074dzvl3J#reference-sdg-3pv-xdb)。
             */
            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 submitMediaProducing(String accessKeyId, String accessKeySecret, String token) {
        Config config =  new Config();
        // Endpoint以上海为例,其它Region请按实际情况填写。
        config.endpoint = "http://ice-cn-shanghai.aliyuncs.com";
        // 阿里云主账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM账号进行API访问或日常运维,请登录 https://ram.console.aliyun.com 创建RAM账号。
        config.accessKeyId = accessKeyId;
        config.accessKeySecret = accessKeySecret;
        Client iceClient = new Client(config);

        // 通过timeline创建合成任务
        SubmitMediaProducingJobRequest request1 = new SubmitMediaProducingJobRequest();
        request1.setTimeline("{\"VideoTracks\":[{\"VideoTrackClips\":[{\"MediaId\":\"****9b4d7cf14dc7b83b0e801cbe****\"},{\"MediaId\":\"****9b4d7cf14dc7b83b0e801cbe****\"},{\"MediaId\":\"****1656bca4474999c961a6d2a2****\"}]}]}");
        iceClient.submitMediaProducingJob(request1);
    }
}
    • RoleArn:需要扮演的角色ID,角色的ID可以在角色管理>基本信息中找到。

    • RoleSessionName:一个用来标示临时凭证的名称,一般来说建议使用不同的应用程序用户来区分。

    • Policy:在扮演角色的时候额外加上的一个权限限制。

说明

      • 这里需要解释一下Policy,这里传入的Policy是用来限制扮演角色之后的临时凭证的权限。最后临时凭证获得的权限是角色的权限和这里传入的Policy的交集。

      • 在扮演角色的时候传入Policy的原因是为了灵活性,比如只能现在使用CreateUploadVideo接口。

    • DurationSeconds:临时凭证的有效期,单位是s,最小为900,最大为3600。

    • id和secret:需要扮演角色的RAM用户,及其AccessKey。

请求发出后,会返回结果,更多信息,请参见返回结果