OSS支持通过设置Bucket Policy和ACL来实现公共访问。公共访问无需特定权限或身份验证,容易引发数据泄露和外网下行流量的风险。OSS支持在OSS全局、单个Bucket、单个接入点和单个对象FC接入点的维度一键开启阻止公共访问,以避免公共访问可能带来的风险。开启后,已有的公共访问权限会被忽略,且不允许创建新的公共访问权限,从而确保数据安全。
判断是否包含公共访问语义
您需要结合Bucket Policy和ACL(包括Bucket ACL和Object ACL)判断OSS资源是否包含公共访问的语义。如果任意一种包含公共访问的语义,您的资源可能存在安全风险,建议开启阻止公共访问功能。
您可以调用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": "*" } ] }
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,仍不允许公共访问。
操作方式
相关API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。
为OSS全局开启阻止公共访问的API接口说明,请参见PutPublicAccessBlock。
为Bucket开启阻止公共访问的API接口说明,请参见PutBucketPublicAccessBlock。
为接入点开启阻止公共访问的API接口说明,请参见PutAccessPointPublicAccessBlock。
为对象FC接入点开启阻止公共访问的API接口说明,请参见PutAccessPointConfigForObjectProcess。
相关文档
阻止公共访问用于集中管控OSS全局、Bucket、接入点及对象FC接入点的权限。如果您需要细粒度地管控Bucket内的部分资源或单个Object的权限,请结合使用Bucket Policy和设置Object ACL。
- 本页导读 (1)
- 判断是否包含公共访问语义
- 不同维度阻止公共访问的优先级说明
- 注意事项
- 操作方式
- 使用OSS控制台
- 使用命令行工具ossutil
- 相关API
- 相关文档