【问题标题】:The website hosted on EC2 not able to access S3 image link托管在 EC2 上的网站无法访问 S3 图像链接
【发布时间】:2021-02-02 13:26:21
【问题描述】:

我已将 Fulls3Access 角色分配给 EC2。 EC2 上的网站能够上传和删除 S3 对象,但访问 s3 资产 url 被拒绝(这意味着我无法读取图像)。我已启用阻止公共访问设置。我想让一些文件夹保密,只有网站可以访问这些文件夹。我尝试在存储桶策略上设置诸如 sourceIp 和referer url 之类的公共读取条件,但以下不起作用,网站上的图像仍然不显示。任何人都有想法来启用和限制仅对网站的读取 s3 存储桶访问?

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicRead",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::bucketname/assets/*",            ]
        },
        {
            "Sid": "AllowIP",
            "Effect": "Allow",
            "Principal": "*",
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::bucketname/private/*",
            ],
            "Condition": {
                "IpAddress": {
                    "aws:SourceIp": [
                        "ip1/32",
                        "ip2/32",                    ]
                }
            }
        }
    ]
}

【问题讨论】:

  • 你能澄清这部分吗? “我已启用阻止公共访问设置”。那么你能说“block public xxx”哪个是ON,哪个是OFF吗?除非在 UI 中发生更改,否则所有这些都应该关闭。我看不出存储桶策略有任何明显错误。最好将私有部分的访问权限授予通过实例配置文件分配给实例的角色,而不是 IP 地址条件。但这不会导致公共访问问题。
  • 谢谢佩奇。 ON 中的“阻止公共访问”。通过关闭它,它解决了读取访问问题。现在我的问题是如何限制对某些前缀的访问。私人部分是什么意思?它是私有子网的 VPC 吗?
  • 对不起,让我澄清一下。我的意思是“到你的私人部分”我。 e. bucketname/private/。因此,如果您的实例具有实例配置文件,您可以根据 ec2 实例的角色允许访问。这要灵活得多。我用谷歌搜索了这个例子docs.databricks.com/administration-guide/cloud-configurations/…
  • 谢谢@petrch,让我测试一下。这个链接很有帮助。

标签: amazon-web-services amazon-s3 amazon-ec2


【解决方案1】:

如果您尝试通过 EC2 主机上的应用程序在用户浏览器中提供这些资产,那么来源将不是 EC2 服务器,而是用户浏览器。

如果您想限制资产,可以采取一些选项,同时允许用户在浏览器中查看它们。

第一个选项是使用AWS SDKgenerate a presigned URL。这将创建一个临时链接,该链接将在一定时间后过期,这将需要在需要资产时生成,这对于不经常访问的敏感信息非常有效。

第二个选项是在 S3 存储桶前添加 CloudFront distribution,并使用 signed cookie。这将要求您的代码生成一个 cookie,然后将其包含在对 CloudFront 分配的所有请求中。它允许与签名 URL 相同的行为,但只需要生成一次,用户就可以访问所有内容。

如果所有资产只能从您的网站访问,但不被视为敏感资产,您还可以考虑将 WAF 添加到 S3 存储桶前面的 CloudFront 分配中。这将配置一个规则,仅允许“Referer”标头与您的域匹配的位置。这仍然可以通过在请求中设置该标头的人绕过,但会导致更少的爬虫访问您的资产。

How to Prevent Hotlinking by Using AWS WAF, Amazon CloudFront, and Referer Checking 文档中提供了更多信息。

【讨论】:

  • 感谢克里斯为我解惑。这些都是非常好的答案,正是我想要的。
猜你喜欢
  • 2012-12-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-08
  • 2020-12-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多