当前位置: 首页 > 知识库问答 >
问题:

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

贺正祥
2023-03-14

我正在尝试将Cloudflare设置为缓存来自S3的图像。我想在做这件事时尽可能地限制(最不宽容)。我假设我需要接受Cloudflare的请求来读取我的S3图像。我希望所有其他请求都被拒绝。

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

我没有在我的bucket上启用静态网站托管,因为这对于我的案例来说是不必要的。

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

在上面的链接中,我添加了一个bucket策略,如下所示:

{
    "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控制台中出现一条消息,说明:

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

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

在这一点上,S3映像请求行为似乎正在按预期工作,但我不确定我是否将所有内容设置为最小许可,特别是考虑到AWS控制台中的警告消息。

根据我的描述,我是否在这个bucket中正确设置了只接受来自Cloudflare的读取请求并拒绝所有其他请求?我希望确保来自Cloudflare以外的任何来源的请求都将被拒绝。

共有1个答案

司马项明
2023-03-14

听起来不错!如果它可以从CloudFlare工作,但不能从其他地方工作,那么它满足您的需求。

那些阻止公众进入的警告是故意吓人的,目的是让人们在向世界开放自己的桶之前三思而后行。

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

 类似资料:
  • 问题内容: 我想知道Android设备的IP地址是数据IP还是Wifi IP。 1)首先将设备连接到3G,然后将设备分配给网络IP。 2)之后将设备连接到WIFI,现在该设备将分配给WIFI IP。 3)任何可以让我们知道IP地址是Wifi IP地址还是网络IP的Android API? 在2.3.5中使用了下面的代码,一切都很好,但是在4.0.3中,ICS存在一些问题。 请帮助 4)当我关闭移动

  • 所以,设置是这样的。 我使用了delegate_to模块,并传递了FQDN,它可以工作,但它会询问我是否要继续连接(是/否),并等待用户在初始运行时的输入(如果给出是,它会按预期工作)。他们还有其他更简单、更干净的方法来解决这个问题吗? (注意:请记住,我不能修改库存的内容,比如放别名等) [servernode] 10.0.2.15 ANSIBLE_SSH_User=GRANT ANSIBLE_

  • 问题内容: 我已经在Web项目的jsp / servlet中创建了一个登录应用程序,我想知道访问我的登录页面的不同用户的地理位置。我怎么知道某个人正在从哪里访问我的登录页面?例如:如果某人正在访问加拿大的页面,那么一条记录将插入到我的数据库中,例如:IP:20.4.9.134和位置:Canada。 问题答案: 我用这个: http://freegeoip.net/xml/122.169.8.137

  • 问题内容: 我使用这部分代码来ping通Java中的ip地址,但只有ping通本地主机才能成功,而对于其他主机,程序会说该主机不可访问。我禁用了防火墙,但是仍然有此问题 输出为: 问题答案: 根据javadoc: “如果可以获取特权,典型的实现将使用ICMP ECHO REQUEST,否则它将尝试在目标主机的端口7(Echo)上建立TCP连接。” 选项1(ICMP)通常需要管理权限。

  • 但是,这给了我127.0.1.1的IP地址。当我使用时,我得到以下信息 首先,我不知道127.0.1.1是从哪里来的,但不管怎样,这都不是我想要的。当我谷歌的时候,我总是看到相同的语法,Bash脚本或netifaces,我试图使用标准库。 那么如何在Python中获取eth0的IP地址呢?