天天看點

阿裡雲身份管理與通路控制之信任管理: 角色扮演, 臨時身份和安全令牌

本文介紹了阿裡雲通路控制中的角色扮演和臨時身份特性。這兩個特性幫助客戶管理好對合作夥伴, 雲服務協同應用, 以及客戶應用服務的信任與通路授權, 構成了阿裡雲安全受控的合作生态的技術基礎設施的一部分。

信任管理

雲平台中的資源, 我們可以授權給信任的員工, 合作夥伴, 平台服務, 我們自己部署的應用等不同的身份來通路.

  1. 合作夥伴A來負責代運維一組Linux伺服器, 除此以外不能通路其他資源; 合作夥伴B來負責維護RDB服務, 除此以外不能通路其他資源;
  2. 授權給阿裡雲的多媒體處理服務來處理存放在OSS中指定目錄中的圖檔和視訊, 但不能通路其他目錄裡中的資源.
  3. 部署在ECS中的運維工具, 能夠根據負載變動情況, 自動關閉一些ECS機器, 或自動更新或啟動一些ECS機器.

這些應用場景中的信任管理, 都是通過角色扮演和臨時身份實作的.

角色扮演

阿裡雲賬号中的資源分權通路, 對于員工可以使用子使用者來實作. 對于不适合子使用者(含子使用者組)授權的情況, 采取基于角色扮演的授權方法更安全便捷.

比如, 合作夥伴幫助做運維時, 會在他們自己的主賬号中管理自身的員工子使用者, 我們所需要做的是建立一個(或多個)與他們的主賬号綁定的角色,  并把角色與合适的通路控制政策綁定.

如上圖,我們的主賬号為A1,兩家服務商的主賬号分别為P1和P2。在我們的通路控制管理界面上,我們可以建立角色A1P11和A1P21,分别綁定了子賬号P1和P2。服務商P1可以在自己的通路控制管理界面上,授予其子使用者P1U1、P1U2、P1U3等扮演角色A1P11的權限;服務商P2可以在自己的通路控制管理界面上,授予其子使用者P2U1、P2U2、P2U3等扮演角色A1P21的權限。

角色A1P11、A1P21能通路哪些資源,由A1通過關聯通路控制政策來設定;哪些人能扮演角色,由合作方P1、P2分别控制。

這種基于角色扮演的代理授權方式, 是一種安全而又便捷的信任管理方式. 阿裡雲為角色切換及操作過程提供了操作記錄供安全審計, 進一步提升了可追溯性和安全性.

角色扮演(或角色切換)的過程, 隐含了建立臨時身份(臨時子使用者)的過程. 跨賬号的角色是賬号對賬号的關系, 并不會限制實際的扮演者是合作賬号内的哪一個子使用者.

當合作賬号内的某個子使用者開始扮演角色時, 系統會在我們的賬号内建立一個臨時的子使用者. 當合作賬号内的另一個子使用者開始扮演角色時, 系統會建立另外一個臨時的子使用者. 當合作賬号的子使用者完成了工作, 退出所扮演的角色時, 臨時子使用者的生命周期就結束了 (不再可用, 但仍然存在于操作記錄中).

臨時身份和令牌

通過管理控制台進行角色扮演和角色切換過程中建立的臨時身份是不可見的。在基于API的通路中, 臨時身份以令牌的形式存在, 對API的開發者使用者而言是必須了解的概念.

通過STS (Security Token Service)建立的臨時身份也叫做令牌,是有過期時間的安全通路憑證。它的臨時身份資訊由Access Key和Security Token組成。其中Access Key包括Key ID和Key Secret,用于API請求的簽名。

在常見的API的通路控制中,一般隻使用Security Token即可實作安全身份管理,比如網際網路開放平台上最常用的通路控制規範oauth2(不使用MAC signature時);而在雲平台中,對API請求簽名,能進一步提高安全性。

