更新时间:2025-04-24 GMT+08:00
分享

阻止桶公共访问

公共访问是指请求者无需拥有特定权限或身份验证即可访问桶和桶内数据,存在数据泄露和恶意访问导致大量外网流量的风险。为了避免这些风险,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公共语义。

    示例一:使用头域方式配置桶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提供四个开关屏蔽公共访问,您可以将这些开关任意组合后应用于存储桶。

表2 BPA的四个开关

开关项

说明

BlockPublicAcls

开启该开关后,会有以下效果:

  • 上传对象时,如果设置的ACL包含公有语义,则上传对象失败。
  • 在修改桶ACL或对象ACL时,如果设置的ACL包含公有语义,则设置失败。

BlockPublicPolicy

开启该开关后,如果创建或修改桶策略时策略中包含公有语义,则创建或修改会失败。

IgnorePublicAcls

开启该开关后,会有以下效果:

  • 忽略桶及桶内对象上的所有ACL公有语义,阻止ACL授权的公有访问,即拒绝未经身份验证或没有特定权限的用户访问桶和桶内对象。
  • 上传对象时,此开关不会阻止为对象设置公有ACL语义,后续访问对象时会忽略对象上的所有ACL公有语义。
  • 在修改桶ACL或对象ACL时,此开关不会阻止为桶和对象设置新的公有ACL语义,后续访问桶和对象时会忽略所有公有语义。

例如,桶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方式使用阻止公共访问功能。

相关参考

相关文档