您可以为可信实体为阿里云账号、阿里云服务或身份提供商的RAM角色授权。本文介绍如何创建可信实体为阿里云账号的RAM角色,来实现跨账号授权访问Serverless 应用引擎 SAE(Serverless App Engine)的资源。
应用场景
企业A开通了SAE服务,并希望将部分业务授权给企业B。需求如下:
企业A希望能专注于业务系统,仅作为SAE的资源所有者;而将部分业务授权给企业B,例如应用发布、应用管理、自动弹性、一键启停应用和应用监控等服务。
企业A希望当企业B的员工加入或离职时,无需做任何权限变更。企业B可以进一步将A的资源访问权限分配给企业B的RAM用户,并可以精细控制其员工或应用对资源的访问和操作权限。
企业A希望如果双方合同终止,企业A随时可以撤销对企业B的授权。
步骤一:企业A创建RAM角色
假设企业A和企业B名下分别有一个阿里云账号A和阿里云账号B。
企业A的阿里云账号ID为
1234************,账号别名(企业别名)为company-a。企业B的阿里云账号ID为
2345************,账号别名(企业别名)为company-b。
企业A使用阿里云账号A登录RAM控制台。
在左侧导航栏,选择。
在角色页面,单击创建角色。

在创建角色页面,配置相关信息。
选择信任主体类型为云账号,信任主体名称选择其他云账号,并输入企业B的阿里云账号B。然后单击确定。
输入角色名称为
sae-admin,然后单击确定。重要如果您仅允许指定的RAM用户扮演该RAM角色,而不是阿里云账号(主账号)下的所有RAM用户,您可以采取以下两种方式:
修改RAM角色的信任策略。具体操作,请参见示例一:修改RAM角色的可信实体为阿里云账号。
修改RAM用户的角色扮演权限策略。具体操作,请参见如何限制指定RAM用户扮演指定RAM角色?。
您可以在该角色的基本信息页面,查看包括RAM角色名称、创建时间和ARN等具体信息。
RAM角色名称:sae-admin。
ARN:
acs:ram::1234************:role/sae-admin。信任策略:
说明以下策略表示仅允许阿里云账号B下的RAM用户来扮演该RAM角色。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::2345************:root" ] } } ], "Version": "1" }
步骤二:企业A为RAM角色添加权限
步骤三:企业B创建RAM用户
企业B使用阿里云账号B登录RAM控制台。
在左侧导航栏,选择。
在用户页面,单击创建用户。

在创建用户页面的用户账号信息区域,设置用户基本信息。
登录名称:可包含英文字母、数字、半角句号(.)、短划线(-)和下划线(_),最多64个字符。
显示名称:最多包含128个字符或汉字。
标签:单击
,然后输入标签键和标签值。为RAM用户绑定标签,便于后续基于标签的用户管理。
说明单击添加用户,可以批量创建多个RAM用户。
在访问方式区域,选择访问方式,然后设置对应参数。
为了账号安全,建议您只选择以下访问方式中的一种,将人员用户和应用程序用户分离,避免混用。
控制台访问
如果RAM用户代表人员,建议启用控制台访问,使用用户名和登录密码访问阿里云。您需要设置以下参数:
设置密码:设置登录控制台的密码,您可以选择自动生成密码或者自定义密码。自定义登录密码时,密码必须满足密码复杂度规则。更多信息,请参见设置RAM用户密码策略。
需要重置密码:选择RAM用户在下次登录时是否需要重置密码。
MFA多因素认证:选择是否为当前RAM用户启用MFA。启用MFA后,还需要绑定MFA设备。更多信息,请参见为RAM用户绑定MFA设备。
使用永久AccessKey访问
如果RAM用户代表应用程序,您可以使用永久访问密钥(AccessKey)访问阿里云。启用后,系统会自动为RAM用户生成一个AccessKey ID和AccessKey Secret。更多信息,请参见创建AccessKey。
重要RAM用户的AccessKey Secret只在创建时显示,不支持查看,请妥善保管。
访问密钥(AccessKey)是一种长期有效的程序访问凭证。AccessKey泄露会威胁该账号下所有资源的安全。建议优先采用STS Token临时凭证方案,降低凭证泄露的风险。更多信息,请参见使用访问凭据访问阿里云OpenAPI最佳实践。
单击确定。
步骤四:企业B为RAM用户添加权限
企业B使用阿里云账号B登录RAM控制台。
在左侧导航栏,选择。
在用户页面,单击目标RAM用户操作列的添加权限。

