在默认情况下,腾讯云对象存储(Cloud Object Storage,COS)中的资源(存储桶和对象)都是私有的。只有腾讯云主账号(资源拥有者)才可以访问、修改存储桶和对象,其他用户(子账号、匿名用户等),在未授权的情况下都无法直接通过 URL 访问对象。
创建腾讯云子账号后,您可以通过访问策略为子账号授权;若需要将资源开放给非腾讯云用户,可以通过设置资源(存储桶、对象、目录)的公共权限(公有读)实现。
访问控制的元素
授予访问权限,指的是用户可以决定什么人、在何种条件下、对哪些资源、执行具体操作的控制能力组合。因此描述一个访问权限行为,通常包括四个元素:身份、资源、操作、条件(可选)。
访问权限的元素
腾讯云的身份(Principal)
用户申请腾讯云账号时,系统会创建一个用于登录腾讯云服务的主账号身份。腾讯云主账号可通过用户管理功能对具有不同职责的分类用户进行管理。用户类型包括 协作者、消息接收人、子用户和角色 等,具体定义请参见访问管理的 用户类型 和 词汇表 文档。
对象存储的资源(Resource)
此外,存储桶和对象都有与之相关的子资源。
存储桶的子资源包括:
acl 和 policy:存储桶的访问控制信息。
website:存储桶的静态网站托管配置。
tagging:存储桶的标签信息。
cors:存储桶的跨域配置信息。
lifecycle:存储桶的生命周期配置信息。
对象的子资源包括:
acl:对象的访问控制信息。
restore:归档类型对象的恢复配置。
对象存储的操作(Action)
对象存储的条件(Condition,可选)
私有原则
说明
在默认情况下,腾讯云对象存储 COS 中的资源都是私有的。
资源拥有者(创建存储桶资源的腾讯云主账号)具备对该资源的最高权限,资源拥有者可以编辑和修改访问策略,为其他人或匿名用户授予访问权限。
使用腾讯云 访问管理(Cloud Access Management,CAM) 账号创建存储桶或上传对象时,其父级主账号就是资源拥有者。
存储桶拥有者的主账号可以授予其他腾讯云主账号上传对象的权限(即跨账号上传),这种情况下,对象的拥有者仍然是存储桶拥有者的主账号。
访问控制的多种途径
COS 提供多种设置权限的方式实现访问控制,包括存储桶策略、用户策略(CAM 策略)、存储桶 ACL 和对象 ACL。
按照策略设置的出发点,可以分为基于资源和基于用户两种方式;按照授权方式,可以分为策略和 ACL 两种方式。
分类方法一:基于资源 vs 基于用户
以资源为出发点:将权限关联在具体的资源上,包括存储桶策略、存储桶 ACL 和对象 ACL,在 COS 控制台或通过 COS API 配置。
以用户为出发点:用户策略(CAM 策略),将权限关联在用户上,填写策略时不需要填写用户,需要指定资源、操作、条件等,在 CAM 控制台 配置。
分类方法二:策略 vs ACL
策略:用户策略(CAM 策略)和存储桶策略,都是基于完整的策略语法进行授权的,授权的动作细化到了每个 API 对应的动作,支持指定允许/拒绝效力。
ACL:存储桶 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:uid/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>
用户策略
用户策略与存储桶策略的最大差别是:用户策略只描述效力(Effect)、操作(Action)、资源(Resource)和条件(Condition,可选),不描述身份(Principal)。因此用户策略需要撰写完成后,再对子用户、用户组或角色执行关联操作,以及用户策略不支持将操作和资源权限授予匿名用户。
{"Statement": [{"Effect": "Allow","Action": ["cos:*"],"Resource": ["qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/*","qcs::cos:ap-guangzhou:uid/1250000000:examplebucket-1250000000/"]}],"Version": "2.0"}