
# 阻止桶公共访问
公共访问是指请求者无需拥有特定权限或身份验证即可访问桶和桶内数据，存在数据泄露和恶意访问导致大量外网流量的风险。为了避免这些风险，OBS支持为桶配置阻止公共访问功能（Block Public Access），以确保数据的安全性。借助BPA，桶拥有者可以集中轻松限制资源的公共访问。
![](https://support.huaweicloud.com/usermanual-obs/public_sys-resources/caution_3.0-zh-cn.png)
当前功能仅部分区域支持（例如华东-青岛、拉美-墨西哥城一等），具体支持情况以[控制台实际展示]为准。
#### 判断桶是否被配置为公共访问
您需要结合桶策略和ACL来判断桶是否被配置为公共。当桶策略或ACL中任意一种包含公共访问语义时，您的桶就可能存在被公共访问的安全风险，需要考虑开启阻止公共访问功能来规避该风险。
- 当桶策略中Principal赋值为"\*"，且条件键、运算符和取值范围满足下表时，认为存在桶策略公共语义：
  表1桶策略中的公共语义 
  | 条件键                             | 运算符                    | 取值范围                                            |
  |:---|:---|:---|
  | PrincipalID                     | StringLike             | 以 : 分隔的的第一段字符包含通配符                              |
  | PrincipalAccount                | StringLike             | 包含通配符                                           |
  | DomainId                        | StringLike             | 包含通配符                                           |
  | PrincipalOrgID                  | StringLike             | 包含通配符                                           |
  | PrincipalOrgManagementAccountID | StringLike             | 包含通配符                                           |
  | SourceVpc                       | StringLike             | 包含通配符                                           |
  | SourceVpce                      | StringLike             | 包含通配符                                           |
  | SourceIP                        | IpAddress或NotIpAddress | ipv4 合法个数超过 2\^{32-8}，或 ipv6 合法个数超过 2\^{128-32} |
  | PrincipalUrn                    | StringLike             | Urn 不是五段，或者第三段（Account）包含通配符                    |
  | PrincipalOrgPath                | StringLike             | 以 / 分隔的第一段字符包含通配符                               |
     
  ![](https://support.huaweicloud.com/usermanual-obs/public_sys-resources/note_3.0-zh-cn.png)
  通配符指 \* 或 ? 两种字符。
  示例一：Principal赋值为"\*"
  ```
  {
  "Principal": "*", 
  "Resource": "*", 
  "Action": "PutObject", 
  "Effect": "Allow", 
  "Condition": { "StringLike": {"SourceVpc": "vpc-*"}}
  }
  ```
  示例二：SourceVpc取值包含通配符
  ```
  {
  "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，包含公共语义
  ```
  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，包含公共语义
  ```
  <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提供四个开关屏蔽公共访问，您可以将这些开关任意组合后应用于存储桶。
 表2BPA的四个开关 
| 开关项                   | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                       |
|:---|:---|
| 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支持通过[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)、API、SDK方式使用阻止公共访问功能。
#### 使用OBS控制台
支持在创建桶时配置阻止公共访问功能，具体请参见[创建桶](https://support.huaweicloud.com/usermanual-obs/zh-cn_topic_0045829088.html#ZH-CN_TOPIC_0000001952642149)。也可以在桶创建后开启或编辑阻止公共访问功能，具体操作步骤如下。
1. 在OBS[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)左侧导航栏选择"桶列表"。
2. 在桶列表中，单击待操作的桶，进入"对象"页面。
3. 在左侧导航栏单击"权限控制 \> 阻止公共访问"，进入"阻止公共访问"界面。
4. 根据需要打开对应开关。 
   开关全部打开，表示不允许创建新的含有公共访问权限的ACL和桶策略，同时已有的含有公共访问权限的ACL和桶策略将不生效。即只有桶拥有者可以访问桶和桶内对象。
   支持以下4种级别的公共访问设置：
   - **阻止创建新的含有公开权限的ACL。**
   
   - **阻止创建新的含有公开权限的桶策略。**
   
   - **含有公共访问权限的ACL将不生效。**
   
   - **含有公共访问权限的桶策略将不生效。**
   
   
   
   
5. 单击"保存"。
6. 在"确定修改阻止公共访问？"弹窗，输入"确认"后单击"确定"，完成阻止公共访问配置。
 
#### 使用OBS API
[设置桶级阻止公共访问配置](https://support.huaweicloud.com/api-obs/obs_04_0174.html)
[获取桶级阻止公共访问配置](https://support.huaweicloud.com/api-obs/obs_04_0175.html)
[删除桶级阻止公共访问配置](https://support.huaweicloud.com/api-obs/obs_04_0176.html)
[获取桶策略公共状态](https://support.huaweicloud.com/api-obs/obs_04_0178.html)
[获取桶公共状态](https://support.huaweicloud.com/api-obs/obs_04_0177.html)
#### 使用SDK
| [Java](https://support.huaweicloud.com/sdk-java-devg-obs/obs_23_1718.html) | [Python](https://support.huaweicloud.com/sdk-python-devg-obs/obs_22_0846.html) | C暂不支持 | [Go](https://support.huaweicloud.com/sdk-go-devg-obs/obs_23_1717.html) | BrowserJS暂不支持 | .NET暂不支持 | Android暂不支持 | iOS暂不支持 | PHP暂不支持 | Node.js暂不支持 |
|---|---|---|---|---|---|---|---|---|---|
   
#### 相关参考
#### 为什么开启BPA后，在控制台设置桶策略或ACL时报错"已开启阻止公共访问功能，导致请求被拒绝，请关闭阻止公共访问后重试"？
**桶策略报错原因** ：虽然[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)上显示有多条桶策略，但系统内部实际是将控制台上的多条策略都合并为一条。如果您先配置了包含公开语义的桶策略，然后打开了BPA开关，后续在控制台通过"可视化视图"模式再次追加桶策略时，会因为历史存在的公开策略而被拦截报错。
**桶策略处理方法**：使用"JSON视图"编辑桶策略，删除包含公开语义的策略后再进行修改。
**ACL报错原因：** 与桶策略相同，系统内部实际是将[管理控制台](https://console.huaweicloud.com/console/?locale=zh-cn#/obs/manager/buckets)上的多条ACL策略合并为一条。如果您先配置了包含公开语义的ACL策略，然后打开了BPA开关，后续在控制台追加设置ACL时，会因为历史存在的公开策略而被拦截报错。
**ACL策略处理方法**：使用API或SDK编辑ACL策略，删除包含公开语义的策略后再进行修改。
