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

背景信息

企业A购买了事件总线EventBridge 服务来开展业务,并希望将部分业务授权给企业B。

需求说明:

  • A希望能专注于业务系统,仅作为资源Owner;而事件发布等任务委托或授权给企业B。
  • 企业A希望当企业B的员工加入或离职时,无需做任何权限变更。企业B可以进一步将A的资源访问权限分配给B的RAM用户(员工或应用),并可以精细控制其员工或应用对资源的访问和操作权限。
  • 企业A希望如果双方合同终止,企业A随时可以撤销对企业B的授权。

操作步骤

  1. 首先需要使用企业A的阿里云账号(主账号)登录RAM控制台并为企业B的云账号创建RAM角色。
  2. 可选:企业A为刚创建的RAM角色创建自定义策略。

    具体步骤参见创建自定义策略

    目前,事件总线EventBridge支持资源粒度的权限设置。详情参见权限策略

  3. 新创建的角色没有任何权限,因此企业A必须为该角色添加权限。可添加系统权限策略或自定义权限策略。
    具体步骤参见为RAM角色授权
  4. 使用企业B的阿里云账号(主账号)登录RAM控制台并创建RAM用户。

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

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

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

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

  6. 企业B的RAM用户通过控制台或API访问企业A的资源。
    具体步骤参见本文的后续步骤。

STS在事件总线EventBridge中的使用

初始化事件总线EventBridge的客户端时,您只需将获取到的AccessKeyId、AccessKeySecret和SecurityToken填入到以下属性中即可。

package com.aliyun.eventbridge.customer;

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;

public class StsServiceSample {

    public static void main(String[] args) {
        String endpoint = "<sts-endpoint>";
        String accessKeyId = "<access-key-id>";
        String accessKeySecret = "<access-key-secret>";
        String roleArn = "<role-arn>";
        String roleSessionName = "<session-name>";
        String policy = "{\n" +
                "  \"Version\": \"1\",\n" +
                "  \"Statement\": [\n" +
                "    {\n" +
                "      \"Action\": \"eventbridge:*\",\n" +
                "      \"Resource\": \"*\",\n" +
                "      \"Effect\": \"Allow\"\n" +
                "    }\n" +
                "  ]\n" +
                "}";
        try {
            // 添加endpoint(直接使用STS endpoint,前两个参数留空,无需添加region ID)
            DefaultProfile.addEndpoint("", "", "Sts", endpoint);
            // 构造default profile(参数留空,无需添加region ID)
            IClientProfile profile = DefaultProfile.getProfile("", accessKeyId, accessKeySecret);
            // 用profile构造client
            DefaultAcsClient client = new DefaultAcsClient(profile);
            final AssumeRoleRequest request = new AssumeRoleRequest();
            request.setMethod(MethodType.POST);
            request.setRoleArn(roleArn);
            request.setRoleSessionName(roleSessionName);
            request.setPolicy(policy); // 若policy为空,则用户将获得该角色下所有权限
            request.setDurationSeconds(1000L); // 设置凭证有效时间
            final AssumeRoleResponse response = client.getAcsResponse(request);
            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());
        } catch (ClientException e) {
            System.out.println("Failed:");
            System.out.println("Error code: " + e.getErrCode());
            System.out.println("Error message: " + e.getErrMsg());
            System.out.println("RequestId: " + e.getRequestId());
        }
    }
}
			

更多信息

什么是RAM

后续步骤

完成上述操作后,企业B的RAM用户即可按照以下步骤登录控制台访问企业A的云资源或调用API。

  • 登录控制台访问企业A的云资源
    1. 在浏览器中打开RAM用户登录入口
    2. RAM用户登录页面上,输入RAM用户登录名称,单击下一步,并输入RAM用户密码,然后单击登录
      说明 RAM用户登录名称的格式为<$username>@<$AccountAlias><$username>@<$AccountAlias>.onaliyun.com<$AccountAlias>为账号别名,如果没有设置账号别名,则默认值为阿里云账号(主账号)的ID。
    3. 在阿里云控制台页面上,将鼠标指针移到右上角头像,并在浮层中单击切换身份
    4. 阿里云-角色切换页面,输入企业A的企业别名默认域名,以及角色名,然后单击切换
    5. 对企业A的阿里云资源执行操作。
  • 使用企业B的RAM用户通过API访问企业A的云资源

    要使用企业B的RAM用户通过API访问企业A的云资源,必须在代码中提供RAM用户的AccessKeyId、AccessKeySecret和SecurityToken(临时安全令牌)。使用STS获取临时安全令牌的方法参见AssumeRole