非常感谢来自 AWS 论坛的 IP this answer,我已经确认它对我有用:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BucketName/temp_public/*"
}
]
}
此语句将授予任何人对 temp_public 文件夹中对象的读取权限,而不管这些文件上的 ACL。
要覆盖所有其他文件的公共访问权限,您应该提供 +Deny+-type 语句。显式拒绝会覆盖任何允许访问,因此您必须排除已授予的权限。所以使用 NotResource 作为排除掩码(还没有最终确定,请阅读下文):
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:GetObject",
"NotResource": "arn:aws:s3:::BucketName/temp_public/*"
}
但是,这也会拒绝包括您的帐户在内的所有用户的访问,因为主体设置为“*”。因此,您必须将您的帐户排除在此拒绝之外(仍然不是最终结果):
{
"Effect": "Deny",
"NotPrincipal": { "AWS": "arn:aws:iam::XXXXYYYYZZZZ:root" },
"Action": "s3:GetObject",
"NotResource": "arn:aws:s3:::BucketName/temp_public/*"
}
(其中 XXXXYYYYZZZZ 是您的 12 位 AWS 账户 ID)
仍然存在问题:上面的语句拒绝访问所有 IAM 用户(根账户除外)。
您也想排除所有 IAM 用户,但这很棘手。由于某些原因,Amazon S3 不支持在存储桶策略中指定 IAM 用户的通配符。您不能将 "arn:aws:iam::XXXXYYYYZZZZ:user/*" 写为 Principal(它会给出错误:“Invalid principal in policy”)。您必须指定准确的用户名:
{
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::XXXXYYYYZZZZ:root",
"arn:aws:iam::XXXXYYYYZZZZ:user/user1",
"arn:aws:iam::XXXXYYYYZZZZ:user/user2",
"arn:aws:iam::XXXXYYYYZZZZ:user/user3",
"arn:aws:iam::XXXXYYYYZZZZ:user/user4" ]
}
"Action": "s3:GetObject",
"NotResource": "arn:aws:s3:::BucketName/temp_public/*"
}
来自 Rory 的注意:S3 文档建议您可以使用 arn:aws:iam::XXXXYYYYZZZZ:root 覆盖帐户中的所有用户,但这似乎不起作用
所以最终的策略将如下所示:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::BucketName/temp_public/*"
},
{
"Effect": "Deny",
"NotPrincipal": {
"AWS": [
"arn:aws:iam::XXXXYYYYZZZZ:root",
"arn:aws:iam::XXXXYYYYZZZZ:user/user1",
"arn:aws:iam::XXXXYYYYZZZZ:user/user2",
"arn:aws:iam::XXXXYYYYZZZZ:user/user3",
"arn:aws:iam::XXXXYYYYZZZZ:user/user4" ]
}
"Action": "s3:GetObject",
"NotResource": "arn:aws:s3:::BucketName/temp_public/*"
}
]
}