本文介紹如何使用RAM控制臺和SDK獲取阿里云臨時安全令牌STS(Security Token Service)并實現跨賬號授權查看函數計算的資源。
使用示例
企業A開通了函數計算服務,該企業需要企業B代為操作函數計算的資源。同時企業A有如下訴求:
希望能專注于業務系統,僅作為函數計算的所有者,同時,可以授權企業B操作部分業務,例如創建服務、創建函數等。
當企業B的員工加入或離職時,無需做任何權限變更。企業B可以進一步將企業A的資源訪問權限分配給企業B的RAM用戶,并可以精細控制其RAM用戶對資源的訪問或操作權限。
如果雙方合同終止,企業A隨時可以撤銷對企業B的授權。
使用控制臺的操作步驟
假如企業A需要授權企業B的員工訪問函數計算的所有服務。企業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角色?。
您可以訪問安全設置頁面查看阿里云賬號(主賬號)ID。
單擊完成。
單擊關閉。
阿里云賬號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角色。
(可選)撤消授權
如果企業A與企業B的合作終止了,企業A只需要撤銷阿里云賬號B對RAM角色的使用即可。此時阿里云賬號B下的所有RAM用戶對RAM角色的使用權限將被自動撤銷。具體操作如下:
阿里云賬號A登錄RAM控制臺。
在左側導航欄,選擇 。
在角色頁面,單擊目標RAM角色操作列的刪除。
單擊確定。
在刪除RAM角色前,請先為RAM角色移除權限。具體操作,請參見為RAM角色移除權限。
使用SDK的操作步驟
函數計算可以通過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下函數計算的所有服務的權限。
示例如下:
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創建的角色具有獲取服務列表的權限。