本文介绍如何使用RAM控制台和SDK获取阿里云临时安全令牌STS(Security Token Service)并实现跨账号授权查看函数计算的资源的操作步骤。

使用示例

企业A开通了函数计算,该企业需要企业B代为操作函数计算的资源。同时企业A有如下诉求:
  • 企业A希望能专注于业务系统,仅作为函数计算的所有者,同时,可以授权企业B操作部分业务,例如创建服务、创建函数等。
  • 企业A希望当企业B的员工加入或离职时,无需做任何权限变更。企业B可以进一步将企业A的资源访问权限分配给企业B的RAM用户,并可以精细控制其RAM用户对资源的访问或操作权限。
  • 企业A希望如果双方合同终止,企业A随时可以撤销对企业B的授权。

使用控制台的操作步骤

假设企业A需要授权企业B的员工访问函数计算的所有服务。企业A和企业B下分别有一个阿里云账号A和阿里云账号B:
  • 企业A的阿里云账号ID为123456789012****,账号别名(企业别名)为company-a
  • 企业B的阿里云账号ID为134567890123****,账号别名(企业别名)为company-b

步骤一:阿里云账号A创建RAM角色

使用阿里云账号A创建一个RAM角色,并为RAM角色授予适当的权限,允许阿里云账号B使用该角色。

  1. 使用阿里云账号A登录RAM控制台
  2. 在左侧导航栏,单击RAM角色管理
  3. RAM角色管理页面,单击创建RAM角色
  4. 创建RAM角色面板的选择类型配置向导页面,单击阿里云账号,然后单击下一步
  5. 创建RAM角色面板的配置角色配置向导页面,设置角色名称例如fc-admin,单击其他云账号并填写企业B的阿里云账号。
  6. 单击完成
    如果页面跳转至 创建RAM角色面板的 创建成功配置向导页面,表示创建RAM角色成功。RAM角色创建成功后,您可以在该角色的基本信息页面内查看到该RAM角色的ARN和信任策略:
    • RAM角色的ARN为:acs:ram::123456789012****:role/fc-admin
    • RAM角色的信任策略如下:
      说明 以下策略表示仅允许阿里云账号B下的RAM用户来扮演该RAM角色。
      {
        "Statement": [
          {
            "Action": "sts:AssumeRole",
            "Effect": "Allow",
            "Principal": {
              "RAM": [
                "acs:ram::134567890123****:root"
              ]
            }
          }
        ],
        "Version": "1"
      }
  7. 阿里云账号A为RAM角色fc-admin添加AliyunFCReadOnlyAccess权限。关于如何为RAM角色授权的操作步骤,请参见为RAM角色授权

步骤二:阿里云账号B创建一个RAM用户

  1. 使用阿里云账号B为其员工创建RAM用户test-demo。关于如何创建RAM用户的操作步骤,请参见创建RAM用户
  2. 阿里云账号B为创建好的RAM用户添加AliyunSTSAssumeRoleAccess权限,即允许RAM用户扮演RAM角色。关于如何为RAM用户添加权限,请参见为RAM用户授权

步骤三:切换身份登录

当阿里云账号B下的某个员工(RAM用户)需要访问阿里云账号A下的资源时,阿里云账号B可以自主进行授权控制。即阿里云账号B下的RAM用户扮演阿里云账号A下的RAM角色访问阿里云账号A下的资源。具体操作如下:

  1. 使用阿里云账号B的RAM用户登录RAM控制台。关于RAM用户登录控制台的详细信息,请参见RAM用户登录控制台
  2. 成功登录后,您需要将鼠标悬停在右上角头像的位置,单击切换身份
  3. 阿里云角色切换页面,输入相关参数信息。
    关于切换账号的详细信息,请参见 使用RAM角色

(可选)撤消授权

如果企业A与企业B的合作终止了,企业A只需要撤销阿里云账号B对RAM角色的使用即可。此时阿里云账号B下的所有RAM用户对RAM角色的使用权限将被自动撤销。具体操作如下:

  1. 阿里云账号A登录RAM控制台
  2. 在左侧导航栏,单击RAM角色管理
  3. 选择目标RAM角色即fc-admin,在操作列单击删除
    注意 在删除RAM角色前,请先为RAM角色移除权限。详情信息,请参见 为RAM角色移除权限

使用SDK的操作步骤

函数计算可以通过STS进行临时授权访问。STS是为云计算使用者提供临时访问令牌的Web服务。假设有阿里云账号A和阿里云账号B,阿里云账号B想获取查看阿里云账号A下函数计算所有服务的权限。

  1. 通过以下代码示例获取访问凭证。更多信息,请参见STS SDK概览AssumeRole
    const Core = require('@alicloud/pop-core');
     
     //构建一个阿里云客户端, 用于发起请求。
     //构建阿里云客户端时,需要设置AccessKey ID和AccessKey Secret。
     var client = new Core({
       accessKeyId: '<accessKeyId>',
       accessKeySecret: '<accessSecret>',
       endpoint: 'https://sts.aliyuncs.com',
       apiVersion: '2015-04-01'
     });
     
     //设置参数。
     var params = {
       "RegionId": "cn-hangzhou",
       "RoleArn": "<RoleARN>",
       "RoleSessionName": "<RoleSessionName>"
     }
     
     var requestOption = {
       method: 'POST'
     };
     
     //发起请求,并得到响应。
     client.request('AssumeRole', params, requestOption).then((result) => {
       console.log(JSON.stringify(result));
     }, (ex) => {
       console.log(ex);
     })          
     
    # coding=utf-8
    # encoding: utf-8
    import json
    from aliyunsdkcore import client as AliyunSDK
    from aliyunsdksts.request.v20150401 import AssumeRoleRequest
    
    def main():    
        AccessKeySecret='<accessSecret>'
        AccessKeyId='<accessKeyId>'
        regionId ='cn-hangzhou'
    
        sts_client = AliyunSDK.AcsClient(
                AccessKeyId,
                AccessKeySecret,
                regionId)
        request = AssumeRoleRequest.AssumeRoleRequest()
        request.set_RoleArn("<RoleARN>")
        request.set_RoleSessionName('fc-python-sdk')
        response = sts_client.do_action_with_exception(request)
        response_json = json.loads(response)
        result = json.dumps(response_json['Credentials'])
        print(result)
    
    if __name__ == "__main__":
        main()
     
    预期输出。
    {
      "RequestId": "964E0EC5-575B-4FF5-8FD0-D4BD8025602A",
      "AssumedRoleUser": {
        "Arn": "acs:ram::****:role/wss/wss",
        "AssumedRoleId": "***********:wss"
      },
      "Credentials": {
        "SecurityToken": "*************",
        "AccessKeyId": "STS.*************",
        "AccessKeySecret": "*************",
        "Expiration": "2021-05-28T11:23:19Z"
      }
    }
    说明 关于在获取 SecurityToken时可能遇到的常见问题,请参见 RAM角色和STS Token常见问题
  2. 修改阿里云账号B的函数代码如下所示,使其RAM用户有权限查看阿里云账号A下函数计算的所有服务。
    const FC = require('@alicloud/fc2');
    // 构建客户端。
    const client = new FC(<accountID>, {
        region: <yourRegionID>,
        accessKeyID: <yourAccessKeyID>,
        securityToken: <yourSecurityToken>,
        accessKeySecret: <yourAccessKeySecret>
    });
    // 获取服务列表。
    client.listServices().then(res => {
        console.log(JSON.stringify(res, null, ' '))
    }).catch(ex=> console.log(ex))
    注意 临时密钥的授权角色需要有获取服务列表的权限。