reactjs - 限制 S3 静态网站对 Cloudfront 的访问
问题描述
我知道这是一个常见问题,但我对他们的解决方案没有成功。
我在 S3 上托管了两个网站:
- bucket.ca(允许
*.bucket.ca
) - dev.bucket.ca(允许
dev.bucket.ca
)
它们可以公开访问,但我不希望任何人访问他们的 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 导致 Access Denied 的情况下按预期工作,并且我可以访问它的任何子路径dev.bucket.ca/*
。所以我复制了这个配置bucket.ca
,但结果总是 403。
检查回来dev.bucket.ca
,我不再能够访问它的子路径。dev.bucket.ca/404
结果为 403。
是否有可靠的方法来测试 S3 和 Cloudfront 配置?每次编辑 Cloudfront 时,更改的更新速度都很慢。我是否应该每次都擦除浏览器缓存并重新打开隐身模式以获得更可靠的结果?
解决方案
为了调试这个问题,我恢复了允许所有公开的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadForGetBucketObjects",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::dev.bucket.ca/*",
}
]
}
该政策完全适用于bucket.ca
和dev.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
推荐阅读
- node.js - 如何在 MS Bot Framework V4 中读取或访问 userState?
- python-3.x - 这两个制表符分隔的 .txt 文件之间有什么区别导致 .split("\t") 正确地将值与一个而不是另一个分开?
- docusignapi - DocuSign OAuth 令牌生成器坏了?
- python - 打字:当函数返回带有解压列表的元组时输入提示
- javascript - 如何在反应打字稿中呈现本地存储中的数据?
- c# - 如何读取实体框架中的 JSON 数据列?
- ios - 如何在 UITextView 中保存输入?
- azure - 无法通过不记名令牌生成的访问令牌连接 SQL Azure
- java - 不允许 {} 作为请求正文
- java - SWT/Jface 单元格文本未保存在模型中