通过RAM角色实现跨云账号授权

使用企业A的阿里云账号(主账号)创建RAM角色并为该角色授权,并将该角色赋予企业B,即可实现使用企业B的主账号或其RAM用户(子账号)访问企业A的阿里云资源的目的。

背景信息

企业A购买了云消息队列 RocketMQ 版服务来开展业务,并希望将部分业务授权给企业B。

需求说明:

  • A希望能专注于业务系统,仅作为资源Owner;而消息发布和订阅等任务委托或授权给企业B。

  • 企业A希望当企业B的员工加入或离职时,无需做任何权限变更。企业B可以进一步将A的资源访问权限分配给B的RAM用户(员工或应用),并可以精细控制其员工或应用对资源的访问和操作权限。

  • 企业A希望如果双方合同终止,企业A随时可以撤销对企业B的授权。

解决方案

企业A需要授予企业B的员工对云消息队列 RocketMQ 版的资源进行操作。假设企业A和企业B分别有一个阿里云账号A和阿里云账号B,需要完成以下操作完成企业A和企业B的跨云账号授权及资源访问:

  1. 步骤一:创建RAM角色并授权

    阿里云账号A创建一个RAM角色,并根据业务范围和需求为RAM角色授予对应的权限,并允许阿里云账号B下的RAM用户扮演该角色。

  2. 步骤二:跨云账号访问资源

    RAM角色授权完成后,阿里云账号B下的RAM用户通过扮演RAM角色可获取该角色对应的权限。RAM用户可通过以下方式访问阿里云账号A的资源:

    • 通过SDK访问资源

    • 通过控制台访问资源

    • 通过API访问资源

步骤一:创建RAM角色并授权

  1. 首先需要使用企业A的阿里云账号(主账号)登录RAM控制台并为企业B的云账号创建RAM角色。

  2. 可选:企业A为刚创建的RAM角色创建自定义策略。

    具体步骤,请参见创建自定义权限策略

    目前,云消息队列 RocketMQ 版支持实例、Topic和Group粒度的权限设置。更多信息,请参见云消息队列 RocketMQ 版自定义权限策略

  3. 新创建的角色没有任何权限,因此企业A必须为该角色添加权限。可添加系统权限策略或自定义权限策略。

    具体步骤,请参见为RAM用户授权

  4. 使用企业B的阿里云账号(主账号)登录RAM控制台并创建RAM用户。

    具体步骤,请参见为企业B创建RAM用户

  5. 企业B为RAM用户添加AliyunSTSAssumeRoleAccess权限。

    具体步骤,请参见为RAM用户授权

    企业B必须为其主账号下的RAM用户添加AliyunSTSAssumeRoleAccess权限,RAM用户才能扮演企业A创建的RAM角色。

步骤二:跨云账号访问资源

  • 通过SDK访问资源

    企业B的RAM用户可通过SDK访问企业A的云消息队列 RocketMQ 版资源,完成消息收发功能。SDK访问有以下两种配置方式:

    • 配置STS Token:使用STS Token方式,您必须在SDK代码中提供RAM用户的AccessKey ID、AccessKey Secret和SecurityToken(临时安全令牌),但是SecurityToken有时效性需要不断更新。使用STS获取临时安全令牌的方法,请参见AssumeRole

      重要
      • STS方式只适用于云消息队列 RocketMQ 版的Java SDK 1.7.8.Final及以上版本。

      • 获取AccessKey ID和AccessKey Secret,请参见创建AccessKey

      STS Token配置示例

      • 初始化云消息队列 RocketMQ 版的客户端时,您只需将获取到的AccessKey ID、AccessKey Secret和SecurityToken填入到以下属性中即可:

        Properties properties = new Properties();
        // 请确保环境变量ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和ALIBABA_CLOUD_SECURITY_TOKEN已设置。
        // STS的AccessKey ID。
        properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // STS的AccessKey Secret。
        properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // STS的SecurityToken。
        properties.put(PropertyKeyConst.SecurityToken, System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
        // 其他属性。
        properties.put(PropertyKeyConst.NAMESRV_ADDR, "XXX");
        ......
        Producer client = ONSFactory.createProducer(properties);
        client.start();                    
      • 当SecurityToken过期时,调用updateCredential方法动态更新。

        Properties properties = new Properties();
        // 请确保环境变量ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和ALIBABA_CLOUD_SECURITY_TOKEN已设置。
        // STS的AccessKey ID。
        properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"));
        // STS的AccessKey Secret。
        properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"));
        // STS的SecurityToken。
        properties.put(PropertyKeyConst.SecurityToken, System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN"));
        client.updateCredential(properties);                    
    • 配置ECS实例RAM角色:使用ECS实例RAM角色的方式,您无需在SDK中配置RAM用户的AccessKey ID、AccessKey Secret和SecurityToken信息,只需要输入创建的RAM角色名称即可,提高了代码配置的便利性。但是您需要先将创建的RAM角色与应用程序所部署的ECS实例完成绑定,将RAM角色权限授予ECS实例,具体步骤,请参见为实例授予RAM角色

      重要

      ECS实例RAM角色方式只适用于云消息队列 RocketMQ 版的Java SDK 1.8.7.3.Final及以上版本。

      ECS实例RAM角色配置示例

      Properties properties = new Properties();
      // 您创建的RAM角色的名称,并且已将该RAM角色授予ECS实例。
      properties.put(PropertyKeyConst.RAM_ROLE_NAME,"XXX");
  • 通过控制台访问资源

    企业B的RAM用户可按照以下步骤登录控制台访问企业A的云消息队列 RocketMQ 版资源。

    1. 在浏览器中打开RAM用户登录入口

    2. RAM用户登录页面上,输入RAM用户登录名称,单击下一步,并输入RAM用户密码,然后单击登录

      说明

      RAM用户登录名称的格式为<$username>@<$AccountAlias><$username>@<$AccountAlias>.onaliyun.com<$AccountAlias>为账号别名,如果没有设置账号别名,则默认值为阿里云账号(主账号)的ID。

    3. 在阿里云控制台登录页面,将鼠标指针移到右上角头像上,并在浮层中单击切换身份

    4. 阿里云-角色切换页面,输入企业A的企业别名默认域名主账号UID中的任意一种,以及角色名,然后单击提交

    5. 对企业A的云消息队列 RocketMQ 版资源进行操作。

  • 通过API访问资源

    企业B的RAM用户可通过调用云消息队列 RocketMQ 版提供的API接口访问企业A的资源。调用API的方法,请参见API调用方式

更多信息