一、概述
注意:腾讯云主账号具备对其名下资源(包括存储桶)的最大权限,你虽然可以在存储桶策略中限制几乎所有操作,但主账号始终具备 PUT Bucket Policy 操作的权限,主账号调用该操作不检查存储桶策略。
存储桶策略(Bucket Policy)使用 JSON 语言描述,支持向匿名身份或腾讯云任何 CAM 账户授予对存储桶、存储桶操作、对象或对象操作的权限,在腾讯云 COS 中存储桶策略可以用于管理该存储桶内的几乎所有操作,推荐你使用存储桶策略来管理通过 ACL 无法表述的访问策略。
二、适用场景
注意:创建存储桶和获取存储桶列表这两个服务级的操作权限,需要通过 访问管理控制台 配置。
当你关心谁能访问这个 COS 桶时,推荐使用存储桶策略。可通过查找存储桶,并检查存储桶策略来了解谁能访问。推荐场景有:
·针对某个存储桶进行授权。
·相比 ACL,存储桶策略更加灵活。
·相比用户策略,存储桶策略支持跨账号授权及匿名用户授权。
三、存储桶策略组成
存储桶策略使用 JSON 语言描述,语法遵循 访问策略语言 的统一规范,包括委托人(principal)、效力(effect)、操作(action)、资源(resource)、条件(condition)等基本元素。详情可参考 访问策略语言概述。
其中,存储桶策略的资源范围被限制在该存储桶之内,可以针对整个存储桶、指定目录、指定对象授权。
注意:添加存储桶策略时,请务必根据业务需要,按照最小权限原则进行授权。如果你直接授予其他用户所有资源(resource:*),或者所有操作(action:*)权限,则存在由于权限范围过大导致数据安全风险。
四、控制台配置示例
注意:说明:
示例:授予子账号拥有存储桶特定目录的所有权限。配置信息如下:
| 配置项 | 配置值 |
| 效力 | 允许 |
| 委托人 | 子账号,子账号的 UIN,该子账号必须为当前主账号下的子账号,例如100000000011 |
| 资源 | 特定目录前缀,例如folder/sub-folder/* |
| 操作 | 所有操作 |
| 条件 | 无 |
控制台支持 图形化配置 和 策略配置 两种方式添加、管理存储桶策略。
五、图形化配置
进入目标存储桶的权限管理,选择 Policy 权限设置 > 图形设置,单击添加策略,在弹窗中进行策略配置。
六、步骤1:选择模板(可选)
通过选择不同的被授权用户、资源范围组合,COS 为你提供了多种策略模板,帮助你快速配置存储桶策略。若模板不符合你的需要,可以跳过此步,或在 步骤2:配置策略 中添加或删除授权操作。
被授权用户
·所有用户(可匿名访问):当你希望为匿名用户开放操作权限时,选择此项。在下一步配置策略时会为你自动添加所有用户,表示为*。
·由于将列出对象列表(GetBucket)、存储桶配置权限等操作开放给匿名用户风险较高,选择本项时 COS 没有提供相应模板,如你有需要可以在后续“配置策略”步骤自行添加。
·当被授权用户指定为所有用户(可匿名访问),请求对象时无需携带签名,所有用户可直接通过链接访问对象,你的数据会存在泄露风险,请谨慎设置。
·选择拒绝所有用户只能拒绝匿名用户,不会拒绝 CAM 用户,如需拒绝子账号,请在存储桶策略中选择指定用户并指定具体子账号 UIN。
·指定用户:当你希望为指定子账户、主账户或云服务开放操作权限时,选择此项。在下一步配置策略中,你需要进一步指定具体的账户 UIN。
注意:说明:
注意:当被授权用户为指定账号,请求对象时需携带签名用于身份验证,关于签名说明,请参见 请求签名。
资源范围
·整个存储桶:当你希望授予存储桶配置项相关权限,或者将资源范围指定为整个存储桶,选择此项,在第二步配置策略时会为你自动添加整个存储桶为资源。
·指定目录:当你希望将资源范围限定到指定文件夹,选择此项。在步骤2:配置策略,你需要进一步指定具体的目录。选择本项时,COS 不会提供存储桶配置相关的策略模板,因为这类权限必须指定资源为整个存储桶。
模板
你希望授权的操作集合。根据你选择的被授权用户和资源范围,COS 为你提供了推荐的策略模板,若模板不符合你的需要,可以跳过此步,或在下一步“配置策略”中添加或删除授权操作。
·自定义策略(不提供预设配置):如你不需要使用模板,可选择此项,在第二步“配置策略”中根据你的需要自行添加策略。
·其他模板:根据你选择的被授权用户和资源范围的不同组合,COS 为你提供不同的推荐模板。勾选相应的模板后,在第二步配置策略中,COS 会为你自动添加相应的操作。
模板说明请参见下表:
| 被授权用户 | 资源范围 | 策略模板 | 说明 |
| 所有组合 | | 自定义策略 | 对于任意被授权用户、资源范围组合,选择此模板不提供任何预设策略,你可以直接在第二步配置策略中自行添加策略。 |
| 所有用户(可匿名访问) | 整个存储桶 | 只读对象(不含列出对象列表) | 对于匿名用户,COS 为你提供读文件(例如下载)、写文件(例如上传、修改)的推荐模板。COS 推荐模板不包括列出你存储桶内的所有对象、和读写权限、存储桶配置等其他敏感权限,避免开放其他多余权限提高数据安全。如你有需要,可以在后续步骤自行添加、删除动作权限。 |
| | | 读写对象(不含列出对象列表) | |
| | 指定目录 | 只读对象(不含列出对象列表) | |
| | | 读写对象(不含列出对象列表) | |
| 指定用户 | 整个存储桶 | 只读对象(不含列出对象列表) | 对于指定用户和整个存储桶组合,COS 提供了最多的推荐模板。除了读、写文件和列出文件,COS 还包括以下敏感权限模板,适用于给受信任的用户使用:读写存储桶与对象 ACL:获取、修改存储桶 ACL、对象 ACL。包括 GetObjectACL、PutObjectACL、GetBucketACL、PutBucketACL 存储桶一般配置项:存储桶标签、跨域、回源等非敏感权限。存储桶敏感配置项:涉及存储桶策略、存储桶 ACL、删除存储桶等敏感权限,需要谨慎使用。 |
| | | 只读对象(含列出对象列表) | |
| | | 读写对象(不含列出对象列表) | |
| | | 读写对象(含列出对象列表) | |
| | | 读写存储桶与对象 ACL | |
| | | 存储桶一般配置项 | |
| | | 存储桶敏感配置项 | |
| | 指定目录 | 只读对象(不含列出对象列表) | 对于指定用户和指定目录组合,COS 除了读文件(例如,下载)、写文件(例如上传、修改)之外,还提供了包含列出对象列表的权限的推荐模板。当你需要为指定用户开放指定文件夹的读、写、列出文件的权限时,推荐选择此组合。如你有需要,可以在后续步骤自行添加、删除动作权限。 |
| | | 只读对象(含列出对象列表) | |
| | | 读写对象(不含列出对象列表) | |
| | | 读写对象(含列出对象列表) | |
七、步骤2:配置策略
针对你在步骤1选择的被授权用户、指定目录和模板组合,COS 为你在配置策略中自动添加了对应的操作、被授权用户、资源等。其中,当你选择指定用户、指定目录时,需要在配置策略时指定具体的用户 UIN 和目录。
注意:说明:
注意:需要注意,对目录授权,输入的资源路径需要在后面加 /*。例如,对目录 test 授权,则需输入 test/*。
当 COS 提供的推荐模板不符合你的需要时,你也可以在这一步对策略内容进行调整,添加、删除被授权用户、资源和操作。如下:
配置项说明如下:
·效力:支持选择允许或拒绝,对应策略语法中的 “allow” 和 “deny”。
·用户:支持添加、删除被授权用户,包括所有用户(*)、主账户、子账户和云服务。
·资源:支持添加整个存储桶或指定目录资源。
·操作:添加、删除你需要授权的操作。
·条件:授予权限时指定条件,例如限制用户来访 IP。更多条件说明请参见 条件键说明及使用示例。
八、策略语法
除了使用图形化配置,熟悉存储桶策略的用户可以直接使用 JSON 语言编写策略。
编写好存储桶策略后,单击保存即可。此外你也可以通过 API 或 SDK 添加存储桶策略。
九、JSON 策略示例
以下策略示例描述为:允许属于主账号 ID 为100000000001(APPID 为1250000000)下的子账号 ID 100000000011, 对北京地域的存储桶 examplebucket-bj 下的目录 folder/sub-folder 中的对象,授权所有操作。
{ "statement": [ { "principal": { "qcs": [ "qcs::cam::uin/100000000001:uin/100000000011" ] }, "effect": "allow", "action": [ "name/cos:*" ], "resource": [ "qcs::cos:ap-beijing:appid/1250000000:examplebucket-bj-1250000000/folder/sub-folder/*" ] } ], "version": "2.0"}
十、操作方式
COS 支持使用控制台、API、SDK 等多种方式添加存储桶策略。控制台支持图形化配置和常用的授权模板,方便不熟悉策略语言的用户快速添加策略。
| 操作方式 | | 说明 |
| 控制台 | | Web 页面,直观易用 |
| API | | RESTful API,直接请求 COS |
| SDK | Android | 丰富的 SDK demo,支持各类开发语言。 |
| | iOS | |
| | C++ | |
| | .NET(C#) | |
| | Go | |
| | Java | |
| | JavaScript | |
| | Node.js | |
| | Python | |
| | 小程序 | |
十一、更多存储桶策略示例
·通过存储桶策略(Policy)授权案例
·授予其他主账号下的子账号操作名下存储桶的权限
注意:添加存储桶策略时,请务必根据业务需要,按照最小权限原则进行授权。如果你直接授予其他用户所有资源 (resource:*),或者所有操作 (action:*) 权限,则存在由于权限范围过大导致数据安全风险。
下面介绍限制子网、委托人和 VPC ID 的存储桶策略示例。
十二、示例一
拒绝匿名用户( qcs::cam::anyone:anyone)来自子网 10.1.1.0/24 网段 和 vpcid 为 aqp5jrc1的请求,语法示例如下。
注意:这个拒绝策略的效力仅针对匿名用户生效,如果需要限制 CAM 用户(子账号、主账号),需要在 principal 字段中明确指定该账号的 Arn。
{ "statement": [ { "action": [ "name/cos:*" ], "condition": { "ip_equal": { "qcs:ip": [ "10.1.1.0/24" ] }, "string_equal": { "vpc:requester_vpc": [ "vpc-aqp5jrc1" ] } }, "effect": "deny", "principal": { "qcs": [ "qcs::cam::anyone:anyone" ] }, "resource": [ "qcs::cos:ap-guangzhou:appid/1250000000:examplebucket-1250000000/*" ] } ], "version": "2.0"}
十三、示例二
允许子账号(qcs::cam::uin/100000000001:uin/100000000002)在访问来源 vpcid 为 aqp5jrc1 时访问指定存储桶,语法示例如下:
{ "statement": [ { "action": [ "name/cos:*" ], "condition": { "string_equal": { "vpc:requester_vpc": [ "vpc-aqp5jrc1" ] } }, "effect": "allow", "principal": { "qcs": [ "qcs::cam::uin/100000000001:uin/100000000002" ] }, "resource": [ "qcs::cos:ap-beijing:appid/1250000000:examplebucket-1250000000/*" ] } ], "version": "2.0"}