一、资源访问权限概述
·私有原则
默认情况下,所有 COS 资源均为私有。
·资源拥有者权限
·资源拥有者(创建存储桶的主账号)具备最高权限。创建存储桶或上传对象所使用的账号(包括通过腾讯云 访问管理 CAM 所创建的账号)的父级主账号即为资源拥有者。
·资源拥有者可创建和编辑访问策略,为其他用户或匿名用户授予访问权限。
·子账号授权
存储桶拥有者可以授权其他腾讯云主账号上传对象的权限(跨账号上传),对象的拥有者依然是存储桶拥有者的主账号。
·公开权限设置
若需将资源开放给非腾讯云用户,可通过设置资源(存储桶、对象、目录)的公共权限(例如公有读)实现。
二、访问控制体系
COS 访问控制体系如下:
分为基于 CAM 用户的访问权限管理和基于资源的访问权限管理两种维度:
·基于 CAM 用户的访问权限管理,则对应的是用户策略(CAM 策略)。
·基于资源的访问权限管理,则对应的是存储桶策略和 ACL ,其中 ACL 包括存储桶 ACL 和对象 ACL。
三、基于用户授权
用户策略(CAM 策略):以用户为中心的权限管理。配置策略时无需指定用户,需要指定资源、操作和条件。可在 CAM 控制台 进行设置。
四、基于资源授权
资源策略:将权限直接关联到具体资源上,包括存储桶策略、存储桶 ACL 和对象 ACL。可通过 COS 控制台或 COS API 进行配置。
五、访问控制的元素
授予访问权限指资源拥有者可以决定什么人、在何种条件下、对哪些资源、执行具体操作的控制能力组合。因此描述一个访问权限行为,通常包括四个元素:身份、资源、操作、条件(可选)。
六、腾讯云的身份(Principal)
用户申请腾讯云账号时,系统会创建一个用于登录腾讯云服务的主账号身份。腾讯云主账号可通过用户管理功能对具有不同职责的分类用户进行管理。用户类型包括 协作者、消息接收人、子用户和角色 等,具体定义请参见访问管理的 用户类型 和 词汇表 文档。
注意:假设你希望为企业的某位同事进行授权,首先需要在 访问管理控制台 创建一个子用户,选择 存储桶策略、ACL 或 用户策略 中的一个或多个途径为子用户设置具体的权限。
七、对象存储的资源(Resource)
存储桶 Bucket 和对象 Object 是对象存储的基本资源,其中文件夹是一种特殊的对象,你可以通过文件夹对文件夹下的对象进行授权,详情请参见 设置文件夹权限。
此外,存储桶和对象都有与之相关的子资源。
| 资源维度 | 子资源 |
| 存储桶 | acl 和 policy:存储桶的访问控制信息。website:存储桶的静态网站托管配置。tagging:存储桶的标签信息。cors:存储桶的跨域配置信息。lifecycle:存储桶的生命周期配置信息。 |
| 对象 | acl:对象的访问控制信息。restore:归档类型对象的恢复配置。 |
八、对象存储的操作(Action)
对象存储提供了一系列针对资源的 API 操作,详情请参见 操作列表 文档。
九、对象存储的条件(Condition,可选)
可选项,权限生效的条件,例如 vpc、vip 等,详情请参见访问管理的 生效条件。
十、访问控制方式
·策略:用户策略(CAM 策略)和存储桶策略,都是基于完整的策略语法进行授权的,支持细化到授权每个 API 操作,支持指定允许/拒绝效力。
·ACL(访问控制列表):是与资源关联的一个指定被授权者和授予权限的列表,对应经过整理和抽象的权限,仅支持指定允许效力。ACL 分为以下两种:
·存储桶 ACL:与存储桶关联的权限列表,指定被授权者及其权限,仅支持允许效力。
·对象 ACL:针对对象的权限控制,功能类似于存储桶 ACL。
十一、基于资源的策略
基于资源的策略包括存储桶策略、访问控制列表 ACL,支持在存储桶和对象级别进行访问控制,具体请参照下表:
| 维度 | 类型 | 描述方式 | 支持的身份 | 支持的资源粒度 | 支持的操作 | 支持的效力 |
| Bucket | 访问策略语言(Policy) | JSON | 子账号、角色、腾讯云服务、其他主账号、匿名用户等 | 存储桶、对象、前缀等 | 每一个具体的操作 | 允许/显式拒绝 |
| Bucket | 访问控制列表(ACL) | XML | 其他主账号、子账号、匿名用户 | 存储桶 | 经过整理的读写权限 | 仅允许 |
| Object | 访问控制列表(ACL) | XML | 其他主账号、子账号、匿名用户 | 对象 | 经过整理的读写权限 | 仅允许 |
十二、存储桶策略(Bucket Policy)
存储桶策略(Bucket Policy)使用 JSON 语言描述,支持向匿名身份或腾讯云任何 CAM 账户授予对存储桶、存储桶操作、对象或对象操作的权限,在腾讯云 COS 中存储桶策略可以用于管理该存储桶内的几乎所有操作,推荐你使用存储桶策略来管理通过 ACL 无法表述的访问策略。更多内容可参考 存储桶策略 文档。
注意:腾讯云主账号具备对其名下资源(包括存储桶)的最大权限,你虽然可以在存储桶策略中限制几乎所有操作,但主账号始终具备 PUT Bucket Policy 操作的权限,主账号调用该操作不检查存储桶策略。
以下是一个许可匿名用户访问位于广州的存储桶 examplebucket-1250000000中所有对象的策略,无需签名校验即可下载存储桶中的所有对象(GetObject),即任何知晓 URL 的匿名用户都可以下载对象(类似于公有读方式):
{ "Statement": [ { "Principal": "*", "Effect": "Allow", "Action": ["cos:GetObject"], "Resource": ["qcs::cos:ap-guangzhou:appid/1250000000:examplebucket-1250000000/*"] } ], "Version": "2.0"}
十三、访问控制列表(ACL)
访问控制列表(ACL)使用 XML 语言描述,是与资源关联的一个指定被授权者和授予权限的列表,每个存储桶和对象都有与之关联的 ACL,支持向匿名用户或其他腾讯云的主账号授予基本的读写权限。更多内容可参考 ACL 文档。
注意:资源的拥有者始终对资源具备 FULL_CONTROL 权限,而无论下发的 ACL 中是否描述了此项。
存储桶 ACL
描述了存储桶拥有者(用户 UIN:100000000001)的完全控制权限:
<AccessControlPolicy> <Owner> <ID>qcs::cam::uin/100000000001:uin/100000000001</ID> </Owner> <AccessControlList> <Grant> <Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="RootAccount"> <ID>qcs::cam::uin/100000000001:uin/100000000001</ID> </Grantee> <Permission>FULL_CONTROL</Permission> </Grant> </AccessControlList></AccessControlPolicy>
对象 ACL
描述了对象拥有者(用户 UIN:100000000001)的完整控制权限,并授予了所有人可读(匿名用户公有读)的权限:
<AccessControlPolicy> <Owner> <ID>qcs::cam::uin/100000000001:uin/100000000001</ID> </Owner> <AccessControlList> <Grant> <Grantee> <ID>qcs::cam::uin/100000000001:uin/100000000001</ID> </Grantee> <Permission>FULL_CONTROL</Permission> </Grant> <Grant> <Grantee> <URI>http://cam.qcloud.com/groups/global/AllUsers</URI> </Grantee> <Permission>READ</Permission> </Grant> </AccessControlList></AccessControlPolicy>
十四、基于用户的策略
用户可以在 CAM 中,对于主账号名下的不同类型用户,授予不同的权限。
用户策略与存储桶策略的最大差别是:用户策略只描述效力(Effect)、操作(Action)、资源(Resource)和条件(Condition,可选),不描述身份(Principal)。因此用户策略需要撰写完成后,再对子用户、用户组或角色执行关联操作,以及用户策略不支持将操作和资源权限授予匿名用户。
你可以 使用预设策略进行关联授权,也可以 自行撰写用户策略 后关联到指定的身份,来实现对名下用户的访问管理。更多内容可参考 用户策略 文档。
以下是一个授权位于广州的存储桶 examplebucket-1250000000 所有 COS 操作的策略,你需要将策略保存后再关联到 CAM 子用户、用户组或角色方可生效:
{ "Statement": [ { "Effect": "Allow", "Action": ["cos:*"], "Resource": [ "qcs::cos:ap-guangzhou:appid/1250000000:examplebucket-1250000000/*", "qcs::cos:ap-guangzhou:appid/1250000000:examplebucket-1250000000/" ] } ], "Version": "2.0"}