我有一个用于图像和文件资产的Amazon S3 REST终端节点。我希望只能通过CloudFront访问S3存储桶,并希望网站访问图像(使用http Referrer)。
到目前为止,这是我的存储桶策略:
{
"Version": "2008-10-17",
"Id": "PolicyForCloudFrontPrivateContent",
"Statement": [
{
"Sid": "1",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity XXXXXXXXXXXX"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::<DOMAIN>/*",
"Condition":{
"StringLike":{"aws:Referer":["http://<DOMAIN>/*"]}
}
}
]
}
但是一旦我应用了该政策,就无法在网站上访问这些图片。
这有可能吗?
答案 0 :(得分:0)
CloudFront默认情况下会删除Referer标头,因此S3将看不到它。
您需要将CloudFront中的Referer标头列入白名单,并使缓存无效以查看其是否有效。
答案 1 :(得分:0)
我对此的处理方式略有不同,而不是白名单。下面的方法只允许 CloudFront 访问内容,然后您在 CloudFront 上放置防火墙规则,只有您的网站(引用)可以访问缓存的内容。
对于存储桶策略,我阻止了所有访问并清除了存储桶策略 JSON:
在 Cloudfront 中,创建源和源组策略:
然后从源域名列表中选择您的存储桶
Origin Path 我留空,启用 Origin Shield 我留为 no。
限制存储桶访问:选择是 选择创建新身份 授予对存储桶的读取权限:是或创建(这将更新 S3 存储桶上的阻止策略以仅允许 CloudFront 获取内容。
我保留默认并保存的所有其他内容。
现在为了确保限制从我的网站引用,我使用了 AWS WAF 服务。
从这里我转到左侧菜单上的正则表达式模式集:
点击创建正则表达式模式。
名称:我把 DomainAccess_Only 描述:使用 Waterever 地区:重要,选择全球(Cloudfront) 对于正则表达式,我输入 .+ 并单击 create regex pattern set
Web ACL 详细信息:
名称:无论您想要什么,保留指标默认值 资源类型:CloudFront 分配 添加 AWS 资源,单击它并检查您的 cloudfront 域并添加它(单击下一步)
下一步选择规则构建器 为您的规则选择任何名称并选择常规规则 然后选择 If a request Matches the statement(除非您有多个域) 检查:标题 标头字段名称:referrer 匹配类型:以字符串开头 要匹配的字符串:https://yourdomain.com(这需要与您的域完全相同) 向下滚动并选择操作:允许 然后添加规则
完成此操作后,请制定规则以转到规则,并确保默认规则为阻止。
如果未设置为阻止,请单击编辑并更改它。
现在您的内容只能由您的网站通过 cloudfront 访问。除非图片来自您的网站,否则无法使用热链接和直接访问图片。