全部產品
Search
文件中心

Function Compute:通過RAM角色實現跨雲帳號授權

更新時間:Jul 06, 2024

本文介紹如何使用RAM控制台和SDK擷取阿里雲臨時安全性權杖STS(Security Token Service)並實現跨帳號授權查看Function Compute的資源。

使用樣本

企業A開通了Function Compute服務,該企業需要企業B代為操作Function Compute的資源。同時企業A有如下訴求:

  • 希望能專註於業務系統,僅作為Function Compute的所有者,同時,可以授權企業B操作部分業務,例如建立服務、建立函數等。

  • 當企業B的員工加入或離職時,無需做任何許可權變更。企業B可以進一步將企業A的資源存取權限分配給企業B的RAM使用者,並可以精細控制其RAM使用者對資源的訪問或操作許可權。

  • 如果雙方合約終止,企業A隨時可以撤銷對企業B的授權。

使用控制台的操作步驟

假如企業A需要授權企業B的員工訪問Function Compute的所有服務。企業A和企業B下分別有一個阿里雲帳號A和阿里雲帳號B:

  • 企業A的阿里雲帳號ID為123456789012****,帳號別名(企業別名)為company-a

  • 企業B的阿里雲帳號ID為134567890123****,帳號別名(企業別名)為company-b

步驟一:阿里雲帳號A建立RAM角色

使用阿里雲帳號A建立一個RAM角色,並為RAM角色授予適當的許可權,允許阿里雲帳號B使用該角色,即其他雲帳號選擇阿里雲帳號B。

  1. 使用阿里雲帳號A登入RAM控制台

  2. 在左側導覽列,選擇身份管理 > 角色

  3. 角色頁面,單擊建立角色

  4. 建立角色頁面,選擇可信實體類型為阿里雲帳號,然後單擊下一步

  5. 設定角色fc-admin的資訊。

    1. 輸入角色名稱

    2. 輸入備忘

    3. 選擇其他雲帳號為帳號B的帳號ID。

      說明

      如果您僅允許指定的RAM使用者扮演該RAM角色,而不是阿里雲帳號(主帳號)下的所有RAM使用者,您可以採取以下兩種方式:

  6. 單擊完成

  7. 單擊關閉

  8. 阿里雲帳號A為剛才建立的RAM角色添加AliyunFCReadOnlyAccess許可權。關於如何為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"
    }

步驟二:阿里雲帳號B建立RAM使用者

  1. 使用阿里雲帳號B為其員工建立RAM使用者。關於如何建立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. 將滑鼠移至上方在右上方頭像的位置,單擊切換身份

    1. 輸入RAM角色對應的企業別名(帳號別名)、預設網域名稱或歸屬的阿里雲帳號(主帳號)ID,三者取其一即可。更多資訊,請參見查看和修改預設網域名稱

    2. 輸入RAM角色名稱。更多資訊,請參見查看RAM角色

    更多資訊,請參見扮演RAM角色

(可選)撤消授權

如果企業A與企業B的合作終止了,企業A只需要撤銷阿里雲帳號B對RAM角色的使用即可。此時阿里雲帳號B下的所有RAM使用者對RAM角色的使用許可權將被自動撤銷。具體操作如下:

  1. 阿里雲帳號A登入RAM控制台

  2. 在左側導覽列,選擇身份管理 > 角色

  3. 角色頁面,單擊目標RAM角色操作列的刪除角色

  4. 刪除角色對話方塊,輸入RAM角色名稱,然後單擊刪除角色

說明

在刪除RAM角色前,請先為RAM角色移除許可權。具體操作,請參見為RAM角色移除許可權

使用SDK的操作步驟

Function Compute可以通過STS進行臨時授權訪問。STS是為雲端運算使用者提供臨時存取權杖的Web服務。以下樣本展示,阿里雲帳號B如何擷取查看阿里雲帳號A下所有服務的許可權。

前提條件

建立函數

