當RAM身份(RAM用戶或RAM角色)通過阿里云控制臺、API或CLI發起資源訪問請求時,都需要執行權限策略的判定流程,根據判定結果決定是否允許訪問。本文為您介紹阿里云的權限策略判定流程。
概述
阿里云支持多種類型的權限策略。一次完整的權限策略判定流程包含以下步驟:
判定程序收集訪問請求涉及的所有類型的權限策略,包括:資源目錄的管控策略(Control Policy)、RAM角色的會話策略(Session Policy)、基于身份的策略(Identity-based Policy)和基于資源的策略(Resource-based Policy)。
判定程序會按照最小單元判定流程依次對每一種權限策略執行判定,根據判定結果決定是否繼續進行下一步判定,直到判定結束并獲得最終的判定結果。
最小單元判定流程
每種類型的權限策略都會按照下圖所示的流程進行權限判定,這個流程稱為最小單元判定流程。
最小單元判定流程如下:
權限判定遵循Deny優先原則,優先檢查訪問請求是否命中Deny語句。
是:判定結束,返回判定結果為Explicit Deny(顯式拒絕)。
否:繼續下一步判定。
檢查訪問請求是否命中Allow語句。
是:判定結束,返回判定結果為Allow(允許)。
否:判定結束,返回判定結果為Implicit Deny(隱式拒絕)。
判定結果說明如下表所示。
判定結果 | 說明 |
Allow(允許) | 如果訪問請求命中了權限策略中的Allow語句,且沒有命中Deny語句,那么本次判定結果是Allow(允許)。 |
Explicit Deny(顯式拒絕) | 一旦訪問請求命中了權限策略中的Deny語句,那么本次判定結果是Explicit Deny(顯式拒絕)。即使此時訪問請求同時命中了Allow語句,但遵循Deny優先原則,Deny語句優先級高于Allow語句,判定結果仍為顯式拒絕。 |
Implicit Deny(隱式拒絕) | 如果訪問請求既沒有命中權限策略中的Allow語句,也沒有命中Deny語句,那么本次判定結果是Implicit Deny(隱式拒絕)。RAM身份默認沒有執行任何操作的權限,沒有被顯式允許執行的操作都會被隱式拒絕。 |
完整判定流程
完整的判定流程會按照下圖所示的順序依次對每一種權限策略進行判定,并獲得最終判定結果。
阿里云的絕大多數云服務都按照阿里云賬號維度進行隔離,只能在單個阿里云賬號內部執行操作,但也有個別云服務(例如:對象存儲OSS)允許直接進行跨賬號訪問。無論哪種情況,阿里云都遵循同樣的權限判定流程。
完整判定流程如下:
管控策略判定
管控策略(Control Policy)是資源目錄中對成員訪問定義的權限邊界。如果請求訪問的資源所屬賬號是資源目錄的成員,并且管控策略已開啟,判定程序會按照最小單元判定流程執行管控策略判定。否則,判定程序會跳過此步。
根據管控策略的判定結果,作出下一步判定。具體如下:
管控策略的判定結果是Explicit Deny(顯式拒絕)或Implicit Deny(隱式拒絕):判定結束,管控策略的判定結果就是最終的判定結果。
管控策略的判定結果是Allow(允許):繼續進行下一步判定。
重要管控策略對所有資源目錄成員中的RAM用戶和RAM角色生效,但對成員的根用戶不生效。同時,資源目錄的管理賬號位于資源目錄外部,不歸屬于資源目錄,所以管控策略對管理賬號內的所有身份也不生效。
會話策略判定
會話策略(Session Policy)是在以編程方式扮演RAM角色(調用AssumeRole API)的過程中創建臨時會話時,在參數中傳遞的策略,用于進一步限制會話的權限。如果發起訪問請求的身份是RAM角色,并且擁有會話策略,判定程序會按照最小單元判定流程執行會話策略判定。否則,判定程序會跳過此步。
根據會話策略的判定結果,作出下一步判定。具體如下:
會話策略的判定結果是Explicit Deny(顯式拒絕)或Implicit Deny(隱式拒絕):判定結束,會話策略的判定結果就是最終的判定結果。
會話策略的判定結果是Allow(允許):繼續進行下一步判定。
基于身份的策略判定和基于資源的策略判定
同時進行基于身份的策略(Identity-based Policy)判定和基于資源的策略(Resource-based Policy)判定,并將兩者的判定結果緩存。
基于身份的策略判定
對于RAM用戶,基于身份的策略包括直接授權的策略和從RAM用戶組中繼承的策略。對于RAM角色,基于身份的策略為直接授權的策略。基于身份的策略因授權范圍不同,又分為賬號級別和資源組級別,賬號級別的策略優先級高于資源組級別的策略。
基于資源的策略判定
檢查請求訪問的資源是否擁有基于資源的策略。
是:判定程序按照最小單元判定流程執行基于資源的策略判定,并將結果緩存到判定結果B。
否:直接保存判定結果B為Implicit Deny(隱式拒絕)。
說明目前阿里云提供了兩種基于資源的策略:OSS存儲空間策略(Bucket Policy)和RAM角色的信任策略(Trust Policy)。如果請求訪問的不是以上兩種資源,則不會進行基于資源的策略判定,而直接將基于身份的策略判定結果作為最終結果。
合并判定結果
將基于身份策略的判定結果A和基于資源策略的判定結果B進行合并。合并邏輯如下:
如果判定結果A和判定結果B中存在任意一個Explicit Deny(顯式拒絕):合并后的最終判定結果為Explicit Deny(顯式拒絕),判定結束。
如果判定結果A和判定結果B中存在任意一個Allow(允許):合并后的最終判定結果為Allow(允許),判定結束。
如果判定結果A和B中既無Explicit Deny(顯式拒絕)也無Allow(允許):合并后的最終判定結果為Implicit Deny(隱式拒絕),判定結束。
說明合并判定結果的邏輯由資源所屬的云服務決定,也可能存在上述以外的情況。例如:扮演RAM角色時的權限策略判定流程。
OSS的權限判定,在合并判定結果之后還需要繼續進行Bucket或Object ACL相關判定。OSS的完整權限判定流程,請參見OSS鑒權詳解。
如果最終判定結果是Allow(允許),訪問會被允許。不管最終判定結果是Explicit Deny(顯式拒絕)還是Implicit Deny(隱式拒絕),訪問均會被拒絕。