限制 S3 静态网站访问 Cloudfront

Restrict S3 Static Website access to Cloudfront

我知道这是一个常见问题,但我没有找到他们的解决方案。

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

它们可以公开访问,但我不希望任何人访问他们的 S3 url。所以我用 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 时,更改更新很慢。我是否应该每次都擦除浏览器缓存并重新打开隐身模式以获得更可靠的结果?

为了调试这个问题,我恢复了策略以允许所有 public:

{
    "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"

原来自定义 header 需要 User-Agent 而不是 UserAgent。所以 Cloudfront 应该使用 User-Agent 作为它的自定义 header 和 S3 策略使用 UserAgent.

我在部署 Cloudfront 后对此进行了测试,两个网站均正常运行。 S3 buckets也不能访问,太棒了


工作方针:

{
    "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