CloudFront代理S3访问时基于IP限制的bucket policy失效怎么解决?
问题根因
请求经由CloudFront转发到S3时,S3侧获取到的aws:SourceIp是CloudFront边缘节点的公网IP,并非发起请求的真实客户端IP,因此你原先基于客户端源IP配置的拒绝规则无法触发。
修复步骤
需要同时修改CloudFront转发配置和S3 Bucket Policy:
- 配置CloudFront透传真实客户端IP
进入对应CloudFront分发的管理页面,找到「源请求策略」配置项,新建或编辑现有策略,在转发头列表中添加X-Forwarded-For头,保存配置后等待CloudFront分发同步生效。 - 调整S3 Bucket Policy的IP匹配规则
放弃使用aws:SourceIp作为判断条件,改为基于CloudFront透传的X-Forwarded-For头校验客户端IP,修改后的参考策略如下:
{ "Version": "2012-10-17", "Id": "Policy1620712955196", "Statement": [ { "Sid": "BlockGifs", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::mytestbucket/*.gif", "Condition": { "ForAllValues:StringNotEquals": { "aws:RequestHeader/X-Forwarded-For": "39.111.102.19" } } }, { "Sid": "PreventBypassCloudFront", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Condition": { "StringNotEquals": { "aws:Referer": "你自定义的私有校验值" } } } ] }
上面第二条策略为可选配置,你可以在CloudFront的源请求配置中添加固定的Referer头作为校验标识,避免攻击者绕过CloudFront直接访问S3资源,跳过IP校验规则。
生效验证
等所有配置同步完成后,分别用允许的IP(39.111.102.19)和其他IP访问CloudFront分发下的gif资源,确认放行、拦截逻辑符合预期,再验证直接访问S3资源的逻辑是否正常即可。
内容的提问来源于stack exchange,提问作者WTK
相关产品推荐
相关产品推荐

