S3存储桶策略防火墙异常:如何仅开放指定IP且兼容AWS服务?
解决S3存储桶IP防火墙策略失效问题
你的原策略失效原因在于Condition的逻辑关系:AWS桶策略的Condition默认是AND逻辑,只有当所有条件同时满足时,Deny规则才会触发。原策略里的NotIpAddress和BoolIfExists: aws:PrincipalIsAWSService两个条件同时成立才会拒绝,这就导致:
- 对于普通用户的请求(非AWS服务发起),
aws:PrincipalIsAWSService字段不存在,BoolIfExists条件不满足,因此整个Condition不成立,Deny规则不会生效,所以任意IP都能下载文件。
你需要调整Condition的逻辑,让Deny规则触发的条件是:请求既不在指定IP范围内,又不是来自允许的AWS服务。以下是两种符合需求的策略:
方案1:允许所有AWS服务+指定IP访问
如果需要开放所有AWS服务(而非仅Athena/Redshift)的访问,使用以下策略:
{ "Version": "2012-10-17", "Id": "S3BucketPolicyFirewall", "Statement": [ { "Sid": "DenyNonAllowedIPAndNonAWSService", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::cf-templates-1aulyhwnmubu5-ap-south-1", "arn:aws:s3:::cf-templates-1aulyhwnmubu5-ap-south-1/*" ], "Condition": { "And": [ { "NotIpAddress": { "aws:SourceIp": [ "1.241.233.31/32", "1.2.5.1/32" ] } }, { "Not": { "BoolIfExists": { "aws:PrincipalIsAWSService": "true" } } } ] } } ] }
方案2:仅允许指定AWS服务(Athena/Redshift)+指定IP访问
如果只需要开放Athena、Redshift等特定服务的访问,使用aws:Service条件精准指定允许的服务,更安全:
{ "Version": "2012-10-17", "Id": "S3BucketPolicyFirewall", "Statement": [ { "Sid": "DenyNonAllowedIPAndNonAllowedServices", "Effect": "Deny", "Principal": "*", "Action": "s3:*", "Resource": [ "arn:aws:s3:::cf-templates-1aulyhwnmubu5-ap-south-1", "arn:aws:s3:::cf-templates-1aulyhwnmubu5-ap-south-1/*" ], "Condition": { "And": [ { "NotIpAddress": { "aws:SourceIp": [ "1.241.233.31/32", "1.2.5.1/32" ] } }, { "Not": { "StringEquals": { "aws:Service": [ "athena.amazonaws.com", "redshift.amazonaws.com" ] } } } ] } } ] }
策略逻辑说明
- 两种方案都遵循同一个核心逻辑:仅拒绝「不在指定IP范围内」且「不是允许的AWS服务发起」的请求。
- 指定IP的请求:无论用户是否登录,都能正常访问存储桶。
- 允许的AWS服务请求:不受IP限制,可正常访问存储桶。
- 其他所有请求:都会被拒绝,符合你的防火墙需求。
内容的提问来源于stack exchange,提问作者shantanuo
相关产品推荐
相关产品推荐

