将 Amazon S3 限制为 CloudFront 和 http referrer
Restrict Amazon S3 to CloudFront and http referrer
我有一个用于图像和文件资产的 Amazon S3 REST 端点。我希望 S3 存储桶只能由 CloudFront 和访问图像的网站访问(使用 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>/*"]}
}
}
]
}
但是一旦我应用该策略,就无法在网站上访问这些图像。
这可以吗?
CloudFront 默认剥离 Referer header,因此 S3 将看不到它。
您需要在 CloudFront 中将 Referer header 列入白名单并使缓存无效以查看它是否有效。
我的处理方式有点不同,而不是白名单。下面的方法只允许 CloudFront 访问内容,然后你在 CloudFront 上设置防火墙规则,只有你的网站(参考)可以访问缓存的内容。
对于存储桶策略,我阻止了所有访问并清除了存储桶策略JSON:
在 Cloudfront 中,创建一个 Origins 和 Origin 组策略:
然后从 Origin Domain Name 的列表中选择您的 Bucket
Origin Path I 留空,Enable Origin Shield I 留空
限制存储桶访问:选择是
选择创建新身份
授予对存储桶的读取权限:是或创建(这将更新 S3 存储桶上的阻止策略以仅允许 CloudFront 获取内容。
我保留默认值并保存的所有其他内容。
现在为了确保我限制了来自我网站的引用,我使用了 AWS WAF 服务。
从这里我转到左侧菜单中的正则表达式模式集:
点击创建正则表达式模式。
姓名:我输入DomainAccess_Only
描述:使用Waterever
Region:重要,选择Global(Cloudfront)
对于正则表达式,我输入 .+ 并单击创建正则表达式模式集
Web ACL 详细信息:
姓名:随心所欲,保留公制默认值
资源类型:CloudFront 分配
添加 AWS 资源,单击它并检查您的云端域并添加它(单击下一步)
下一步选择规则生成器
为您的规则选择任何名称,然后选择常规规则
然后选择 If a request Matches 语句(除非你有多个域)
检查:Header
Header 字段名称:推荐人
匹配类型:以字符串开头
要匹配的字符串:https://yourdomain.com(这需要正是您的域)
向下滚动并选择操作:允许
然后添加规则
完成后,将规则设置为“规则”,并确保默认规则为“阻止”。
如果未设置为阻止,请单击“编辑”并进行更改。
现在您的内容只能通过您的网站通过云端访问。除非图片来自您的网站,否则盗链和直接访问图片将不起作用。
我有一个用于图像和文件资产的 Amazon S3 REST 端点。我希望 S3 存储桶只能由 CloudFront 和访问图像的网站访问(使用 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>/*"]}
}
}
]
}
但是一旦我应用该策略,就无法在网站上访问这些图像。
这可以吗?
CloudFront 默认剥离 Referer header,因此 S3 将看不到它。
您需要在 CloudFront 中将 Referer header 列入白名单并使缓存无效以查看它是否有效。
我的处理方式有点不同,而不是白名单。下面的方法只允许 CloudFront 访问内容,然后你在 CloudFront 上设置防火墙规则,只有你的网站(参考)可以访问缓存的内容。
对于存储桶策略,我阻止了所有访问并清除了存储桶策略JSON:
在 Cloudfront 中,创建一个 Origins 和 Origin 组策略:
然后从 Origin Domain Name 的列表中选择您的 Bucket
Origin Path I 留空,Enable Origin Shield I 留空
限制存储桶访问:选择是 选择创建新身份 授予对存储桶的读取权限:是或创建(这将更新 S3 存储桶上的阻止策略以仅允许 CloudFront 获取内容。
我保留默认值并保存的所有其他内容。
现在为了确保我限制了来自我网站的引用,我使用了 AWS WAF 服务。
从这里我转到左侧菜单中的正则表达式模式集:
点击创建正则表达式模式。
姓名:我输入DomainAccess_Only 描述:使用Waterever Region:重要,选择Global(Cloudfront) 对于正则表达式,我输入 .+ 并单击创建正则表达式模式集
Web ACL 详细信息:
姓名:随心所欲,保留公制默认值 资源类型:CloudFront 分配 添加 AWS 资源,单击它并检查您的云端域并添加它(单击下一步)
下一步选择规则生成器 为您的规则选择任何名称,然后选择常规规则 然后选择 If a request Matches 语句(除非你有多个域) 检查:Header Header 字段名称:推荐人 匹配类型:以字符串开头 要匹配的字符串:https://yourdomain.com(这需要正是您的域) 向下滚动并选择操作:允许 然后添加规则
完成后,将规则设置为“规则”,并确保默认规则为“阻止”。
如果未设置为阻止,请单击“编辑”并进行更改。
现在您的内容只能通过您的网站通过云端访问。除非图片来自您的网站,否则盗链和直接访问图片将不起作用。