您也可以选中多个RAM用户,单击用户列表下方的添加权限,为RAM用户批量授权。
在权限策略区域,在搜索框输入AliyunSTSAssumeRoleAccess ,选中该权限策略将其添加至右侧的已选择权限策略列表中,然后单击确认新增授权。
单击关闭。
步骤五:跨云账号访问资源
阿里云临时安全令牌STS(Security Token Service)是阿里云提供的一种临时访问权限管理服务。通过STS服务,您所授权的身份主体(RAM用户或RAM角色)可以获取一个自定义时效和访问权限的临时访问令牌。STS令牌持有者可以通过以下方式访问阿里云资源:
方式一:通过控制台访问资源
企业B的RAM用户可按照以下步骤登录控制台,访问企业A的SAE资源。
使用阿里云账号B的RAM用户登录RAM控制台。
更多信息,请参见RAM用户登录阿里云控制台。
在阿里云控制台页面,将鼠标悬停至右上角头像,单击切换身份。
在角色切换页面,输入企业A的企业别名和角色名,然后单击提交。
成功登录后,企业B的RAM用户就可以操作企业A的Serverless应用引擎资源。
方式二:通过SDK访问资源
获取访问凭证,以Java SDK为例:
在代码运行环境中设置环境变量。
变量名
变量值
ALIBABA_CLOUD_ACCESS_KEY_ID
企业B的RAM用户的AccessKey ID
ALIBABA_CLOUD_ACCESS_KEY_SECRET
企业B的RAM用户的AccessKey Secret
运行以下代码。更多信息,请参见Java示例和AssumeRole。
package com.aliyun.sample; import com.aliyun.sts20150401.models.AssumeRoleResponse; import com.aliyun.tea.TeaException; import com.google.gson.Gson; public class Sample { /** * <b>description</b> : * <p> * 使用凭据初始化账号Client * </p> * * @return Client * * @throws Exception */ public static com.aliyun.sts20150401.Client createClient() throws Exception { 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.cn-hangzhou.aliyuncs.com"; return new com.aliyun.sts20150401.Client(config); } public static void main(String[] args_) throws Exception { com.aliyun.sts20150401.Client client = Sample.createClient(); com.aliyun.sts20150401.models.AssumeRoleRequest assumeRoleRequest = new com.aliyun.sts20150401.models.AssumeRoleRequest(); com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); // 需要替换为实际的RoleArn,并且自定义RoleSessionName assumeRoleRequest.setRoleArn("acs:ram::1234************:role/sae-admin"); assumeRoleRequest.setRoleSessionName("Alice"); try { // 复制代码运行请自行打印 API 的返回值 AssumeRoleResponse response = client.assumeRoleWithOptions(assumeRoleRequest, runtime); System.out.println(new Gson().toJson(response.body)); } 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); } } }说明SAE的API支持HTTP调用、SDK调用和OpenAPI开发者门户调用。 更多信息,请参见API概览。
预期输出。
{ "requestId": "964E0EC5-575B-4FF5-8FD0-D4BD8025****", "assumedRoleUser": { "arn": "acs:ram::*************", "assumedRoleId": "*************" }, "credentials": { "securityToken": "*************", "accessKeyId": "STS.*************", "accessKeySecret": "*************", "expiration": "2021-05-28T11:23:19Z" } }
依据所返回的访问密钥等信息,生成新的Client,使企业B的RAM用户有权限操作阿里云账号A中的SAE资源,以查看SAE华东1(杭州)地域的命名空间为例:
在代码运行环境中设置环境变量。
变量名
变量值
ALIBABA_CLOUD_ACCESS_KEY_ID
上一步返回结果中的credentials.accessKeyId
ALIBABA_CLOUD_ACCESS_KEY_SECRET
上一步返回结果中的credentials.accessKeySecret
ALIBABA_CLOUD_SECURITY_TOKEN
上一步返回结果中的credentials.securityToken
运行以下代码。
package com.aliyun.sample; import com.aliyun.sae20190506.models.DescribeNamespacesResponse; import com.aliyun.tea.*; import com.google.gson.Gson; public class Sample { /** * <b>description</b> : * <p> * 使用凭据初始化账号Client * </p> * * @return Client * * @throws Exception */ public static com.aliyun.sae20190506.Client createClient() throws Exception { 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/sae config.endpoint = "sae.cn-hangzhou.aliyuncs.com"; return new com.aliyun.sae20190506.Client(config); } public static void main(String[] args_) throws Exception { com.aliyun.sae20190506.Client client = Sample.createClient(); com.aliyun.sae20190506.models.DescribeNamespacesRequest describeNamespacesRequest = new com.aliyun.sae20190506.models.DescribeNamespacesRequest(); com.aliyun.teautil.models.RuntimeOptions runtime = new com.aliyun.teautil.models.RuntimeOptions(); java.util.Map<String, String> headers = new java.util.HashMap<>(); // 根据实际需求替换以下参数 describeNamespacesRequest.setCurrentPage(1); describeNamespacesRequest.setPageSize(10); try { DescribeNamespacesResponse response = client .describeNamespacesWithOptions(describeNamespacesRequest, headers, runtime); System.out.println(new Gson().toJson(response.body)); } 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); } } }
撤销授权
若企业A与企业B的合作终止,企业A只需移除为阿里云账号B创建的RAM角色的权限并删除该角色,那么阿里云账号B下的所有RAM用户将失去以RAM角色的身份访问阿里云账号A资源的能力。
在删除RAM角色前,需要先为RAM角色移除授权。具体操作,请参见为RAM角色移除权限。
企业A使用阿里云账号A登录RAM控制台。
在左侧导航栏,选择。
在角色页面,单击目标RAM角色操作列的删除角色。
在删除角色对话框,输入RAM角色名称,然后单击删除角色。
如果RAM角色被授予了权限策略,删除角色时,会同时解除授权。
对于删除失败的任务,您可以在角色列表的右上方,单击角色删除任务,查看详情。
