使用企業A的阿里雲帳號(主帳號)建立RAM角色並為該角色授權,並將該角色賦予企業B,即可實現使用企業B的主帳號或其RAM使用者(子帳號)訪問企業A的阿里雲資源的目的。
背景資訊
企業A購買了雲訊息佇列 RocketMQ 版服務來開展業務,並希望將部分業務授權給企業B。
需求說明:
A希望能專註於業務系統,僅作為資源Owner;而訊息發布和訂閱等任務委託或授權給企業B。
企業A希望當企業B的員工加入或離職時,無需做任何許可權變更。企業B可以進一步將A的資源存取權限分配給B的RAM使用者(員工或應用),並可以精細控制其員工或應用對資源的訪問和操作許可權。
企業A希望如果雙方合約終止,企業A隨時可以撤銷對企業B的授權。
解決方案
企業A需要授予企業B的員工對雲訊息佇列 RocketMQ 版的資源進行操作。假設企業A和企業B分別有一個阿里雲帳號A和阿里雲帳號B,需要完成以下操作完成企業A和企業B的跨雲帳號授權及資源訪問:
阿里雲帳號A建立一個RAM角色,並根據業務範圍和需求為RAM角色授予對應的許可權,並允許阿里雲帳號B下的RAM使用者扮演該角色。
RAM角色授權完成後,阿里雲帳號B下的RAM使用者通過扮演RAM角色可擷取該角色對應的許可權。RAM使用者可通過以下方式訪問阿里雲帳號A的資源:
通過SDK訪問資源
通過控制台訪問資源
通過API訪問資源
步驟一:建立RAM角色並授權
首先需要使用企業A的阿里雲帳號(主帳號)登入RAM控制台並為企業B的雲帳號建立RAM角色。
具體步驟,請參見建立可信實體為阿里雲帳號的RAM角色。
可選:企業A為剛建立的RAM角色建立自訂策略。
具體步驟,請參見建立自訂權限原則。
目前,雲訊息佇列 RocketMQ 版支援執行個體、Topic和Group粒度的使用權限設定。更多資訊,請參見雲訊息佇列 RocketMQ 版自訂權限原則。
新建立的角色沒有任何許可權,因此企業A必須為該角色添加許可權。可添加系統權限原則或自訂權限原則。
具體步驟,請參見為RAM使用者授權。
使用企業B的阿里雲帳號(主帳號)登入RAM控制台並建立RAM使用者。
具體步驟,請參見為企業B建立RAM使用者。
企業B為RAM使用者添加AliyunSTSAssumeRoleAccess許可權。
具體步驟,請參見為RAM使用者授權。
企業B必須為其主帳號下的RAM使用者添加AliyunSTSAssumeRoleAccess許可權,RAM使用者才能扮演企業A建立的RAM角色。
步驟二:跨雲帳號訪問資源
通過SDK訪問資源
企業B的RAM使用者可通過SDK訪問企業A的雲訊息佇列 RocketMQ 版資源,完成訊息收發功能。SDK訪問有以下兩種配置方式:
配置STS Token:使用STS Token方式,您必須在SDK代碼中提供RAM使用者的AccessKey ID、AccessKey Secret和SecurityToken(臨時安全性權杖),但是SecurityToken有時效性需要不斷更新。使用STS擷取臨時安全性權杖的方法,請參見AssumeRole。
重要STS方式只適用於雲訊息佇列 RocketMQ 版的Java SDK 1.7.8.Final及以上版本。
擷取AccessKey ID和AccessKey Secret,請參見建立AccessKey。
STS Token配置樣本
初始化雲訊息佇列 RocketMQ 版的用戶端時,您只需將擷取到的AccessKey ID、AccessKey Secret和SecurityToken填入到以下屬性中即可:
Properties properties = new Properties(); // 請確保環境變數ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和ALIBABA_CLOUD_SECURITY_TOKEN已設定。 // STS的AccessKey ID。 properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")); // STS的AccessKey Secret。 properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // STS的SecurityToken。 properties.put(PropertyKeyConst.SecurityToken, System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")); // 其他屬性。 properties.put(PropertyKeyConst.NAMESRV_ADDR, "XXX"); ...... Producer client = ONSFactory.createProducer(properties); client.start();
當SecurityToken到期時,調用updateCredential方法動態更新。
Properties properties = new Properties(); // 請確保環境變數ALIBABA_CLOUD_ACCESS_KEY_ID、ALIBABA_CLOUD_ACCESS_KEY_SECRET和ALIBABA_CLOUD_SECURITY_TOKEN已設定。 // STS的AccessKey ID。 properties.put(PropertyKeyConst.AccessKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_ID")); // STS的AccessKey Secret。 properties.put(PropertyKeyConst.SecretKey, System.getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET")); // STS的SecurityToken。 properties.put(PropertyKeyConst.SecurityToken, System.getenv("ALIBABA_CLOUD_SECURITY_TOKEN")); client.updateCredential(properties);
配置ECS執行個體RAM角色:使用ECS執行個體RAM角色的方式,您無需在SDK中配置RAM使用者的AccessKey ID、AccessKey Secret和SecurityToken資訊,只需要輸入建立的RAM角色名稱即可,提高了代碼配置的便利性。但是您需要先將建立的RAM角色與應用程式所部署的ECS執行個體完成綁定,將RAM角色許可權授予ECS執行個體,具體步驟,請參見為執行個體授予RAM角色。
重要ECS執行個體RAM角色方式只適用於雲訊息佇列 RocketMQ 版的Java SDK 1.8.7.3.Final及以上版本。
ECS執行個體RAM角色配置樣本
Properties properties = new Properties(); // 您建立的RAM角色的名稱,並且已將該RAM角色授予ECS執行個體。 properties.put(PropertyKeyConst.RAM_ROLE_NAME,"XXX");
通過控制台訪問資源
企業B的RAM使用者可按照以下步驟登入控制台訪問企業A的雲訊息佇列 RocketMQ 版資源。
在瀏覽器中開啟RAM使用者登入入口。
在RAM使用者登入頁面上,輸入RAM使用者登入名稱稱,單擊下一步,並輸入RAM使用者密碼,然後單擊登入。
說明RAM使用者登入名稱稱的格式為
<$username>@<$AccountAlias>
或<$username>@<$AccountAlias>.onaliyun.com
。<$AccountAlias>
為帳號別名,如果沒有設定帳號別名,則預設值為阿里雲帳號(主帳號)的ID。在阿里雲控制台登入頁面,將滑鼠指標移到右上方頭像上,並在浮層中單擊切換身份。
在阿里雲-角色切換頁面,輸入企業A的企業別名、預設網域名稱或主帳號UID中的任意一種,以及角色名稱,然後單擊提交。
對企業A的雲訊息佇列 RocketMQ 版資源進行操作。
通過API訪問資源
企業B的RAM使用者可通過調用雲訊息佇列 RocketMQ 版提供的API介面訪問企業A的資源。調用API的方法,請參見API調用方式。