阻止桶公共访问
公共访问是指请求者无需拥有特定权限或身份验证即可访问桶和桶内数据,存在数据泄露和恶意访问导致大量外网流量的风险。为了避免这些风险,OBS支持为桶配置阻止公共访问功能(Block Public Access),以确保数据的安全性。借助BPA,桶拥有者可以集中轻松限制资源的公共访问。
判断桶是否被配置为公共访问
您需要结合桶策略和ACL来判断桶是否被配置为公共。当桶策略或ACL中任意一种包含公共访问语义时,您的桶就可能存在被公共访问的安全风险,需要考虑开启阻止公共访问功能来规避该风险。
- 当桶策略中Principal赋值为“*”,且条件键、运算符和取值范围满足下表时,认为存在桶策略公共语义:
表1 桶策略中的公共语义 条件键
运算符
取值范围
PrincipalID
StringLike
以 : 分隔的的第一段字符包含通配符
PrincipalAccount
StringLike
包含通配符
DomainId
PrincipalOrgID
PrincipalOrgManagementAccountID
SourceVpc
SourceVpce
SourceIP
IpAddress或NotIpAddress
ipv4 合法个数超过 2^{32-8},或 ipv6 合法个数超过 2^{128-32}
PrincipalUrn
StringLike
Urn 不是五段,或者第三段(Account)包含通配符
PrincipalOrgPath
StringLike
以 / 分隔的第一段字符包含通配符
通配符指 * 或 ? 两种字符。
示例一:Principal赋值为“*”1 2 3 4 5 6 7
{ "Principal": "*", "Resource": "*", "Action": "PutObject", "Effect": "Allow", "Condition": { "StringLike": {"SourceVpc": "vpc-*"}} }
示例二:SourceVpc取值包含通配符
1 2 3 4 5 6 7
{ "Principal": "exampleID", "Resource": "*", "Action": "PutObject", "Effect": "Allow", "Condition": { "StringLike": {"SourceVpc": "vpc-*"}} }
- 当ACL的授权对象为EveryOne,或者授权账号ID中含有通配符,或者使用头域直接设置ACL权限时选择public-read、public-read-write、public-read-delivered、public-read-write-delivered中的一个时,认为存在ACL公共语义。
1 2 3 4 5 6 7
PUT /?acl HTTP/1.1 Authorization: OBS H4IPJX0TQTHTHEBQQCEC:iqSPeUBl66PwXDApxjRKk6hlcN4= User-Agent: curl/7.29.0 Host: examplebucket.obs.region.myhuaweicloud.com x-obs-acl: public-read Date: WED, 01 Jul 2015 02:37:22 GMT Content-Type: application/xml
示例二:使用Body体方式配置桶ACL,包含公共语义
1 2 3 4 5 6 7 8 9 10 11 12 13
<AccessControlPolicy xmlns="http://obs.cn-north-4.myhuaweicloud.com/doc/2024-12-30/"> <Owner> <ID>b4bf1b36d9ca43d984fbcb9491b6fce9</ID> </Owner> <AccessControlList> <Grant> <Grantee> <Canned>Everyone</Canned> </Grantee> <Permission>READ_ACP</Permission> </Grant> </AccessControlList> </AccessControlPolicy>
阻止公共访问权限设置
OBS提供四个开关屏蔽公共访问,您可以将这些开关任意组合后应用于存储桶。
开关项 |
说明 |
---|---|
BlockPublicAcls |
开启该开关后,会有以下效果:
|
BlockPublicPolicy |
开启该开关后,如果创建或修改桶策略时策略中包含公有语义,则创建或修改会失败。 |
IgnorePublicAcls |
开启该开关后,会有以下效果:
例如,桶A开启了IgnorePublicAcls开关,桶A中上传对象b时可以设置公共语义的ACL,也可以上传后为其设置,但设置的含有公共语义的ACL不生效。 |
RestrictPublicBuckets |
开启该开关后,如果桶策略含有公共访问权限,则公共访问权限不生效,即只允许桶拥有者账号和该账号下的IAM用户访问桶和桶内对象。 |
注意事项
- 在开启阻止公共访问前,请务必确认您的业务在阻止公共访问的情况下能够正常工作。
- 配置阻止公共访问,需要账号具有“PutBucketPublicAccessBlock”权限。
- 开启阻止公共访问后,获取桶ACL或对象ACL时,系统返回的结果是当前桶的全量ACL规则。例如,桶ACL包含了公共访问语义,该桶开启IgnorePublicAcls,此时获取桶ACL策略的返回结果仍旧会包含该公共访问语义。
- 阻止公共访问权限设置不更改现有的桶策略或ACL。因此,删除阻止公共访问的权限设置会使原本拥有公共桶策略或ACL的桶或对象再次变为可公共访问。
- 新创建的对象桶默认开启阻止公共访问开关,即表2中的四个权限设置开关都会默认打开。新建的并行文件系统默认关闭,且开启阻止公开访问开关会导致性能下降。存量桶默认关闭,需要手动开启阻止公开访问。
约束限制
- 您只能为存储桶启用阻止公共访问权限设置,不支持基于账号和指定对象的阻止公共访问权限设置。
- 为确保功能正常使用,所有桶策略规则大小总计不超过20KB,所有ACL和桶策略规则大小总计不超过32KB。如果超过限定大小,则设置桶策略或桶ACL、查询桶的公共状态、开启阻止公共访问开关等请求可能会被拒绝,返回错误码400,报错“Bucket policy and bucket acl is too large/complicated to perform block public access analysis”。
- 镜像回源场景暂不支持设置阻止公共访问。
- 在跨区域复制场景下,如果目标桶禁止配置公共ACL(开启了BlockPublicAcls),那么源桶中配置了ACL公共语义的对象,会因为和目标桶的访问策略冲突而导致复制失败。
- 您必须拥有相关权限才能使用BPA功能:
表3 使用BPA功能所需权限 操作
需具备的权限
设置桶级阻止公共访问配置
桶拥有者或拥有PutBucketPublicAccessBlock权限
获取桶级阻止公共访问配置
桶拥有者或拥有GetBucketPublicAccessBlock权限
删除桶级阻止公共访问配置
桶拥有者或拥有DeleteBucketPublicAccessBlock权限
获取桶策略公共状态
桶拥有者或拥有GetBucketPolicyPublicStatus权限
获取桶公共状态
桶拥有者或拥有GetBucketPublicStatus权限
阻止桶公共访问使用方式
OBS支持通过控制台、API、SDK方式使用阻止公共访问功能。