使 CloudFront 域成为访问我的静态网站的唯一方式

问题描述 投票:0回答:1

我在 AWS 上设置了一个简单的静态网站作为练习。

我的网站包含在 AWS S3 存储桶内,其结构如下:

/
├─ releases/
│  ├─ index.html
│  ├─ index.js
│  ├─ index.css
├─ secret.html

存储桶策略配置为仅允许访问

releases
目录,并禁止访问秘密
secret.html
所在的根目录。

{
    "Version": "2008-10-17",
    "Id": "PolicyForCloudFrontPrivateContent",
    "Statement": [
        {
            "Sid": "PublicReadGetObject",
            "Effect": "Allow",
            "Principal": "*",
            "Action": "s3:GetObject",
            "Resource": "arn:aws:s3:::www.aws-serverless.tc/releases/*"
        }
    ]
}

作为一项附加功能,我想使用 CloudFront 使我的网站更加可靠和安全。我已经添加了所有必要的配置。 现在我的网站可以通过

访问
http://*.s3-website.eu-north-1.amazonaws.com

URL 和

https://*.cloudfront.net

网址。

问题是,我不希望通过 s3-website url 访问该网站,而只能通过 cloudfront url 访问。

我已经尝试过此配置(我分别用我的 s3 存储桶 arn 和 cloudfront arn 替换了 arns):

{
    "Version": "2012-10-17",
    "Statement": {
        "Sid": "AllowCloudFrontServicePrincipalReadOnly",
        "Effect": "Allow",
        "Principal": {
            "Service": "cloudfront.amazonaws.com"
        },
        "Action": "s3:GetObject",
        "Resource": "arn:aws:s3:::<S3 bucket name>/releases/*",
        "Condition": {
            "StringEquals": {
                "AWS:SourceArn": "arn:aws:cloudfront::111122223333:distribution/<CloudFront distribution ID>"
            }
        }
    }
}

但是,当我用它替换旧配置时,s3-网站返回 403,这是正确的。但 CloudFront 站点也返回 403。

我从 Amazon Docs 获取了配置,知道为什么它不能按预期工作吗?

amazon-web-services amazon-s3 amazon-cloudfront
1个回答
0
投票

您的场景似乎是 S3 接入点 的理想用例。 您将创建一个接入点,该接入点的接入点策略限制仅访问

/releases
路径。

您可以创建另一个具有不同策略和更广泛访问权限的访问点,以供那些需要访问机密的人使用。

然后,您可以定义一个存储桶策略,有效地将所有访问控制委托给访问点,如 https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-policies.html# 中所述接入点委派控制

使用该配置,通过默认 S3 URL 进行的访问将被拒绝,而使用其中一个接入点进行的访问将受相应接入点策略的控制。 最后,您将 CloudFront 源设置为使用您为

/releases
创建的 S3 访问点。 因此,虽然这可能无法直接回答您的问题,但这可能是一个更优雅的解决方案。 AWS 说

您可以将对存储桶的访问控制委托给该存储桶的访问权限 点...因此,对该存储桶的所有访问都受策略控制 连接到其接入点。我们建议配置您的存储桶 这种方式适用于不需要直接访问的所有用例 桶。

© www.soinside.com 2019 - 2024. All rights reserved.