
# 示例：使用桶策略限制访问IP
#### 操作场景
只允许某些特定IP访问OBS桶，或者拒绝指定IP访问桶，可以防止来自恶意IP地址或IP段的攻击，如网络攻击者的暴力破解、网络扫描、恶意软件传播等，降低系统被入侵和数据泄露的风险。对于存储敏感数据的OBS桶，如商业机密、用户个人信息、银行账户信息等，通过限制IP访问，可以确保只有授权的IP地址能够访问数据，增强数据的保密性和完整性。
通过限制IP访问还可以控制访问流量，避免来自非授权IP的大量并发访问导致系统资源耗尽，从而提高系统的性能和稳定性。
#### 相关条件键介绍
您可以通过为OBS桶配置桶策略实现限制IP访问，在桶策略中加入对访问请求的限制条件，限制只有来自指定IP的请求可以访问桶。您可能会使用到以下几个条件键，更多关于条件键的介绍参见[条件键](https://support.huaweicloud.com/perms-cfg-obs/obs_40_0041.html#ZH-CN_TOPIC_0000002232861044__zh-cn_topic_0118394684_section14714311143713)：
表1用于限制IP访问的桶策略条件键 
| 条件键           | 说明                                                                                                                                                                                                                                      | 策略示例                                                                                                                                                                                                                                                                                                                                      |
|:---|:---|:---|
| SourceIp      | 用于限制发起请求的IP（公网IP或内网IP），优先识别客户携带的IP，如果未携带IP则取网络上一跳IP地址。该条件键存在一定的IP伪造风险。                                                                                                                                                                  | [示例一：通过公网直接访问OBS桶] [示例二：使用代理通过公网访问OBS桶] [示例三：使用华为云DDos防护服务（简称AAD）通过公网访问OBS桶] |
| g:SourceIp    | 用于限制发起请求访问OBS的公网IP。注意：如果请求需要经过代理或IP NAT，请求的公网IP会发生变化，OBS会检查请求访问服务端的最后一跳公网源IP。 您还可以使用g:SourceIp限制请求只来自于内网，拒绝来自公网的请求，详情参见[示例四：拒绝公网访问]。 | [示例一：通过公网直接访问OBS桶] [示例二：使用代理通过公网访问OBS桶] [示例三：使用华为云DDos防护服务（简称AAD）通过公网访问OBS桶] |
| g:VpcSourceIp | 配合g:SourceVpc、g:SourceVpce使用，用于限制从VPC通过VPC Endpoint内网访问OBS的源IP地址。                                                                                                                                                                       | [示例五：从VPC通过VPC Endpoint内网访问OBS]                                                                                                                                                                                                                                                     |
| g:SourceVpc   | 用于限制从VPC通过VPC Endpoint内网访问OBS时，请求来源的VPC ID。                                                                                                                                                                                             | [示例五：从VPC通过VPC Endpoint内网访问OBS]                                                                                                                                                                                                                                                     |
| g:SourceVpce  | 用于限制从VPC通过VPC Endpoint内网访问OBS时，发起请求使用的VPC Endpoint ID。                                                                                                                                                                                  | [示例五：从VPC通过VPC Endpoint内网访问OBS]                                                                                                                                                                                                                                                     |
   
 #### 示例一：通过公网直接访问OBS桶
客户端直接与OBS服务器建立连接访问OBS桶，数据在客户端和桶之间直接传输，网络路径相对简单直接。
限制OBS桶仅允许指定公网IP访问，可在桶策略中利用g:SourceIp或SourceIp条件键构建拒绝策略语句，以阻止来自其他IP的请求。
图1限制非法IP通过公网直接访问OBS桶   
![](https://support.huaweicloud.com/perms-cfg-obs/figure/zh-cn_image_0000002271606145.png)
以下示例用于仅允许公网IP为11.11.11.11/32的客户端读取桶内对象，其他来自公网或内网IP的访问均拒绝：
- [g:SourceIp作为条件键]
  ![](https://support.huaweicloud.com/perms-cfg-obs/public_sys-resources/caution_3.0-zh-cn.png)
  因为Principal为通配符星号（\*），所以策略会对所有访问者生效，包括桶拥有者。添加以下示例策略后，即使是默认拥有所有权限的桶拥有者，如果不是从指定公网IP地址访问，其访问请求也会被拒绝。
  ```
  { 
  "Statement" : [
    {
       "Sid": "ExampleStatementID1",
       "Principal": "*",
       "Effect": "Deny",   
       "Action": ["GetObject"],
       "Resource": "examplebucket",
       "Condition" : { 
           "NotIpAddress" : { 
           "g:SourceIp" : ["11.11.11.11/32"] 
           } 
       }
    },
  ]
  }
  ```
- [SourceIp作为条件键]
  ![](https://support.huaweicloud.com/perms-cfg-obs/public_sys-resources/caution_3.0-zh-cn.png)
  因为Principal为通配符星号（\*），所以策略会对所有访问者生效，包括桶拥有者。添加以下示例策略后，即使是默认拥有所有权限的桶拥有者，如果不是从指定公网IP地址访问，其访问请求也会被拒绝。
  ```
  { 
  "Statement" : [
    {
       "Sid": "ExampleStatementID1",
       "Principal": "*",
       "Effect": "Deny",   
       "Action": ["GetObject"],
       "Resource": "examplebucket",
       "Condition" : { 
           "NotIpAddress" : { 
           "SourceIp" : ["11.11.11.11/32"] 
           } 
       }
    },
  ]
  }
  ```
 #### 示例二：使用代理通过公网访问OBS桶
客户端首先向代理服务器发送请求，代理服务器接收到客户端的请求后对请求进行分析和处理，然后代理服务器会与OBS服务器建立连接。
- [g:SourceIp作为条件键]
  图2限制非法IP通过公网访问OBS桶   
  ![](https://support.huaweicloud.com/perms-cfg-obs/figure/zh-cn_image_0000002236769246.png)
  使用g:SourceIp作为条件键时，OBS桶会针对最后一跳公网IP进行检查，因此桶策略要围绕代理服务器的IP来设置。
  ![](https://support.huaweicloud.com/perms-cfg-obs/public_sys-resources/caution_3.0-zh-cn.png)
  因为Principal为通配符星号（\*），所以策略会对所有访问者生效，包括桶拥有者。添加以下示例策略后，即使是默认拥有所有权限的桶拥有者，如果不是从指定公网IP地址访问，其访问请求也会被拒绝。
  ```
  { 
  "Statement" : [
    {
       "Sid": "ExampleStatementID2",
       "Principal": "*",
       "Effect": "Deny",   
       "Action": ["GetObject"],
       "Resource": "examplebucket",
       "Condition" : { 
           "NotIpAddress" : { 
           "g:SourceIp" : ["33.33.33.33/32"] 
           } 
       }
    },
  ]
  }
  ```
- [SourceIp作为条件键]
  图3限制非法IP通过公网访问OBS桶   
  ![](https://support.huaweicloud.com/perms-cfg-obs/figure/zh-cn_image_0000002294148208.png)
  使用SourceIp作为条件键时，OBS桶优先针对请求携带的客户端IP进行检查。
  ![](https://support.huaweicloud.com/perms-cfg-obs/public_sys-resources/caution_3.0-zh-cn.png)
  因为Principal为通配符星号（\*），所以策略会对所有访问者生效，包括桶拥有者。添加以下示例策略后，即使是默认拥有所有权限的桶拥有者，如果不是从指定公网IP地址访问，其访问请求也会被拒绝。
  ```
  { 
  "Statement" : [
    {
       "Sid": "ExampleStatementID2",
       "Principal": "*",
       "Effect": "Deny",   
       "Action": ["GetObject"],
       "Resource": "examplebucket",
       "Condition" : { 
           "NotIpAddress" : { 
           "SourceIp" : ["11.11.11.11/32"] 
           } 
       }
    },
  ]
  }
  ```
 #### 示例三：使用AAD通过公网访问OBS桶
[DDoS高防](https://support.huaweicloud.com/productdesc-aad/aad_01_0004.html)通过高防IP代理源站IP对外提供服务，将恶意攻击流量引流到高防IP清洗，确保重要业务不被攻击中断。客户端请求在访问其他云服务前，需要先经过高防服务器的检测和清洗，以过滤掉恶意流量，然后清洗后的请求会清洗设备转发到OBS桶。
- [g:SourceIp作为条件键]
  图4限制异常流量通过非法IP访问OBS桶   
  ![](https://support.huaweicloud.com/perms-cfg-obs/figure/zh-cn_image_0000002271829857.png)
  **使用g:SourceIp作为条件键时，OBS桶会针对最后一跳IP进行检查，因此桶策略需要将高防IP加入允许访问白名单。** 如何获取高防IP请参考[如何查看高防回源IP段？](https://support.huaweicloud.com/aad_faq/aad_01_0176.html)以下示例用于仅允许来自高防IP 33.33.33.33/32的请求获取桶内对象，其他请求拒绝：
  ![](https://support.huaweicloud.com/perms-cfg-obs/public_sys-resources/caution_3.0-zh-cn.png)
  因为Principal为通配符星号（\*），所以策略会对所有访问者生效，包括桶拥有者。添加以下示例策略后，即使是默认拥有所有权限的桶拥有者，如果不是从指定公网IP地址访问，其访问请求也会被拒绝。
  ```
  { 
  "Statement" : [
    {
       "Sid": "ExampleStatementID3",
       "Principal": "*",
       "Effect": "Deny",   
       "Action": ["GetObject"],
       "Resource": "examplebucket",
       "Condition" : { 
           "NotIpAddress" : { 
           "g:SourceIp" : ["33.33.33.33/32"] 
           } 
       }
    },
  ]
  }
  ```
- [SourceIp作为条件键]
  图5限制异常流量通过非法IP访问OBS桶   
  ![](https://support.huaweicloud.com/perms-cfg-obs/figure/zh-cn_image_0000002271837493.png)
  使用SourceIp作为条件键时，OBS桶优先针对请求携带的客户端IP进行检查。
  ![](https://support.huaweicloud.com/perms-cfg-obs/public_sys-resources/caution_3.0-zh-cn.png)
  因为Principal为通配符星号（\*），所以策略会对所有访问者生效，包括桶拥有者。添加以下示例策略后，即使是默认拥有所有权限的桶拥有者，如果不是从指定公网IP地址访问，其访问请求也会被拒绝。
  ```
  { 
  "Statement" : [
    {
       "Sid": "ExampleStatementID3",
       "Principal": "*",
       "Effect": "Deny",   
       "Action": ["GetObject"],
       "Resource": "examplebucket",
       "Condition" : { 
           "NotIpAddress" : { 
           "SourceIp" : ["22.22.22.22/32"] 
           } 
       }
    },
  ]
  }
  ```
 #### 示例四：拒绝公网访问
拒绝来自公网的访问，仅允许来自内网的请求访问OBS桶。例如您在名为examplebucket的桶中存放了大量内部资料，不希望其他用户通过公网访问桶中的资源，只有内网可以访问。
图6拒绝公网访问   
![](https://support.huaweicloud.com/perms-cfg-obs/figure/zh-cn_image_0000002278043473.png)
- 以下桶策略拒绝所有来自公网的对examplebucket桶的请求。
  ```
  {
      "Statement": [
          {
              "Sid": "ExampleStatementID4",
              "Effect": "Deny",
              "Action": ["*"],
              "Principal": {"ID": ["*"]},
              "Resource": ["examplebucket", "examplebucket/*"],
              "Condition": {
                  "Null": {
                      "g:SourceIp": "false"
                  }
              }
          }
      ]
  }
  ```
  
- 以下桶策略拒绝所有来自公网的对examplebucket桶的Get、Put、Delete请求，同时拒绝除控制台外所有来自公网的列举examplebucket桶的请求。
  ```
  {
      "Statement": [
          {
              "Sid": "ExampleStatementID5",
              "Effect": "Deny",
              "Action": ["Put*", "Delete*", "Get*"],
              "Principal": {"ID": ["*"]},
              "Resource": ["examplebucket", "examplebucket/*"],
              "Condition": {
                  "Null": {
                      "g:SourceIp": "false"
                  }
              }
          },
          {
              "Sid": "ExampleStatementID6",
              "Effect": "Deny",
              "Action": ["List*"],
              "Principal": {"ID": ["*"]},
              "Resource": ["examplebucket", "examplebucket/*"],
              "Condition": {
                  "Null": {
                      "g:SourceIp": "false"
                  },
                  "ForAllValues:StringNotEquals": {
                      "g:CalledVia": [
                          "service.console"
                      ]
                  }
              }
          }
      ]
  }
  ```
  
 
 #### 示例五：从VPC通过VPC Endpoint内网访问OBS
从VPC通过VPC Endpoint内网访问OBS，首先VPC内的计算资源（如ECS实例）会向VPC Endpoint发送请求，VPC Endpoint接收来自VPC内资源的请求后，会对请求进行初步处理，检查请求的合法性和相关权限等，然后合法的请求会通过VPC Endpoint与OBS建立的连接从内网访问OBS桶。
若需限制OBS桶仅允许指定VPC中的指定IP访问，可在桶策略中，利用g:VpcSourceIp+g:SourceVpc条件键构建拒绝策略语句，以阻止来自其他公/内网IP，或来自其他VPC的请求。如何获取VPC ID请参见[获取虚拟私有云的ID信息](https://support.huaweicloud.com/usermanual-vpc/vpc_vpc_0013.html)。
图7限制OBS桶仅允许指定VPC中的指定IP访问   
![](https://support.huaweicloud.com/perms-cfg-obs/figure/zh-cn_image_0000002268001677.png)
以下示例仅允许ID为11abxxx的VPC中的IP为10.1.1.1/32的ECS实例获取桶内对象，来自其他公/内网IP，或来自其他VPC的请求均拒绝：
![](https://support.huaweicloud.com/perms-cfg-obs/public_sys-resources/caution_3.0-zh-cn.png)
因为Principal为通配符星号（\*），所以策略会对所有访问者生效，包括桶拥有者。
```
{ 
"Statement" : [
  {
     "Sid": "ExampleStatementID3",
     "Principal": "*",
     "Effect": "Deny",   
     "Action": ["GetObject"],
     "Resource": "examplebucket",
     "Condition" : { 
         "NotIpAddress" : { 
           "g:VpcSourceIp" : ["10.1.1.1/32"] 
         },
         { 
         "StringNotEquals" : { 
           "g:SourceVpc" : ["11abxxx"] 
         } 
     }
  },
]
}
```
若需限制OBS桶仅允许指定IP通过指定VPC Endpoint访问，可在桶策略中，利用g:VpcSourceIp+g:SourceVpce条件键构建拒绝策略语句，以阻止来自其他公/内网IP，或来自其他VPC Endpoint的请求。如何获取VPC Endpoin ID请参见[查询并访问终端节点](https://support.huaweicloud.com/usermanual-vpcep/vpcep_03_0202.html)。
图8限制OBS桶仅允许指定IP通过指定VPC Endpoint访问   
![](https://support.huaweicloud.com/perms-cfg-obs/figure/zh-cn_image_0000002233041484.png)
以下示例仅允许IP为10.1.1.1/32的ECS实例通过ID为33abxxx的VPC Endpoint获取桶内对象，来自其他公/内网IP，或来自其他VPC Endpoint的请求均拒绝：
![](https://support.huaweicloud.com/perms-cfg-obs/public_sys-resources/caution_3.0-zh-cn.png)
因为Principal为通配符星号（\*），所以策略会对所有访问者生效，包括桶拥有者。
```
{ 
"Statement" : [
  {
     "Sid": "ExampleStatementID3",
     "Principal": "*",
     "Effect": "Deny",   
     "Action": ["GetObject"],
     "Resource": "examplebucket",
     "Condition" : { 
         "NotIpAddress" : { 
           "g:VpcSourceIp" : ["10.1.1.1/32"] 
         },
         { 
         "StringNotEquals" : { 
           "g:SourceVpce" : ["33abxxx"] 
         } 
     }
  },
]
}
```
