如何配置Amazon S3基于IP的访问策略?配置后应用无法访问如何处理
配置问题排查与修复方案
现有配置的核心问题
- 逻辑适用场景错误:你当前策略仅允许IP为
server-ip-address的客户端拉取资源,如果你的Web应用是直接将Spaces的图片链接嵌入前端页面,由用户浏览器直接发起资源请求,那么请求的源IP是用户设备的公网IP,不是你的服务器IP,自然会被策略拒绝。 - 缺少显式Allow规则:S3兼容存储的权限逻辑是「默认隐式拒绝」,优先匹配Deny规则,再匹配Allow规则。你当前只配置了Deny规则,没有对应配置Allow规则,哪怕请求源IP符合要求,也会被默认隐式规则拒绝。
- IP格式不规范:单IP配置需要加CIDR后缀
/32,例如1.1.1.1/32,如果漏写后缀,IP匹配规则不会生效。如果你的服务器使用IPv6地址,仅配置IPv4也会导致匹配失败。
调试排查方法
- 开启存储桶访问日志:在DigitalOcean Spaces控制台开启对应存储桶的访问日志功能,日志会记录每一次请求的源IP、Referer头、请求状态码等完整信息,可直接对比日志字段与你的策略条件,定位匹配失败的原因。
- 使用curl模拟请求验证:
模拟不带Referer的普通请求:curl -I https://<你的空间域名>/<测试文件路径>
模拟带指定Referer的请求:curl -I -H "Referer: https://<你的业务域名>" https://<你的空间域名>/<测试文件路径>
模拟指定源IP的请求(需要在对应IP的服务器上执行):curl -I https://<你的空间域名>/<测试文件路径>
通过返回的状态码(200为正常、403为被策略拒绝)即可快速验证规则是否符合预期。
推荐的防盗链策略配置
如果你的场景是前端直接加载Spaces资源,推荐使用Referer校验替代IP校验,示例配置如下:
{ "Id": "anti-hotlink policy", "Statement": [ { "Sid": "Allow valid requests", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<你的存储桶名>/*", "Condition": { "StringLike": { "aws:Referer": [ "https://<你的业务域名>/*", "https://www.<你的业务域名>/*" ] } } }, { "Sid": "Deny invalid requests", "Effect": "Deny", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::<你的存储桶名>/*", "Condition": { "StringNotLike": { "aws:Referer": [ "https://<你的业务域名>/*", "https://www.<你的业务域名>/*" ] } } } ] }
如果你的场景是后端服务代理拉取资源再返回给用户,仅保留IP校验即可,注意补全Allow规则和IP的CIDR后缀。
内容的提问来源于stack exchange,提问作者Denis
相关产品推荐
相关产品推荐

