我使用 S3 来存储和提供许多文件。我故意在这里说得有点模糊。就假设有很多文件。
它前面有 CDN。目前,存储桶有一个策略,使其中的所有文件都可公开读取。到目前为止,效果还不错。
但是,现在,我有时会想暂时让其中一些文件无法访问,以便审核团队检查其中是否存在不当内容。我们希望绝对确保我们不提供不当内容。
除了将存储桶的策略默认设为私有并将每个公共文件设置为公开之外,我还有其他选择吗?我知道如何做到这一点(使用 aws cli 或其他 API 可以轻松编写脚本),但这似乎效率低下。
有没有办法编写一个 S3 安全策略,就像“一般来说,这里的所有内容都是公开的,除了这些文件”并且让它有效?
大规模“混合”公共/私人政策是否会变得效率低下?
答案1
不幸的是没有(反正我发现没有)。将策略设置为公开的存储桶会覆盖其中文件的私有 ACL 设置(为什么我不知道……如果你问我,这似乎很愚蠢)。为了在 S3 上拥有真正私有的私有文件,需要将存储桶的策略设置为私有,并将公共文件单独设置为公开。
您的替代方案可能是使用 2 个存储桶,将需要审核的内容放在第二个存储桶中,并标记为私密。然后,一旦审核团队接受了内容,您的软件就会将文件移至公共存储桶,并将其从私密存储桶中移除。
答案2
您可以使用以下方式明确拒绝对某些对象的访问对象标记和访问控制策略。
例如,使用以下存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::example-bucket/*"
},
{
"Sid": "DenyReadIfPrivate",
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::example-bucket/*",
"Condition": {
"StringEquals": {
"s3:ExistingObjectTag/security": "private"
}
}
}
]
}
由于Deny
> Allow
,每个标有 Keysecurity
和 Value 的对象private
都不会公开。