将 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 将看不到它。

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

您需要在 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(这需要正是您的域) 向下滚动并选择操作:允许 然后添加规则

完成后,将规则设置为“规则”,并确保默认规则为“阻止”。

如果未设置为阻止,请单击“编辑”并进行更改。

现在您的内容只能通过您的网站通过云端访问。除非图片来自您的网站,否则盗链和直接访问图片将不起作用。