如何使 S3 对象只能从某些 IP 地址读取?

How to make S3 objects readable only from certain IP addresses?

我正在尝试设置 Cloudflare 以缓存来自 S3 的图像。我希望在执行此操作时尽可能严格(最不宽容)。我假设我需要接受来自 Cloudflare 的请求来读取我的 S3 图像。我希望所有其他请求都被拒绝。

我遵循了这个指南:https://support.cloudflare.com/hc/en-us/articles/360037983412-Configuring-an-Amazon-Web-Services-static-site-to-use-Cloudflare

我没有在我的存储桶上启用静态网站托管,因为这对我的情况没有必要。

在我的存储桶权限中,我关闭了“阻止所有 public 访问”并暂时关闭了“阻止 public 访问通过新 public 存储桶或访问点授予的存储桶和对象政策”。我需要这样做才能添加存储桶策略。

根据上面的 link,我添加了一个如下所示的存储桶策略:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::www.example.com/*",
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        <CLOUDFLARE_IP_0>,
                        <CLOUDFLARE_IP_1>,
                        <CLOUDFLARE_IP_2>,
                        ...
                    ]
                }
            }
        }
    ]
}

此时,AWS 控制台中出现一条消息,指出:

“此存储桶具有 public 访问权限 您已提供 public 访问此存储桶的权限。我们强烈建议您永远不要授予任何类型的 public 对您的 S3 存储桶的访问权限。"

然后我重新打开“阻止 public 访问通过新 public 存储桶或访问点策略授予的存储桶和对象”并关闭“阻止 public 和跨账户通过任何 public 存储桶或访问点策略访问存储桶和对象。

此时,S3 图像请求行为似乎按预期工作,但我不确定我是否将所有内容都设置为最低限度的许可,尤其是考虑到 AWS 控制台中的警告消息。

根据我的描述,我是否在此存储桶中正确设置了只接受来自 Cloudflare 的读取请求并拒绝所有其他请求?我想确保拒绝来自 Cloudflare 以外的任何来源的请求。

听起来不错!如果它适用于 CloudFlare,但不适用于其他地方,那么它符合您的要求。

那些块 Public 访问警告是故意吓人的,让人们在向世界打开桶之前三思而后行。

您的政策很好地仅限于 GetObject,并且仅限于有限的 IP 地址范围。