【问题标题】:Restrict S3 Static Website access to Cloudfront限制 S3 静态网站对 Cloudfront 的访问
【发布时间】:2019-11-17 01:34:30
【问题描述】:

我知道这是一个常见问题,但我没有通过他们的解决方案获得成功。

我在 S3 上托管了两个网站:

  • bucket.ca(允许*.bucket.ca
  • dev.bucket.ca(允许dev.bucket.ca

它们可以公开访问,但我不希望任何人访问他们的 S3 网址。所以我用StringEquals编辑了存储桶策略。

每个桶一个:

arn:aws:s3:::bucket.ca/* arn:aws:s3:::dev.bucket.ca/*

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::dev.bucket.ca/*",
            "Condition": {
                "StringEquals": {
                    "aws:UserAgent": "random-hash"
                }
            }
        }
    ]
}

这是令人沮丧的部分。每次更改 Cloudfront 或更改存储桶时,行为都高度不一致。

dev.bucket.ca 似乎按预期工作,其 S3 url 导致访问被拒绝,我可以访问其任何子路径 dev.bucket.ca/*。所以我为bucket.ca复制了这个配置,但结果总是403。

查看dev.bucket.ca,我无法再访问它的子路径。 dev.bucket.ca/404 结果为 403。

是否有可靠的方法来测试 S3 和 Cloudfront 配置?每次编辑 Cloudfront 时,更改的更新速度都很慢。我是否应该每次都清除浏览器缓存并重新打开隐身模式以获得更可靠的结果?

【问题讨论】:

  • 我探索了这种方法。根据文档,它不适用于托管在 S3 上的静态网站。我也不明白为什么,所以很高兴知道。
  • @Dan 我认为这是因为通过 S3 端点的访问是直接的并且在 IAM 的控制下,而通过 S3 Web HTTP 端点的访问是像任何其他的公共 HTTP 访问一样,阻止 IAM 能够确定它们是否来自给定的 AWS 服务。

标签: reactjs amazon-web-services amazon-s3 amazon-cloudfront


【解决方案1】:

为了调试这个问题,我恢复了政策以允许所有人公开:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::dev.bucket.ca/*",
        }
    ]
}

此政策完全适用于 bucket.cadev.bucket.ca。所以看起来这是我的条件问题。

"aws:UserAgent": "random-hash"

事实证明,自定义标头需要是 User-Agent 而不是 UserAgent。所以 Cloudfront 应该使用 User-Agent 作为其自定义标头和 S3 策略以使用 UserAgent

我在部署 Cloudfront 后对此进行了测试,两个网站都正常运行。 S3 存储桶也无法访问,这很好。


工作方针:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PublicReadForGetBucketObjects",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::dev.bucket.ca/*",
            "Condition": {
                "StringEquals": {
                    "aws:UserAgent": "RandomHash"
                }
            }
        }
    ]
}

使用以下云端设置:

Header Name: User-Agent

Value: MatchingRandomHash

【讨论】:

  • 您的完整(修订)政策是什么?
  • @JohnathanElmore 以上更新为我目前用于 S3 和 Cloudfront 的内容。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-09-20
  • 2019-08-25
  • 2021-01-06
  • 1970-01-01
  • 2018-11-10
  • 2019-08-04
  • 1970-01-01
相关资源
最近更新 更多