示例:使用桶策略限制访问IP
操作场景
只允许某些特定IP访问OBS桶,或者拒绝指定IP访问桶,可以防止来自恶意IP地址或IP段的攻击,如网络攻击者的暴力破解、网络扫描、恶意软件传播等,降低系统被入侵和数据泄露的风险。对于存储敏感数据的OBS桶,如商业机密、用户个人信息、银行账户信息等,通过限制IP访问,可以确保只有授权的IP地址能够访问数据,增强数据的保密性和完整性。
通过限制IP访问还可以控制访问流量,避免来自非授权IP的大量并发访问导致系统资源耗尽,从而提高系统的性能和稳定性。
相关条件键介绍
您可以通过为OBS桶配置桶策略实现限制IP访问,在桶策略中加入对访问请求的限制条件,限制只有来自指定IP的请求可以访问桶。您可能会使用到以下几个条件键,更多关于条件键的介绍参见条件键:
条件键 |
说明 |
策略示例 |
---|---|---|
SourceIp |
用于限制发起请求的IP(公网IP或内网IP),优先识别客户携带的IP,如果未携带IP则取网络上一跳IP地址。该条件键存在一定的IP伪造风险。 |
|
g:SourceIp |
用于限制发起请求访问OBS的公网IP。注意:如果请求需要经过代理或IP NAT,请求的公网IP会发生变化,OBS会检查请求访问服务端的最后一跳公网源IP。 |
|
g:VpcSourceIp |
配合g:SourceVpc、g:SourceVpce使用,用于限制从VPC通过VPC Endpoint内网访问OBS的源IP地址。 |
|
g:SourceVpc |
用于限制从VPC通过VPC Endpoint内网访问OBS时,请求来源的VPC ID。 |
|
g:SourceVpce |
用于限制从VPC通过VPC Endpoint内网访问OBS时,发起请求使用的VPC Endpoint ID。 |
示例一:通过公网直接访问OBS桶
客户端直接与OBS服务器建立连接访问OBS桶,数据在客户端和桶之间直接传输,网络路径相对简单直接。
限制OBS桶仅允许指定公网IP访问,可在桶策略中利用g:SourceIp或SourceIp条件键构建拒绝策略语句,以阻止来自其他IP的请求。

以下示例用于仅允许公网IP为11.11.11.11/32的客户端读取桶内对象,其他来自公网或内网IP的访问均拒绝:

因为Principal为通配符星号(*),所以策略会对所有访问者生效,包括桶拥有者。添加以下示例策略后,即使是默认拥有所有权限的桶拥有者,如果不是从指定公网IP地址访问,其访问请求也会被拒绝。
{ "Statement" : [ { "Sid": "ExampleStatementID1", "Principal": "*", "Effect": "Deny", "Action": ["GetObject"], "Resource": "examplebucket", "Condition" : { "NotIpAddress" : { "g:SourceIp" : ["11.11.11.11/32"] } } }, ] }

因为Principal为通配符星号(*),所以策略会对所有访问者生效,包括桶拥有者。添加以下示例策略后,即使是默认拥有所有权限的桶拥有者,如果不是从指定公网IP地址访问,其访问请求也会被拒绝。
{ "Statement" : [ { "Sid": "ExampleStatementID1", "Principal": "*", "Effect": "Deny", "Action": ["GetObject"], "Resource": "examplebucket", "Condition" : { "NotIpAddress" : { "SourceIp" : ["11.11.11.11/32"] } } }, ] }

使用g:SourceIp作为条件键时,OBS桶会针对最后一跳公网IP进行检查,因此桶策略要围绕代理服务器的IP来设置。

因为Principal为通配符星号(*),所以策略会对所有访问者生效,包括桶拥有者。添加以下示例策略后,即使是默认拥有所有权限的桶拥有者,如果不是从指定公网IP地址访问,其访问请求也会被拒绝。
{ "Statement" : [ { "Sid": "ExampleStatementID2", "Principal": "*", "Effect": "Deny", "Action": ["GetObject"], "Resource": "examplebucket", "Condition" : { "NotIpAddress" : { "g:SourceIp" : ["33.33.33.33/32"] } } }, ] }

