访问控制列表(ACL)使用XML语言描述,它是与资源关联的一个指定被授权者和授予权限的列表,每个存储桶和对象都有与之关联的ACL,支持向匿名用户或其他腾讯云的主账号授予基本的读写权限,需要注意的是使用与资源关联的ACL管理有一些限制:
当您仅需要为存储桶和对象设置一些简单的访问权限或开放匿名访问时可以选择ACL,但在更多的情况下推荐您优先使用存储桶策略或用户策略,灵活程度更高,ACL的适用场景包括:
支持的被授权身份可以是某个CAM主账号或者是某个预设的CAM用户组
在存储桶或对象的ACL中支持授予的身份包括:
腾讯云COS在资源ACL上支持的操作实际上是一系列的操作集合,对于存储桶和对象ACL来说分别代表不同的含义
A、下表列出了支持在存储桶ACL中设置的操作列表:
操作集 | 描述 | 许可的行为 |
---|---|---|
READ | 列出对象 | GetBucket,HeadBucket,GetBucketObjectVersions,ListMultipartUploads |
WRITE | 上传、覆盖和删除对象 | PutObject,PutObjectCopy,PostObject,InitiateMultipartUpload, UploadPart,UploadPartCopy,CompleteMultipartUpload, DeleteObject |
READ_ACP | 读取存储桶的 ACL | GetBucketACL |
WRITE_ACP | 写入存储桶的 ACL | PutBucketACL |
FULL_CONTROL | 以上四种权限的集合 | 以上所有行为的集合 |
备注:请谨慎授予存储桶WRITE、WRITE_ACP或FULL_CONTROL权限,授予存储桶WRITE权限将允许被授权者覆盖或删除已有的任何对象
B、下表列出了支持在对象 ACL 中设置的操作列表:
操作集 | 描述 | 许可的行为 |
---|---|---|
READ | 读取对象 | GetObject,GetObjectVersion,HeadObject |
READ_ACP | 读取对象的 ACL | GetObjectACL,GetObjectVersionACL |
WRITE_ACP | 写入对象的 ACL | PutObjectACL,PutObjectVersionACL |
FULL_CONTROL | 以上三种权限的集合 | 以上所有行为的集合 |
COS支持一系列预设的ACL进行授权,方便简单权限的描述,使用预设ACL描述时,需要在PUT Bucket/Object或PUT Bucket/Object acl中携带x-cos-acl头部并描述所需权限,如果同时在请求正文中携带了XML的描述内容,我们将优先选择头部中的描述并忽略请求正文中的XML描述
A、存储桶的预设ACL
预设名称 | 描述 |
---|---|
private | 创建者(主账号)具备 FULL_CONTROL 权限,其他人没有权限(默认) |
public-read | 创建者具备FULL_CONTROL权限,匿名用户组具备READ权限 |
public-read-write | 创建者和匿名用户组都具备 FULL_CONTROL 权限,通常不建议授予此权限 |
authenticated-read | 创建者具备 FULL_CONTROL 权限,认证用户组具备READ权限 |
B、对象的预设ACL
预设名称 | 描述 |
---|---|
default | 空描述,此时根据各级目录的显式设置及存储桶的设置来确定是否允许请求(默认) |
private | 创建者(主账号)具备 FULL_CONTROL 权限,其他人没有权限 |
public-read | 创建者具备 FULL_CONTROL 权限,匿名用户组具备 READ 权限 |
authenticated-read | 创建者具备 FULL_CONTROL 权限,认证用户组具备 READ 权限 |
bucket-owner-read | 创建者具备 FULL_CONTROL 权限,存储桶拥有者具备 READ 权限 |
bucket-owner-full-control | 创建者和存储桶拥有者都具备 FULL_CONTROL 权限 |
在创建存储桶时COS将创建一个默认的ACL赋予资源拥有者对资源的完全控制权限(FULL_CONTROL),示例如下:
<AccessControlPolicy>
<Owner>
<ID>Owner-Cononical-CAM-User-Id</ID>
</Owner>
<AccessControlList>
<Grant>
<Grantee>
<ID>Owner-Cononical-CAM-User-Id</ID>
</Grantee>
<Permission>FULL_CONTROL</Permission>
</Grant>
</AccessControlList>
</AccessControlPolicy>
在创建对象时COS默认不会创建ACL,此时对象的拥有者为存储桶拥有者,对象继承存储桶的权限与存储桶的访问权限一致,由于对象没有默认的ACL,其将遵循存储桶策略(Bucket Policy)中对访问者和其行为的定义,来判断请求是否被许可,如果您需要对对象授予其他访问权限,您可以在此基础上添加更多的ACL来描述对象的访问权限,例如:授予匿名用户只读单个对象的权限,示例如下
<AccessControlPolicy>
<Owner>
<ID>Owner-Cononical-CAM-User-Id</ID>
</Owner>
<AccessControlList>
<Grant>
<Grantee>
<ID>Owner-Cononical-CAM-User-Id</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>
Step 1:进入存储桶控制面板查看对象存储列表选择存储桶
Step 2:依次点击"权限管理-Policy权限设置"
Step 3:配置写ACL策略
Step 4:直接访问存储桶域名
Step 5:查看对象可以看到"AccessDenied"
Step 6:查看存储桶的ACL策略,可以看到有配置"FULL_CONTROL"权限
<AccessControlPolicy>
<Owner>
<ID>qcs::cam::uin/100018226706:uin/100018226706</ID>
<DisplayName>qcs::cam::uin/100018226706:uin/100018226706</DisplayName>
</Owner>
<AccessControlList>
<Grant>
<Grantee xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:type="CanonicalUser">
<ID>qcs::cam::uin/100018226706:uin/100018226706</ID>
<DisplayName>qcs::cam::uin/100018226706:uin/100018226706</DisplayName>
</Grantee>
<Permission>FULL_CONTROL</Permission>
</Grant>
</AccessControlList>
</AccessControlPolicy>
Step 7:通过PUT ACL写入策略,将存储桶的访问权限配置为公有读写,这里直接通过请求头来修改
PUT /?acl HTTP/1.1
Host: al2ex-1305322268.cos.ap-chengdu.myqcloud.com
x-cos-acl: public-read-write
Connection: close
Cache-Control: max-age=0
sec-ch-ua: "Chromium";v="92", " Not A;Brand";v="99", "Google Chrome";v="92"
sec-ch-ua-mobile: ?0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.159 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Sec-Fetch-Site: none
Sec-Fetch-Mode: navigate
Sec-Fetch-User: ?1
Sec-Fetch-Dest: document
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Step 8:之后可以看到存储桶的访问权限从"私有读写"变成了"公有读写"
Step 9:之后可以查看存储桶对象
在配置存储桶的ACL时应该遵循最小权限策略,同时对于一些读写操作,例如:ACL的写操作应该慎之又慎