当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(隐式拒绝),访问均会被拒绝。