本文介紹如何使用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。
使用阿里雲帳號A登入RAM控制台。
在左側導覽列,選擇 。
在角色頁面,單擊建立角色。
在建立角色頁面,選擇可信實體類型為阿里雲帳號,然後單擊下一步。
設定角色fc-admin的資訊。
輸入角色名稱。
輸入備忘。
選擇其他雲帳號為帳號B的帳號ID。
說明如果您僅允許指定的RAM使用者扮演該RAM角色,而不是阿里雲帳號(主帳號)下的所有RAM使用者,您可以採取以下兩種方式:
修改RAM角色的信任策略。具體操作,請參見樣本一:修改RAM角色的可信實體為阿里雲帳號。
修改RAM使用者的角色扮演權限原則。具體操作,請參見能否指定RAM使用者具體可以扮演哪個RAM角色?。
單擊完成。
單擊關閉。
阿里雲帳號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使用者
使用阿里雲帳號B為其員工建立RAM使用者。關於如何建立RAM使用者,請參見建立RAM使用者。
阿里雲帳號B為建立好的RAM使用者添加AliyunSTSAssumeRoleAccess許可權,即允許RAM使用者扮演RAM角色。關於如何為RAM使用者添加許可權,請參見為RAM使用者授權。
步驟三:切換身份登入
當阿里雲帳號B下的某個員工(RAM使用者)需要訪問阿里雲帳號A下的資源時,阿里雲帳號B可以自主進行授權控制。即阿里雲帳號B下的RAM使用者扮演阿里雲帳號A下的RAM角色訪問阿里雲帳號A下的資源。具體操作如下:
使用阿里雲帳號B的RAM使用者登入RAM控制台。
關於RAM使用者登入控制台的詳細資料,請參見RAM使用者登入阿里雲控制台。
將滑鼠移至上方在右上方頭像的位置,單擊切換身份。
輸入RAM角色對應的企業別名(帳號別名)、預設網域名稱或歸屬的阿里雲帳號(主帳號)ID,三者取其一即可。更多資訊,請參見查看和修改預設網域名稱。
輸入RAM角色名稱。更多資訊,請參見查看RAM角色。
更多資訊,請參見扮演RAM角色。
(可選)撤消授權
如果企業A與企業B的合作終止了,企業A只需要撤銷阿里雲帳號B對RAM角色的使用即可。此時阿里雲帳號B下的所有RAM使用者對RAM角色的使用許可權將被自動撤銷。具體操作如下:
阿里雲帳號A登入RAM控制台。
在左側導覽列,選擇 。
在角色頁面,單擊目標RAM角色操作列的刪除角色。
在刪除角色對話方塊,輸入RAM角色名稱,然後單擊刪除角色。
在刪除RAM角色前,請先為RAM角色移除許可權。具體操作,請參見為RAM角色移除許可權。
使用SDK的操作步驟
Function Compute可以通過STS進行臨時授權訪問。STS是為雲端運算使用者提供臨時存取權杖的Web服務。以下樣本展示,阿里雲帳號B如何擷取查看阿里雲帳號A下所有服務的許可權。
前提條件
操作步驟
使用阿里雲帳號A建立RAM角色,並選擇信任的雲帳號為阿里雲帳號B。
具體操作,請參見建立可信實體為阿里雲帳號的RAM角色。
使用阿里雲帳號B建立RAM使用者,並為其授予扮演RAM角色的許可權。
在阿里雲帳號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常見問題。修改阿里雲帳號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建立的角色具有擷取服務列表的許可權。