创建RAM角色并进行STS授权

在移动端或Web端访问服务时,您可以使用STS临时授权,可以有效避免RAM用户密码泄露导致的安全风险。通过阅读本文,您可以了解STS授权的方法。

背景信息

由于RAM用户的权限启用后一直有效,一旦AccessKey泄露,可能会导致安全风险。建议您使用STS临时授权,通过自定义过期时间,并指定相对复杂的策略对不同的RAM角色进行限制,采取权限最小化原则,提高服务访问的安全性。

步骤一:创建RAM用户并授予AssumeRole接口的调用权限

  1. 使用阿里云账号(主账号)或RAM管理员登录RAM控制台

  2. 在左侧导航栏,选择身份管理 > 用户

  3. 用户页面,单击创建用户。 

    image

  4. 创建用户页面的用户账号信息区域,设置用户基本信息。

    • 登录名称:可包含英文字母、数字、半角句号(.)、短划线(-)和下划线(_),最多64个字符。

    • 显示名称:最多包含128个字符或汉字。

    • 标签:单击edit,然后输入标签键和标签值。为RAM用户绑定标签,便于后续基于标签的用户管理。

    说明

    单击添加用户,可以批量创建多个RAM用户。

  5. 访问方式区域,选择访问方式,然后设置对应参数。

  6. 单击确定并完成手机验证,系统会自动生成RAM用户的AccessKey。

    001

  7. 单击操作列的复制,保存用户登录名称、登录密码、AccessKey等用户信息。

    重要

    请务必保存好登录密码和AccessKey信息(AccessKey IDAccessKey Secret),否则后续无法查询。

  8. 返回用户列表页面,单击已创建RAM用户操作列的添加权限

  9. 新增授权面板,为RAM用户添加权限。

    1. 选择授权应用范围。

      资源范围选择账号级别,智能媒体服务暂不支持指定资源组授权。关于资源组详情,请参见资源目录、资源组与标签的区别和联系

    2. 指定授权主体。

      授权主体即需要添加权限的RAM用户。

    3. 选择权限策略。

      系统策略下输入框中输入AliyunSTS,选择权限策略为AliyunSTSAssumeRoleAccess

    4. 单击确认新增授权,完成用户授权。

步骤二:创建RAM角色并授予IMS操作权限

  1. 使用RAM管理员登录RAM控制台

  2. 在左侧导航栏,选择身份管理 > 角色

  3. 角色页面,单击创建角色

    image

  4. 创建角色页面,选择信任主体类型云账号,然后设置具体的阿里云账号,最后单击确定

    image

    • 当前云账号:当您允许当前阿里云账号下的所有RAM用户和RAM角色扮演当前正在创建的RAM角色时,您可以选择当前云账号

    • 其他云账号:当您允许其他阿里云账号下的所有RAM用户和RAM角色扮演当前正在创建的RAM角色时,您可以选择其他云账号,然后输入其他阿里云账号(主账号)ID。该项主要针对跨阿里云账号的资源授权访问场景,相关教程,请参见跨阿里云账号访问资源您可以在安全设置页面查看阿里云账号(主账号)ID。

  5. (可选)如果您想设置RAM角色只能被可信阿里云账号下的指定RAM用户或RAM角色扮演,您可以单击切换编辑器,在编辑器中修改RAM角色的信任策略。

    编辑器支持可视化编辑和脚本编辑两种模式,您可以任选其一。以下示例表示当前创建的RAM角色只能被当前阿里云账号(AccountID=100******0719)下的RAM用户Alice扮演。

    • 可视化编辑

      主体中指定具体的RAM用户名称。

      image

      image

    • 脚本编辑

      PrincipalRAM字段中指定具体的RAM用户。

      {
        "Version": "1",
        "Statement": [
          {
            "Effect": "Allow",
            "Principal": {
              "RAM": "acs:ram::100******0719:user/Alice"
            },
            "Action": "sts:AssumeRole"
          }
        ]
      }

  6. 新增授权面板,为RAM角色授权。

    1. 选择授权范围。

      授权范围选择账号级别,智能媒体服务暂不支持指定资源组授权。关于资源组详情,请参见资源目录、资源组与标签的区别和联系

    2. 指定授权主体。

      授权主体即需要授权的RAM角色,系统会自动填入当前的RAM角色,您也可以添加其他RAM角色。

    3. 选择权限策略。

      • 使用系统策略

        系统策略下输入框中输入AliyunICE,根据实际需求选择筛选出的权限策略。

        权限策略描述OpenAPI调用权限
        AliyunICEFullAccess管理和操作IMS所有资源的权限。可以调用智能媒体服务所有的OpenAPI。
        AliyunICEReadOnlyAccess只读访问IMS所有资源的权限。可以调用智能媒体服务所有读取类的OpenAPI,例如Get、Describe、Search、List开头的接口。
      • 使用自定义策略

        自定义策略下根据实际需求选择权限策略。如果没有可用的自定义权限策略, 您可以新建权限策略,详情请参见创建自定义权限策略自定义策略示例

      说明
      • 每次最多绑定5条策略,如需绑定更多策略,请分次操作。

      • 为控制风险,建议采用最小权限原则。

      • 如果需要使用智能媒体服务端侧(iOSAndroid)SDK,由于需要将文件上传到OSS上,因此需要增加OSS的权限,即AliyunOSSFullAccess,或者您可以根据实际情况自定义OSS的权限策略。

    4. 单击确认新增授权,完成角色授权。

