我在 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 获取了配置,知道为什么它不能按预期工作吗?
您的场景似乎是 S3 接入点 的理想用例。 您将创建一个接入点,该接入点的接入点策略限制仅访问
/releases
路径。
您可以创建另一个具有不同策略和更广泛访问权限的访问点,以供那些需要访问机密的人使用。
然后,您可以定义一个存储桶策略,有效地将所有访问控制委托给访问点,如 https://docs.aws.amazon.com/AmazonS3/latest/userguide/access-points-policies.html# 中所述接入点委派控制。
使用该配置,通过默认 S3 URL 进行的访问将被拒绝,而使用其中一个接入点进行的访问将受相应接入点策略的控制。 最后,您将 CloudFront 源设置为使用您为
/releases
创建的 S3 访问点。 因此,虽然这可能无法直接回答您的问题,但这可能是一个更优雅的解决方案。 AWS 说
您可以将对存储桶的访问控制委托给该存储桶的访问权限 点...因此,对该存储桶的所有访问都受策略控制 连接到其接入点。我们建议配置您的存储桶 这种方式适用于不需要直接访问的所有用例 桶。