在阿裡雲OpenAPI中, 令牌的建立需要調用API assumeRole.

client = AcsClient(access_key_id, access_key_secret, region_id)
sts_request = AssumeRoleRequest.AssumeRoleRequest()
sts_request.set_RoleArn(role_arn)
sts_request.set_RoleSessionName(sts_session_name)

sts_response_str = client.do_action_with_exception(sts_request)
sts_response_json = json.loads(sts_response_str)
sts_cred_dict = sts_response_json['Credentials']
sts_cred = credentials.StsTokenCredential(
    sts_access_key_id=sts_cred_dict['AccessKeyId'],
    sts_access_key_secret=sts_cred_dict['AccessKeySecret'],
    sts_token=sts_cred_dict['SecurityToken']
)           

獲得了令牌以後, 就可以用于調用阿裡雲的其他的OpenAPI了, 比如下面的例子, 調用ECS API列出ECS 執行個體清單.

stsClient = AcsClient(region_id=region_id, credential=sts_cred)
request = DescribeInstancesRequest.DescribeInstancesRequest()
request.set_PageSize(50)
response = stsClient.do_action_with_exception(request)           

完整的代碼請參考

https://gitee.com/iam2cloud/acs_ram_demo

.

雲服務協同, ECS上的應用與角色扮演

前面我們提到了使用者(子使用者)扮演角色; 此外, 雲平台所提供的服務之間協作時, 我們所訂購的服務A要去自動通路服務B或C時, 我們就需要建立一個合适的角色, 該角色允許操作服務B的資源, 并授信服務A來扮演該角色. 服務A在背景會自動依據所授予的角色來調用STS服務, 生成臨時身份和令牌, 用于調用服務B或C的API.

目前已經可以支援這種授權方式的服務有:  多媒體轉碼服務, 歸檔存儲服務, 日志服務, API網關服務, 函數計算服務.

雲平台提供的這些服務, 可以通過該服務的管理控制台或OpenAPI來配置所授予的服務角色, 服務擷取臨時身份和令牌的過程是不可見的.

與雲平台提供的服務相比, ECS執行個體中的應用服務是一種特殊的服務, 由客戶自己負責部署. ECS執行個體中的應用服務要通過平台的API通路雲資源時, 可以通過ECS執行個體的中繼資料服務來擷取臨時身份和安全令牌.

阿裡雲平台中的ECS執行個體通過以下位址通路其metadata:

curl http://100.100.100.200/latest/meta-data/

其中, 該執行個體所扮演的角色所生成的臨時身份和安全令牌路徑為:

ram/security-credentials/[role-name]

下面的代碼是一個完整的例子:

$curl http://100.100.100.200/latest/meta-data/ram/security-credentials/ecs-i-1
 {
  "AccessKeyId" : "STS.123",
  "AccessKeySecret" : "123456",
  "Expiration" : "2018-06-01T15:44:32Z",
  "SecurityToken" : "C1111111111111111111111111111111111111111111111111111111111111111==",
  "LastUpdated" : "2018-06-01T09:44:32Z",
  "Code" : "Success"
}           

參考文檔

  1. 角色身份的概念了解 https://help.aliyun.com/document_detail/28649.html
  2. 合作夥伴間(跨主賬号)基于角色扮演的授權管理場景  https://help.aliyun.com/document_detail/28658.html
  3. STS SDK Python示例 https://help.aliyun.com/document_detail/28797.html
  4. 函數計算中的服務角色授權示例 https://yq.aliyun.com/articles/152077
  5. 通過控制台授予ECS 執行個體服務角色 https://help.aliyun.com/document_detail/61175.html
  6. 移動應用APP使用臨時身份和安全令牌的解決方案 https://help.aliyun.com/document_detail/28657.html. 需要注意的是, 這個解決方案在實作移動APP從背景服務端擷取臨時身份和安全令牌時, 還需要保證背景服務需要保證對移動APP進行身份識别并保證傳送過程的加密安全.