OSS支持通过设置Bucket Policy以及ACL的方式实现公共访问。公共访问是指无需特定权限或身份验证即可对OSS资源进行访问。公共访问容易引发数据泄露以及被恶意访问而产生大量外网下行流量的风险。为避免公共访问可能带来的风险,OSS支持在OSS全局、单个Bucket、单个接入点和单个对象FC接入点的维度一键开启阻止公共访问。开启阻止公共访问后,已有的公共访问权限会被忽略,且不允许创建新的公共访问权限,以此关闭数据的公开访问渠道,确保数据安全。
判断是否包含公共访问语义
您需要结合Bucket Policy和ACL(包括Bucket ACL和Object ACL)判断OSS全局、单个Bucket、单个接入点和单个对象FC接入点是否包含公共访问的语义。当Bucket Policy或ACL任意一种包含公共访问的语义时,即可视为您的资源可能存在被公共访问的安全风险,需要考虑开启阻止公共访问功能来规避该风险。
Bucket Policy
(推荐)调用API接口判断
您可以通过调用GetBucketPolicyStatus接口判断当前Bucket Policy是否包含公共访问的语义。
如果IsPublic返回字段取值为true,表示当前Bucket Policy包含公共访问的语义。
如果IsPublic返回字段取值为false,表示当前Bucket Policy不包含公共访问的语义或者没有设置Bucket Policy。
更多信息,请参见GetBucketPolicyStatus。
自行判断
非公共访问判断条件和示例
仅当Bucket Policy满足以下条件的情况下,才会被视为非公共访问。
说明Action和Resource不作为判断是否为公共访问的条件。
如果Bucket Policy中的Effect是Deny,则被视为非公共访问。
元素
字段
取值
Principal
不适用
针对一项或多项指定一个或多个固定值,即取值不包含通配符星号(*)
Condition
acs:SourceVpcId
acs:SourceVpcIp
acs:SourceVpc
acs:AccessId
acs:SourceIp
如果是IPv4地址,掩码大于等于8。
如果是IPv6地址,掩码大于等于32。
非公共访问示例
{ "Version":"1", "Statement":[ { "Action":[ "oss:GetObject", "oss:GetObjectAcl", "oss:GetObjectVersion", "oss:GetObjectVersionAcl" ], "Effect":"Allow", "Principal":[ "20214760404935xxxx" ], "Resource":[ "acs:oss:*:174649585760xxxx:examplebucket/hangzhou/2020/*", "acs:oss:*:174649585760xxxx:examplebucket/shanghai/2015/*" ] }, { "Action":[ "oss:ListObjects", "oss:ListObjectVersions" ], "Condition":{ "StringLike":{ "oss:Prefix":[ "hangzhou/2020/*", "shanghai/2015/*" ] } }, "Effect":"Allow", "Principal":[ "20214760404935xxxx" ], "Resource":[ "acs:oss:*:174649585760xxxx:examplebucket" ] } ] }
公共访问判断条件和示例
不满足非公共访问任意判断条件的Bucket Policy,均被视为公共访问。常见的公共访问示例如下:
示例1
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:GetObject", "Principal": "*", "Resource": "acs:oss:*:17464958576xxxx:examplebucket/*" } ] }
示例2
Policy中同时包含公共访问(允许所有VPC访问)和非公共访问(仅允许指定用户访问)的策略时,最终判断结果仍被视为公共访问。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": "oss:GetObject", "Principal": "*", "Resource": "acs:oss:*:17464958576xxxx:examplebucket/*", "Condition": { "StringLike": { "acs:SourceVpc": [ "vpc-*" ] } } }, { "Effect": "Allow", "Action": "oss:*", "Principal": "27464958576xxxx", "Resource": "*" } ] }
ACL
Bucket ACL或者Object ACL设置为公共读或者公共读写,则判断为包含公共访问语义,即允许公共访问。
Bucket ACL和Object ACL同时设置为私有,则判断为不包含公共访问语义,即不允许公共访问。
不同维度阻止公共访问的优先级说明
OSS支持对OSS全局、单个Bucket、单个接入点和单个对象FC接入点开启阻止公共访问功能。当不同维度的阻止公共访问设置不一致时,OSS将遵循以下优先级来确定最终访问效果。
OSS全局 > 单个Bucket > 单个接入点 > 单个对象FC接入点
根据以上优先级顺序,下一层级是否允许公共访问取决于上一层级的阻止公共访问设置。只要OSS全局开启了阻止公共访问,则单个Bucket、接入点以及对象FC接入点均不允许公共访问。
如果希望单个Bucket允许公共访问,则OSS全局以及该Bucket均需要关闭阻止公共访问。
如果希望单个接入点允许公共访问,则OSS全局、接入点关联的Bucket以及接入点均需要关闭阻止公共访问。
如果希望单个对象FC接入点允许公共访问,则OSS全局、对象FC接入点关联的接入点、接入点关联的Bucket以及对象FC接入点均需要关闭阻止公共访问。
注意事项
RAM用户通过不同维度阻止公共访问时,需要具备以下权限。
OSS全局阻止公共访问:
oss:PutPublicAccessBlock
、oss:GetPublicAccessBlock
、oss:DeletePublicAccessBlock
。Bucket级别阻止公共访问:
oss:PutBucketPublicAccessBlock
、oss:GetBucketPublicAccessBlock
、oss:DeleteBucketPublicAccessBlock
。接入点级别阻止公共访问:
oss:PutAccessPointPublicAccessBlock
、oss:GetAccessPointPublicAccessBlock
、oss:DeleteAccessPointPublicAccessBlock
。对象FC接入点级别阻止公共访问:
oss:PutAccessPointConfigForObjectProcess
、oss:GetAccessPointConfigForObjectProcess
、oss:DeleteAccessPointForObjectProcess
。
如果开启阻止公共访问,则已有的公共访问权限会被忽略,且不允许创建新的公共访问权限。如果关闭阻止公共访问,则已有的公共访问权限仍生效,且支持创建新的公共访问权限。
如果您在Bucket Policy中设置了允许任何人操作接入点的管控API,即使该接入点开启了阻止公共访问,用户仍然可以通过Bucket三级域名修改该接入点的阻止公共访问,原因是通过Bucket三级域名访问的请求不受接入点的配置影响。
对于跨区域或者同区域复制,无论源Bucket和目标Bucket是否开启阻止公共访问,均不影响复制前后Object的ACL。如果目标Bucket开启了阻止公共访问,则复制到目标Bucket中ACL为公共读或者公共读写的Object,仍不允许公共访问。
操作步骤
使用OSS控制台
使用RESTAPI
相关文档
阻止公共访问是针对OSS全局、Bucket、接入点以及对象FC接入点维度进行集中权限管控的方式,如果您希望细粒度地管控Bucket内的部分资源或者单个Object的权限,您需要结合Bucket Policy以及Object ACL。