步骤三:使用创建的RAM用户调用AssumeRole接口获取临时AccessKey

  1. 下载并集成STS SDK。下载地址,请参见STS SDK概览

  2. 调用AssumeRole获取扮演角色的临时身份凭证。

    本文以Java示例代码举例说明,其他端代码请参见SDK示例代码

    Java

    import com.aliyun.tea.*;
    
    public class Sample {
    
        /**
         * <b>description</b> :
         * <p>使用凭据初始化账号Client</p>
         * @return Client
         * 
         * @throws Exception
         */
        public static com.aliyun.sts20150401.Client createClient() throws Exception {
            // 工程代码建议使用更安全的无AK方式,凭据配置方式请参见:https://help.aliyun.com/document_detail/378657.html。
            com.aliyun.credentials.Client credential = new com.aliyun.credentials.Client();
            com.aliyun.teaopenapi.models.Config config = new com.aliyun.teaopenapi.models.Config()
                    .setCredential(credential);
            // Endpoint 请参考 https://api.aliyun.com/product/Sts
            config.endpoint = "sts.us-west-1.aliyuncs.com";
            return new com.aliyun.sts20150401.Client(config);
        }
    
        public static void main(String[] args_) throws Exception {
    
            com.aliyun.sts20150401.Client client = Sample.createClient();
            // AssumeRole API 请求参数:RoleArn, RoleSessionName, Policy, and DurationSeconds
            // RoleArn 需要在 RAM 控制台上获取
            com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest()
                    .setDurationSeconds(3600L)
                    // 定制你的policy
                    .setPolicy("{\n" +
                            "  \"Version\": \"1\",\n" +
                            "  \"Statement\": [\n" +
                            "    {\n" +
                            "      \"Action\": \"ice:*\",\n" +
                            "      \"Resource\": \"*\",\n" +
                            "      \"Effect\": \"Allow\"\n" +
                            "    }\n" +
                            "  ]\n" +
                            "}")
                    // RoleArn 需要在 RAM 控制台上获取
                    .setRoleArn("<role-arn>")
                    // RoleSessionName 是临时Token的会话名称,自己指定用于标识你的用户,主要用于审计,或者用于区分Token颁发给谁
                    // 但是注意RoleSessionName的长度和规则,不要有空格,只能有'-' '_' 字母和数字等字符
                    // 具体规则请参考API文档中的格式要求
                    .setRoleSessionName("session-name");// 自定义即可
            com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions();
            try {
                com.aliyun.sts20150401.models.AssumeRoleResponse resp = client.assumeRoleWithOptions(assumeRoleRequest, runtime);
                com.aliyun.teaconsole.Client.log(com.aliyun.teautil.Common.toJSONString(resp));
            } catch (TeaException error) {
                // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                // 错误 message
                System.out.println(error.getMessage());
                // 诊断地址
                System.out.println(error.getData().get("Recommend"));
                com.aliyun.teautil.Common.assertAsString(error.message);
            } catch (Exception _error) {
                TeaException error = new TeaException(_error.getMessage(), _error);
                // 此处仅做打印展示,请谨慎对待异常处理,在工程项目中切勿直接忽略异常。
                // 错误 message
                System.out.println(error.getMessage());
                // 诊断地址
                System.out.println(error.getData().get("Recommend"));
                com.aliyun.teautil.Common.assertAsString(error.message);
            }
        }
    }

后续步骤

获取到AccessKey信息后,您可以根据实际需求安装完服务端SDK后调用OpenAPI,实现业务功能。详情请参见调用OpenAPI流程

相关参考

AssumeRole - 获取扮演角色的临时身份凭证