SCP原理介绍
SCP分类
SCP按照策略创建者可分为两类,分别是系统策略和自定义策略。
- 系统策略
华为云服务在组织预置了常用SCP,称为系统策略。组织管理员给组织单元或账号绑定SCP时,可以直接使用这些策略。系统策略只能使用,不能修改。现有的SCP系统策略请参见:SCP系统策略列表。
- 自定义策略
如果系统策略无法满足授权要求,管理账号可以根据各服务支持的授权项,自行创建和修改自定义策略。自定义策略是对系统策略的扩展和补充。目前Organizations云服务支持策略编辑器和JSON视图两种自定义策略配置方式。
权限控制原理
- 划定权限边界
SCP不直接进行授权,只划定权限边界。将SCP绑定到组织单元或者成员账号时,并没有直接对组织单元或成员账号授予操作权限,而是规定了成员账号或组织单元包含的成员账号的授权范围。IAM策略授予权限的有效性受SCP限制,只有在SCP允许范围内的权限才能生效。SCP禁止的权限操作,即便授予IAM用户权限,用户也不能执行相关操作。
比如成员账号A绑定了某一条SCP,SCP允许操作A的权限,拒绝操作B的权限。那么成员账号A可以给自己名下的IAM用户授予操作A的权限,不能授予操作B的权限,即便授予了操作B的权限,也无法生效。
- 交集有效
权限边界的叠加遵从交集有效准则,父OU的SCP与子OU(或账号)的SCP共同允许的权限,作为子OU的最终权限边界。
如下图所示,左侧的椭圆表示附加到父OU的SCP,它允许权限A、B和C。右侧椭圆表示子OU(或账号)绑定SCP允许的权限,子OU(或账号)允许权限C、D和E。由于附加到父OU的SCP不允许D或E,因此父OU下的所有子OU和账号都不能使用它们,即使子OU的SCP明确允许D和E,它们最终仍然会被父OU的SCP阻止。子OU(或账号)的SCP不允许A或B,因此, 子OU(或账号)将阻止这些权限。最终,子OU的权限是父OU权限和子OU(或账号)绑定SCP的权限交集,即下图中的权限C。
如果椭圆右侧是一个成员账号,则交集是授予该账号中的用户和用户组的最大权限集合。如果椭圆右侧是OU,则交集是该子OU可继承的最大权限集合。
图1 SCP原理图
- 筛选继承
组织单元或账号绑定的SCP包括两部分,直接绑定的策略和继承的策略。某组织单元绑定的SCP,会继承给该组织单元下的所有子级OU和账号。账号和组织单元的权限边界,由所有上级OU的SCP和自身直接绑定的SCP共同决定。如下图所示,Account y隶属于OU3,Account y的权限边界是由继承自Root,OU1和OU3的SCP与Account y绑定的SCP共同决定。
图2 SCP继承规则
如果要在成员账号级别允许使用某个云服务的操作,则必须在账号和根组织单元之间的每个层级上允许该操作。这意味着,必须在根组织单元和账号之间的每个层级,附加允许该操作的SCP。您可以使用下列任一策略执行此操作:
- 添加拒绝策略。拒绝策略会使用默认附加到每个OU和账号上的FullAccess SCP。此SCP将覆盖默认的隐式Deny,并明确允许所有权限从根组织单元传递到每个账号,除非创建并附加到相应OU或账号的其他SCP明确了拒绝权限。策略中的显式Deny始终优先于Allow。具有拒绝策略的OU层级以下的任何账号都不能使用被拒绝的操作,也无法在组织结构中较低的层级中添加该权限。
- 添加允许策略。添加允许策略并删除默认附加到每个OU和账号的FullAccess SCP后,除非策略中明确允许,否则任何OU和账号都不允许任何操作权限。要允许使用某个云服务的操作,必须创建SCP并将它们附加到账号及其层级之上的每个OU,直至附加到根组织单元为止(包括根组织单元)。层次结构中的每个SCP(从根组织单元开始)必须明确允许在OU及其下面的账号中使用该操作。SCP中的显式Allow会覆盖隐式Deny。
- 拒绝优先
当组织单元和账号绑定多条SCP时,账号权限优先遵从拒绝语句。比如成员账号A同时绑定了两条SCP,分别是允许全部操作和禁止查看账单操作。此时执行查看账单操作,鉴权规则会优先遵从拒绝操作,即成员账号A不能查看账单。详细说明请参考显式拒绝和隐式拒绝的区别。
- 默认允许
组织启用SCP时,默认会为所有OU和账号附加全部权限(FullAccess策略),默认允许所有操作。除非您为OU或账号附加其他的明确拒绝策略。
显式拒绝和隐式拒绝的区别
Effect(效果)包含两种:Allow(允许)和Deny(拒绝),分别表示允许或拒绝执行某操作的权限。
当没有策略设置权限为Allow和Deny时,默认情况即为Deny权限,称为隐式拒绝。当有策略授权Allow权限,且没有其他策略Deny该权限时,Allow的权限才能生效。
如果策略设置权限为Deny,则为显式拒绝。显式的Deny始终优先于Allow。例如,父OU的SCP,它允许权限A、B和C,但是子OU的SCP允许权限A、B,拒绝权限C,则该子OU的账号以及以下层级的账号,均无法使用权限C。
用户在发起访问请求时,鉴权规则如下:
- 用户发起访问请求。
- 系统优先寻找Deny指令。如果找到一个适用的Deny指令,系统将返回Deny决定。
- 如果没有找到Deny指令,系统将寻找适用于请求的任何Allow指令。如果找到一个Allow指令,系统将返回Allow决定。
- 如果找不到Allow指令,最终决定为Deny,鉴权结束。