操作步驟

  1. 使用阿里雲帳號A建立RAM角色,並選擇信任的雲帳號為阿里雲帳號B。

  2. 使用阿里雲帳號B建立RAM使用者,並為其授予扮演RAM角色的許可權。

    具體操作,請參見建立RAM使用者為RAM使用者授權

  3. 在阿里雲帳號B的函數中,輸入以下範例程式碼,擷取臨時訪問憑證。更多資訊,請參見STS SDK概覽AssumeRole

    const Core = require('@alicloud/pop-core');
    
    //構建一個阿里雲用戶端, 用於發起請求。
    /*
        阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
        建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
        本樣本以將AccessKey ID和AccessKey Secret儲存在環境變數中實現身分識別驗證為例。
        在運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
    */
     var client = new Core({
       accessKeyId: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
       accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
       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 -*-
    from alibabacloud_tea_openapi.models import Config
    from alibabacloud_sts20150401.client import Client
    from alibabacloud_sts20150401.models import AssumeRoleRequest
    
    
    def main():
        # 輸入使用者臨時密鑰,包括臨時Token
        # 阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
        # 建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
        # 本樣本以將AccessKey ID和AccessKey Secret儲存在環境變數中實現身分識別驗證為例。
        # 運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
        # 在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET環境變數會自動被設定。
        AccessKeySecret=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_SECRET'))
        AccessKeyId=os.getenv('ALIBABA_CLOUD_ACCESS_KEY_ID')
        regionId ='cn-hangzhou'
    
    
        config = Config(
            access_key_id='<ACCESS-KEY-ID>',
            access_key_secret='<ACCESS-KEY-SECRET>',
            region_id='cn-hangzhou'
        )
        client = Client(config)
    
        assume_role_request = AssumeRoleRequest(
            duration_seconds=3600,
            role_arn='<RoleARN>',
            role_session_name='fc-python-sdk'
        )
        response = client.assume_role(assume_role_request)
        response_json = json.loads(str(response.body).replace("'", "\"")) 
    	  result = json.dumps(response_json) 
    	  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": "2023-05-28T11:23:19Z"
      }
    }
    說明

    擷取SecurityToken時,可能遇到的常見問題,請參見RAM角色和STS Token常見問題

  4. 修改阿里雲帳號B的函數代碼,使其RAM使用者具有查看阿里雲帳號A下Function Compute的所有服務的許可權。

    樣本如下:

    const FC = require('@alicloud/fc2');
    // 構建用戶端。
    // 設定密鑰資訊為擷取的臨時密鑰資訊。/*
        阿里雲帳號AccessKey擁有所有API的存取權限,建議您使用RAM使用者進行API訪問或日常營運。
        建議不要把AccessKey ID和AccessKey Secret儲存到工程代碼裡,否則可能導致AccessKey泄露,威脅您帳號下所有資源的安全。
        本樣本以將AccessKey ID和AccessKey Secret儲存在環境變數中實現身分識別驗證為例。
        運行本樣本前請先在本地環境中設定環境變數ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和ALIBABA_CLOUD_SECURITY_TOKEN。
        在FC Runtime運行環境下,配置執行許可權後,ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和ALIBABA_CLOUD_SECURITY_TOKEN環境變數會自動被設定。
    */
    const client = new FC('<accountID>', {
        region: '<yourRegionID>',
        accessKeyID: process.env['ALIBABA_CLOUD_ACCESS_KEY_ID'],
        securityToken: process.env['ALIBABA_CLOUD_SECURITY_TOKEN'],
        accessKeySecret: process.env['ALIBABA_CLOUD_ACCESS_KEY_SECRET'],
    });
    // 擷取服務列表。
    client.listServices().then(res => {
        console.log(JSON.stringify(res, null, ' '))
    }).catch(ex=> console.log(ex))
    重要

    請確保臨時密鑰的授權角色,即阿里雲帳號A建立的角色具有擷取服務列表的許可權。