我想限制公共访问我们在S3中存储的一些对象,但是在同一个键层次中显示其他对象。例如,假设我想让bucketname/*
公开可读。但是,要阻止任何未明确授予IAM访问权限的用户访问bucketname/*/hidden/*
。
我可以使用像:
这样的存储桶策略{
"Id": "Policy123",
"Statement": [
{
"Sid": "Stmt123",
"Action": [ "s3:GetObject" ],
"Effect": "Allow",
"Resource": "arn:aws:s3:::bucketname/*",
"Principal": {
"AWS": [ "*" ]
}
},
{
"Sid": "Stmt124",
"Action": [ "s3:GetObject" ],
"Effect": "Deny",
"Resource": "arn:aws:s3:::bucketname/*/hidden/*",
"Principal": {
"AWS": [ "*" ]
}
]
}
但这可以防止我授予的任何IAM用户/组访问隐藏对象。在第二个语句中是否存在 Principal 的设置,该设置仅匹配未经身份验证的访问?或者更好的是,有没有办法只列出那些应该 NOT 受政策声明影响的 Principals ?
答案 0 :(得分:3)
根据AWS支持,目前无法实现。任何Deny
策略都会覆盖匹配(或子集)Allow
策略,并且无法拒绝匿名访问。
通过为匹配bucketname/*/hidden/*
的所有对象指定私有ACL,可以实现类似的效果,但这不是那么灵活,必须手动应用。
答案 1 :(得分:0)
您无需在存储桶上设置策略。实际上,您可以在IAM用户或组上应用相同的策略,具体取决于您的方案中最有效的方法。
https://console.aws.amazon.com/iam/home?#
有时需要将额外的权限添加到用户,以便他们可以看到要导航的存储桶。例如,如果他们使用云莓果,您将需要给他们列出主要桶的列表。例如,参见我的一项政策。
{
"Statement": [
{
"Sid": "Stmt1330983243489",
"Action": [
"s3:*"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::<allowbucket1>",
"arn:aws:s3:::<allowbucket1>/*"
]
},
{
"Sid": "Stmt1330983260440",
"Action": [
"s3:ListAllMyBuckets"
],
"Effect": "Allow",
"Resource": [
"arn:aws:s3:::*"
]
},
{
"Sid": "Stmt1330983357419",
"Action": [
"s3:CreateBucket",
"s3:DeleteBucket",
"s3:PutBucketNotification",
"s3:PutBucketPolicy",
"s3:PutBucketRequestPayment"
],
"Effect": "Deny",
"Resource": [
"arn:aws:s3:::*"
]
}
]
}