使用SourceIp作为条件键时,OBS桶优先针对请求携带的客户端IP进行检查。

因为Principal为通配符星号(*),所以策略会对所有访问者生效,包括桶拥有者。添加以下示例策略后,即使是默认拥有所有权限的桶拥有者,如果不是从指定公网IP地址访问,其访问请求也会被拒绝。
{ "Statement" : [ { "Sid": "ExampleStatementID2", "Principal": "*", "Effect": "Deny", "Action": ["GetObject"], "Resource": "examplebucket", "Condition" : { "NotIpAddress" : { "SourceIp" : ["11.11.11.11/32"] } } }, ] }
示例三:使用AAD通过公网访问OBS桶
DDoS高防通过高防IP代理源站IP对外提供服务,将恶意攻击流量引流到高防IP清洗,确保重要业务不被攻击中断。客户端请求在访问其他云服务前,需要先经过高防服务器的检测和清洗,以过滤掉恶意流量,然后清洗后的请求会清洗设备转发到OBS桶。

使用g:SourceIp作为条件键时,OBS桶针对会对最后一跳IP进行检查,因此桶策略需要将高防IP加入允许访问白名单。如何获取高防IP请参考如何查看高防回源IP段?以下示例用于仅允许来自高防IP 33.33.33.33/32的请求获取桶内对象,其他请求拒绝:

因为Principal为通配符星号(*),所以策略会对所有访问者生效,包括桶拥有者。添加以下示例策略后,即使是默认拥有所有权限的桶拥有者,如果不是从指定公网IP地址访问,其访问请求也会被拒绝。
{ "Statement" : [ { "Sid": "ExampleStatementID3", "Principal": "*", "Effect": "Deny", "Action": ["GetObject"], "Resource": "examplebucket", "Condition" : { "NotIpAddress" : { "g:SourceIp" : ["33.33.33.33/32"] } } }, ] }

使用SourceIp作为条件键时,OBS桶优先针对请求携带的客户端IP进行检查。

因为Principal为通配符星号(*),所以策略会对所有访问者生效,包括桶拥有者。添加以下示例策略后,即使是默认拥有所有权限的桶拥有者,如果不是从指定公网IP地址访问,其访问请求也会被拒绝。
{ "Statement" : [ { "Sid": "ExampleStatementID3", "Principal": "*", "Effect": "Deny", "Action": ["GetObject"], "Resource": "examplebucket", "Condition" : { "NotIpAddress" : { "SourceIp" : ["22.22.22.22/32"] } } }, ] }
示例四:从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信息。

以下示例仅允许ID为11abxxx的VPC中的IP为10.1.1.1/32的ECS实例获取桶内对象,来自其他公/内网IP,或来自其他VPC的请求均拒绝:

因为Principal为通配符星号(*),所以策略会对所有访问者生效,包括桶拥有者。添加以下示例策略后,即使是默认拥有所有权限的桶拥有者,如果不是从指定公网IP地址访问,其访问请求也会被拒绝。
{ "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请参见查询并访问终端节点。

以下示例仅允许IP为10.1.1.1/32的ECS实例通过ID为33abxxx的VPC Endpoint获取桶内对象,来自其他公/内网IP,或来自其他VPC Endpoint的请求均拒绝:

因为Principal为通配符星号(*),所以策略会对所有访问者生效,包括桶拥有者。添加以下示例策略后,即使是默认拥有所有权限的桶拥有者,如果不是从指定公网IP地址访问,其访问请求也会被拒绝。
{ "Statement" : [ { "Sid": "ExampleStatementID3", "Principal": "*", "Effect": "Deny", "Action": ["GetObject"], "Resource": "examplebucket", "Condition" : { "NotIpAddress" : { "g:VpcSourceIp" : ["10.1.1.1/32"] }, { "StringNotEquals" : { "g:SourceVpce" : ["33abxxx"] } } }, ] }