访问策略评估流程

最后更新时间:2020-10-16 15:17:20

    访问 COS 存储桶及存储桶内资源时需要经过授权后才可进行访问。在腾讯云的权限体系中,资源所属的主账号默认对存储桶及存储桶内的资源拥有所有管理权限。CAM 用户(其他主账号、协作者、子账号)以及匿名用户等其他类型用户,需要经过主账号授权后才可进行访问。

    账户中的访问策略包括用户组策略、用户策略、存储桶访问控制列表(ACL)和存储桶策略(Policy)等不同的策略类型。在访问策略的评估中,有以下几点关键因素:

    1. 用户身份认证:当用户访问 COS 上的资源时,有以下两种情况。
      • 如果携带请求签名,COS 会从请求签名中解析出用户的账号信息,然后将请求转发给访问管理 CAM 进行身份认证。
      • 如果未携带签名请求,则会认为是匿名用户进入到下一环节的认证中。
    2. 访问策略的类别:访问策略包括用户组、用户、存储桶等多种类型策略,访问策略的类别决定了访问策略的顺序。
    3. 策略上下文信息:在处理用户资源访问请求的时候,会根据用户组策略,用户策略,存储桶策略等多种策略内记录的权限详情进行联合判断,最终决定是否请求通过。

    访问策略评估流程

    当腾讯云 COS 收到请求时,首先会确认请求者身份,并验证请求者是否拥有相关权限。验证的过程包括检查用户策略、存储桶访问策略和基于资源的访问控制列表,对请求进行鉴权。

    腾讯云 COS 收到请求时,将会首先进行身份认证,根据身份认证的结果,将对请求者身份进行分类,不同的身份类别可能会有不同的表现:

    1. 经过验证的腾讯云主账号:主账号具备对其所属资源的所有操作权限。而对于非其所属的资源,则需要评估资源权限,若鉴权通过则被许可访问资源。
    2. 经过验证的 CAM 用户(子账号或者协作者):评估用户策略 —— CAM 用户必须具备其父级主账号的授权,才被许可发起相关的访问。如果 CAM 用户需要访问其他主账号所属的资源,则需要评估 CAM 用户所属主账号的资源权限,若鉴权通过则被许可访问资源。
    3. 不具备身份特征的匿名用户:评估资源权限 —— 评估在存储桶访问策略或存储桶、对象的访问控制列表的权限,若鉴权通过则被许可访问资源。
    4. 上述几类用户以外的请求者:拒绝其访问。

    访问策略评估流程

    访问策略评估依据

    在腾讯云权限体系中,在访问策略评估流程中,全程根据策略上下文信息进行权限评估,同时有以下几项基本原则:

    1. 在默认情况下,所有请求都被隐式拒绝(deny);主账号默认享有账户下所有资源的访问权限。
    2. 如果在用户组策略、用户策略、存储桶策略或者存储桶/对象访问控制列表中存在显式允许时,将覆盖此默认值。
    3. 任何策略中的显式拒绝将覆盖任何允许。
    4. 生效的权限范围为基于身份的策略(用户组策略、用户策略)和基于资源的策略(存储桶策略或者存储桶/对象访问控制列表)的并集。

    说明:

    • 显式拒绝:在用户策略、用户组策略、存储桶 Policy 中针对特定用户有明确的 Deny 策略;如主账号在用户策略中明确配置 Deny 子用户 UIN 100000000011进行GET Object操作,那该子用户无法下载该主账号下的对象资源。
    • 显式允许:在用户策略、用户组策略、存储桶 Policy、存储桶 ACL 中通过grant-\*明确指定特定用户针对特定用户有明确的 Allow 策略。
    • 拒绝所有人:在存储桶 Policy 中明确指定Deny anyone;拒绝所有人后,任意不带签名的请求会被拒绝掉;携带签名的请求会以基于身份的策略进行鉴权。
    • 允许所有人:在存储桶 Policy 中明确指定Allow anyone,或者在存储桶 ACL 中明确指定public-\*
    • 生效权限范围为基于身份策略和基于资源策略的并集:在一次完整的鉴权中,COS 将会首先解析用户身份,按照用户身份进行权限校验他有权限访问的资源;同时根据基于资源策略,将用户视为匿名用户进行权限校验;两次校验中有一次校验成功即可允许访问。

    访问策略评估依据如下图所示,首先会根据请求中是否携带签名,评估用户是否为匿名用户。如果用户为匿名用户,则会评估策略中是否有拒绝所有人或者允许所有人的策略,并据此判定允许访问或者拒绝访问。如果用户为合法的 CAM 用户或者拥有资源的主账号,则会评估策略中是否有显式拒绝、显式允许或者允许所有人的策略,并据此判定允许访问或者拒绝访问。

    策略上下文信息

    策略上下文信息指的是策略中记录的权限详情,在 最小权限原则 下,用户需要在策略中明确指定以下信息:

    • 委托人(principal):必须明确指定您需要授予哪些子用户(需要填写用户 ID)、协作者(需要填写用户 ID)、匿名用户或者用户组权限。如果您使用临时密钥进行访问,则不需要指定此项。
    • 语句(statement):在以下几项参数中明确填写相应的参数。
    • 效力(effect):必须明确声明该策略是“允许”还是“显式拒绝”,包括 allow 和 deny 两种情况。
    • 操作(action):必须明确声明该策略允许或拒绝的操作。操作可以是单个 API 操作或者多个 API 操作的集合。
    • 资源(resource):必须明确声明该策略授权的具体资源。资源是用六段式描述。您可以指定资源范围为指定的文件,例如exampleobject.jpg,或者指定的目录,例如examplePrefix/*。除非业务需要,否则请不要随意授予用户访问所有资源的权限,即通配符*。
    • 条件(condition):描述策略生效的约束条件。条件包括操作符、操作键和操作值组成。条件值可包括时间、IP 地址等信息。

    撰写策略需要按照一定的策略语法撰写,可参见 访问策略语言概述 按照业务所需撰写。用户策略和存储桶策略的编写示例,可分别参见 用户策略语法结构存储桶策略示例

    访问策略评估示例

    假设主账号 UIN 100000000001为子账号 UIN 100000000011关联了一项用户预设策略,允许该子账号只读主账号下的资源;该用户策略详情如下。此项用户策略允许了该子账号执行所有的ListGetHead操作以及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:uid/100000000011:examplebucket-1250000000/*"
          ]
        }
      ],
      "version": "2.0"
    }

    此项存储桶策略显式拒绝了所有用户执行下载对象(GetObject)的操作。因此,在访问策略评估流程中:

    1. 如果该子账号携带签名参数请求GetObject时,会根据该请求表示的用户身份匹配对应的用户策略,访问策略评估验证通过;
    2. 如果该子账号不携带签名参数请求GetObject时,会被系统判定为匿名请求,会被存储桶策略拒绝访问。

    Was this page helpful?

    本页内容是否解决了您的问题?

    • 完全没帮助
    • 文档较差
    • 文档一般
    • 文档不错
    • 文档很好
    反馈
    帮助