账号中的访问策略包括用户组策略、用户策略、存储桶访问控制列表(ACL)和存储桶策略(Policy)等不同的策略类型。在访问策略的评估中,有以下几点关键因素:
1. 用户身份认证:当用户访问 COS 上的资源时,有以下两种情况。
·如果携带请求签名,COS 会从请求签名中解析出用户的账号信息,然后将请求转发给访问管理 CAM 进行身份认证。
·如果未携带签名请求,则会认为是匿名用户进入到下一环节的认证中。
2. 访问策略的类别:访问策略包括用户组、用户、存储桶等多种类型策略,访问策略的类别决定了访问策略的顺序。
3. 策略上下文信息:在处理用户资源访问请求的时候,会根据用户组策略,用户策略,存储桶策略等多种策略内记录的权限详情进行联合判断,最终决定是否请求通过。
一、访问策略评估流程
访问策略评估流程
当腾讯云 COS 收到请求时,首先会确认请求者身份,并验证请求者是否拥有相关权限。验证的过程包括检查用户策略、存储桶访问策略和基于资源的访问控制列表,对请求进行鉴权。
腾讯云 COS 收到请求时,将会首先进行身份认证,根据身份认证的结果,将对请求者身份进行分类,不同的身份类别可能会有不同的表现:
1. 经过验证的腾讯云主账号:主账号具备对其所属资源的所有操作权限。而对于非其所属的资源,则需要评估资源权限,若鉴权通过则被许可访问资源。
2. 经过验证的 CAM 用户(子账号或者协作者):评估用户策略 —— CAM 用户必须具备其父级主账号的授权,才被许可发起相关的访问。如果 CAM 用户需要访问其他主账号所属的资源,则需要评估 CAM 用户所属主账号的资源权限,若鉴权通过则被许可访问资源。
3. 不具备身份特征的匿名用户:评估资源权限 —— 评估在存储桶访问策略或存储桶、对象的访问控制列表的权限,若鉴权通过则被许可访问资源。
4. 上述几类用户以外的请求者:拒绝其访问。
二、访问策略评估依据
在腾讯云权限体系中,在访问策略评估流程中,全程根据策略上下文信息进行权限评估,同时有以下几项基本原则:
1. 在默认情况下,所有请求都被隐式拒绝(deny);主账号默认享有账户下所有资源的访问权限。
2. 如果在用户组策略、用户策略、存储桶策略或者存储桶/对象访问控制列表中存在显式允许时,将覆盖此默认值。
3. 任何策略中的显式拒绝将覆盖任何允许。
4. 生效的权限范围为基于身份的策略(用户组策略、用户策略)和基于资源的策略(存储桶策略或者存储桶/对象访问控制列表)的并集。
注意:说明:
访问策略评估依据如下所示,首先会根据请求中是否携带签名,评估用户是否为匿名用户。如果用户为匿名用户,则会评估策略中是否有拒绝所有人或者允许所有人的策略,并据此判定允许访问或者拒绝访问。如果用户为合法的 CAM 用户或者拥有资源的主账号,则会评估策略中是否有显式拒绝、显式允许或者允许所有人的策略,并据此判定允许访问或者拒绝访问。
三、策略上下文信息
策略上下文信息指的是策略中记录的权限详情,在 最小权限原则 下,用户需要在策略中明确指定以下信息:
·委托人(principal):必须明确指定你需要授予哪些子用户(需要填写用户 ID)、协作者(需要填写用户 ID)、匿名用户或者用户组权限。如果你使用临时密钥进行访问,则不需要指定此项。
·语句(statement):在以下几项参数中明确填写相应的参数。
·效力(effect):必须明确声明该策略是“允许”还是“显式拒绝”,包括 allow 和 deny 两种情况。
·操作(action):必须明确声明该策略允许或拒绝的操作。操作可以是单个 API 操作或者多个 API 操作的集合。
·资源(resource):必须明确声明该策略授权的具体资源。资源是用六段式描述。你可以指定资源范围为指定的文件,例如 exampleobject.jpg,或者指定的目录,例如 examplePrefix/*。除非业务需要,否则请不要随意授予用户访问所有资源的权限,即通配符*。
·条件(condition):描述策略生效的约束条件。条件包括操作符、操作键和操作值。条件值可包括时间、IP 地址等信息。
撰写策略需要按照一定的策略语法撰写,可参见 访问策略语言概述 按照业务所需撰写。用户策略和存储桶策略的编写示例,可分别参见 用户策略语法结构 和 存储桶策略示例。
四、访问策略评估示例
假设主账号 UIN 100000000001(APPID 为 1250000000)为子账号 UIN 100000000011关联了一项用户预设策略,允许该子账号只读主账号下的资源;该用户策略详情如下。此项用户策略允许了该子账号执行所有的List、Get、Head操作以及OptionsObject操作。
{ "version": "2.0", "statement": [ { "action": [ "cos:List*", "cos:Get*", "cos:Head*", "cos:OptionsObject" ], "resource": "*", "effect": "allow" } ]}
同时,主账号在一个私有读写的存储桶examplebucket-1250000000中添加了以下存储桶策略:
{ "statement": [ { "principal": { "qcs": [ "qcs::cam::anyone:anyone" ] }, "effect": "Deny", "action": [ "name/cos:GetObject" ], "resource": [ "qcs::cos:ap-guangzhou:appid/1250000000:examplebucket-1250000000/*" ] } ], "version": "2.0"}
此项存储桶策略显式拒绝了所有用户执行下载对象(GetObject)的操作。因此,在访问策略评估流程中:
1. 如果该子账号携带签名参数请求GetObject时,会根据该请求表示的用户身份匹配对应的用户策略,访问策略评估验证通过。
2. 如果该子账号不携带签名参数请求GetObject时,会被系统判定为匿名请求,会被存储桶策略拒绝访问。