将Amazon S3限制为CloudFront和http Referrer

时间:2019-04-16 14:36:48

标签: amazon-s3 amazon-cloudfront

我有一个用于图像和文件资产的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>/*"]}
            }
        }
    ]
}

但是一旦我应用了该政策,就无法在网站上访问这些图片。

这有可能吗?

2 个答案:

答案 0 :(得分:0)

CloudFront默认情况下会删除Referer标头,因此S3将看不到它。

https://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/RequestAndResponseBehaviorCustomOrigin.html

您需要将CloudFront中的Referer标头列入白名单,并使缓存无效以查看其是否有效。

答案 1 :(得分:0)

我对此的处理方式略有不同,而不是白名单。下面的方法只允许 CloudFront 访问内容,然后您在 CloudFront 上放置防火墙规则,只有您的网站(引用)可以访问缓存的内容。

对于存储桶策略,我阻止了所有访问并清除了存储桶策略 JSON: Screen Cap

在 Cloudfront 中,创建源和源组策略:

enter image description here

然后从源域名列表中选择您的存储桶

enter image description here

Origin Path 我留空,启用 Origin Shield 我留为 no。

限制存储桶访问:选择是 选择创建新身份 授予对存储桶的读取权限:是或创建(这将更新 S3 存储桶上的阻止策略以仅允许 CloudFront 获取内容。

我保留默认并保存的所有其他内容。

现在为了确保限制从我的网站引用,我使用了 AWS WAF 服务。

enter image description here

从这里我转到左侧菜单上的正则表达式模式集:

enter image description here

点击创建正则表达式模式。

名称:我把 DomainAccess_Only 描述:使用 Waterever 地区:重要,选择全球(Cloudfront) 对于正则表达式,我输入 .+ 并单击 create regex pattern set

Web ACL 详细信息:

名称:无论您想要什么,保留指标默认值 资源类型:CloudFront 分配 添加 AWS 资源,单击它并检查您的 cloudfront 域并添加它(单击下一步)

enter image description here

下一步选择规则构建器 为您的规则选择任何名称并选择常规规则 然后选择 If a request Matches the statement(除非您有多个域) 检查:标题 标头字段名称:referrer 匹配类型:以字符串开头 要匹配的字符串:https://yourdomain.com(这需要与您的域完全相同) 向下滚动并选择操作:允许 然后添加规则

完成此操作后,请制定规则以转到规则,并确保默认规则为阻止。

enter image description here

如果未设置为阻止,请单击编辑并更改它。

现在您的内容只能由您的网站通过 cloudfront 访问。除非图片来自您的网站,否则无法使用热链接和直接访问图片。