您可以為可信實體為阿里雲帳號、阿里雲服務或身份供應商的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為
123456789098****
,帳號別名(企業別名)為company-a
。企業B的阿里雲帳號ID為
234567890987****
,帳號別名(企業別名)為company-b
。
企業A使用阿里雲帳號A登入RAM控制台。
在左側導覽列,選擇 。
在角色頁面,單擊建立角色。
在建立角色頁面,配置相關資訊。
在選擇類型設定精靈,選擇選擇可信實體類型為阿里雲帳號,然後單擊下一步。
在配置角色設定精靈,輸入角色名稱為
sae-admin
,輸入備忘,選擇選擇信任的雲帳號為其他雲帳號,並輸入企業B的阿里雲帳號B。重要如果您僅允許指定的RAM使用者扮演該RAM角色,而不是阿里雲帳號(主帳號)下的所有RAM使用者,您可以採取以下兩種方式:
修改RAM角色的信任策略。具體操作,請參見樣本一:修改RAM角色的可信實體為阿里雲帳號。
修改RAM使用者的角色扮演權限原則。具體操作,請參見能否指定RAM使用者具體可以扮演哪個RAM角色?。
配置完成後,單擊完成。
如果頁面跳轉至建立完成設定精靈頁面,表示成功建立角色。您可以在該角色的基本資料頁面,查看包括RAM角色名稱、建立時間和ARN等具體資訊。
RAM角色名稱:sae-admin。
ARN:
acs:ram::123456789098****:role/sae-admin
。信任策略:
說明以下策略表示僅允許阿里雲帳號B下的RAM使用者來扮演該RAM角色。
{ "Statement": [ { "Action": "sts:AssumeRole", "Effect": "Allow", "Principal": { "RAM": [ "acs:ram::234567890987****:root" ] } } ], "Version": "1" }
步驟二:企業A為RAM角色添加許可權
企業A使用阿里雲帳號A登入RAM控制台。
在左側導覽列,選擇 。
在角色頁面,單擊目標RAM角色操作列的新增授權。
您也可以選中多個RAM角色,單擊角色列表下方的新增授權,為RAM角色大量授權。
在新增授權面板,為RAM角色授權。
選擇資源範圍。
帳號層級:許可權在當前阿里雲帳號內生效。
資源群組層級:許可權在指定的資源群組內生效。
說明指定資源群組授權生效的前提是該雲端服務及資源類型已支援資源群組,詳情請參見支援資源群組的雲端服務。
選擇授權主體。
授權主體即需要添加許可權的RAM角色。系統會自動選擇當前的RAM角色。
選擇權限原則。
權限原則是一組存取權限的集合。支援批量選中多條權限原則。
系統策略:由阿里雲建立,策略的版本更新由阿里雲維護,使用者只能使用不能修改。更多資訊,請參見支援RAM的雲端服務。
說明系統會自動標識出高風險系統策略(例如:AdministratorAccess、AliyunRAMFullAccess等),授權時,盡量避免授予不必要的高風險權限原則。
自訂策略:由使用者管理,策略的版本更新由使用者維護。使用者可以自主建立、更新和刪除自訂策略。更多資訊,請參見建立自訂權限原則。
單擊確認新增授權。
單擊關閉。
步驟三:企業B建立RAM使用者
企業B使用阿里雲帳號B登入RAM控制台。
在左側導覽列,選擇 。
在使用者頁面,單擊建立使用者。
在建立使用者頁面的使用者帳號資訊地區,設定使用者基本資料。
登入名稱稱:可包含英文字母、數字、半形句號(.)、短劃線(-)和底線(_),最多64個字元。
顯示名稱:最多包含128個字元或漢字。
標籤:單擊,然後輸入標籤鍵和標籤值。為RAM使用者綁定標籤,便於後續基於標籤的使用者管理。
說明單擊添加使用者,可以大量建立多個RAM使用者。
在訪問方式地區,選擇訪問方式,然後設定對應參數。
為了帳號安全,建議您只選擇以下訪問方式中的一種,將人員使用者和應用程式使用者分離,避免混用。
控制台訪問
如果RAM使用者代表人員,建議啟用控制台訪問,使用使用者名稱和登入密碼訪問阿里雲。您需要設定以下參數:
控制台登入密碼:選擇自動產生密碼或者自訂密碼。自訂登入密碼時,密碼必須滿足密碼複雜度規則。更多資訊,請參見設定RAM使用者密碼強度。
密碼重設策略:選擇RAM使用者在下次登入時是否需要重設密碼。
多因素認證(MFA)策略:選擇是否為當前RAM使用者啟用MFA。啟用MFA後,主帳號還需要為RAM使用者綁定MFA裝置或RAM使用者自行綁定MFA裝置。更多資訊,請參見為RAM使用者綁定MFA裝置。
OpenAPI調用訪問
如果RAM使用者代表應用程式,建議啟用OpenAPI調用訪問,使用存取金鑰(AccessKey)訪問阿里雲。啟用後,系統會自動為RAM使用者產生一個AccessKey ID和AccessKey Secret。更多資訊,請參見建立AccessKey。
重要RAM使用者的AccessKey Secret只在建立時顯示,不支援查看,請妥善保管。
單擊確定。
步驟四:企業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範例程式碼擷取訪問憑證。
更多資訊,請參見Java樣本和AssumeRole。
import com.aliyuncs.DefaultAcsClient; import com.aliyuncs.IAcsClient; import com.aliyuncs.exceptions.ClientException; import com.aliyuncs.exceptions.ServerException; import com.aliyuncs.profile.DefaultProfile; import com.google.gson.Gson; import java.util.*; import com.aliyuncs.sts.model.v20150401.*; public class AssumeRole { public static void main(String[] args) { //構建一個阿里雲用戶端,用於發起請求。 //請確保代碼運行環境設定了環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。 DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); IAcsClient client = new DefaultAcsClient(profile); //構造請求,設定參數。關於參數含義和設定方法,請參見API參考。 AssumeRoleRequest request = new AssumeRoleRequest(); request.setRegionId("cn-hangzhou"); request.setRoleArn("<RoleArn>"); request.setRoleSessionName("<RoleSessionName>"); //發起請求,並得到響應。 try { AssumeRoleResponse response = client.getAcsResponse(request); System.out.println(new Gson().toJson(response)); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { System.out.println("ErrCode:" + e.getErrCode()); System.out.println("ErrMsg:" + e.getErrMsg()); System.out.println("RequestId:" + e.getRequestId()); } } }
說明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" } }
依據所返回的存取金鑰等資訊,在阿里雲帳號B的代碼中,產生新的Client,使其RAM使用者有許可權查看阿里雲帳號A下SAE華東1(杭州)地區的所有命名空間服務。
public class CreateNamespace { public static void main(String[] args) { DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"), System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); IAcsClient client = new DefaultAcsClient(profile); CommonRequest request = new CommonRequest(); request.setMethod(MethodType.POST); request.setDomain("sae.cn-hangzhou.aliyuncs.com"); request.setVersion("2019-05-06"); request.setUriPattern("/pop/v1/paas/namespace"); request.putHeadParameter("Content-Type", "application/json"); String requestBody = "" + "{}"; request.setHttpContent(requestBody.getBytes(), "utf-8", FormatType.JSON); try { CommonResponse response = client.getCommonResponse(request); System.out.println(response.getData()); } catch (ServerException e) { e.printStackTrace(); } catch (ClientException e) { e.printStackTrace(); } } }
撤銷授權
若企業A與企業B的合作終止,企業A只需移除為阿里雲帳號B建立的RAM角色的許可權並刪除該角色,那麼阿里雲帳號B下的所有RAM使用者將失去以RAM角色的身份訪問阿里雲帳號A資源的能力。
在刪除RAM角色前,需要先為RAM角色移除授權。具體操作,請參見為RAM角色移除許可權。
企業A使用阿里雲帳號A登入RAM控制台。
在左側導覽列,選擇 。
在角色頁面,單擊目標RAM角色操作列的刪除角色。
在刪除角色對話方塊,輸入RAM角色名稱,然後單擊刪除角色。
如果RAM角色被授予了權限原則,刪除角色時,會同時解除授權。
對於刪除失敗的任務,您可以在角色列表的右上方,單擊角色刪除任務,查看詳情。