为AWS CloudFront添加访问安全限制的解决方案咨询
限制CloudFront资源仅允许自有网站访问的可行方案
一、修正Web ACL的Referer验证配置
你之前用Web ACL没达到效果,大概率是规则配置没到位,正确的配置逻辑应该是:
- 创建一条字符串匹配规则,匹配请求头里的
Referer字段 - 设置匹配条件为包含你的网站域名(比如
your-domain.com,记得覆盖带www和不带的情况,或者用通配符*.your-domain.com) - 把这条规则的动设为允许,再添加一条默认规则设为阻止
- 务必开启CloudFront的
AllViewer触发器,确保所有用户请求都经过Web ACL校验
不过要注意,Referer头可以被伪造,而且部分浏览器可能不会发送这个头,所以这个方法只能做基础防护,要更稳妥得结合其他方案。
二、使用CloudFront签名URL/签名Cookie
这是更可靠的方案,核心是只有带有效签名的请求才能访问资源:
签名URL(适合单个文件/短期访问场景)
- 用AWS SDK或者CloudFront CLI工具生成带签名的URL,签名里可以指定有效期、允许的IP范围、Referer等限制条件
- 你的网站后端动态生成这些签名URL,前端页面只加载带签名的链接。就算别人拿到链接,过期后就失效,不符合签名里的限制条件也会被CloudFront拒绝
签名Cookie(适合批量资源场景,比如你的视频、缩略图)
- 生成包含签名的Cookie,把Cookie的生效域名设为你的网站域名,有效期可以自己定义
- 用户访问你的网站时,后端把签名Cookie写入浏览器,之后用户访问CloudFront资源时,Cookie会自动带上,CloudFront验证签名通过后才允许访问
- 这种方式不用给每个资源单独生成签名URL,适合批量分发的资源,效率更高
三、结合Origin Access Control (OAC) 锁死源站
不管用上面哪种方法,都得配上OAC:
- 在CloudFront分发里关联OAC,设置仅允许CloudFront访问你的源站(比如S3桶)
- 这样就算有人摸清了你的源站地址,也没法直接访问资源,必须走CloudFront的校验流程
四、额外强化手段
- 开启CloudFront的缓存策略,确保带签名的请求不会被缓存,避免未授权用户访问缓存的资源
- 配置源站的Bucket Policy,只允许OAC对应的CloudFront身份访问,进一步把源站的权限锁死
内容的提问来源于stack exchange,提问作者M Kashan
相关产品推荐
相关产品推荐

