我正在研究S3存储桶策略。我们的想法是明确拒绝访问帐户中的所有IAM用户,但明确授予的用户除外。
我发现了一篇博文,介绍了如何限制对特定用户的访问。它运作良好。但是,我想扩展语法以包括将被允许访问的第二个IAM用户。实际上,这是OR条件。
但是,我对JSON非常陌生,而且我不确定该怎么做。
以下是适用于限制对单个用户的访问的策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AIDA<obfuscated id>:*",
"AIDA<obfuscated id>",
"111111111111"
]
}
}
}
]
}
任何人都可以帮我编辑上面的JSON以允许OR条件,我可以在其中指定允许访问的其他用户ID吗?
AdvThanksance!
答案 0 :(得分:1)
您不需要创建此拒绝规则,因为除非有明确的允许规则,否则所有请求都是denied by default。
要授权多个IAM用户,可以将它们列为数组元素。因此,您可以按如下方式编写存储桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowAllS3ActionsForSpecificIAMUsers",
"Effect": "Allow",
"Principal": {
"AWS": [
"arn:aws:iam::<account-number-without-hyphens>:user/<username1>",
"arn:aws:iam::<account-number-without-hyphens>:user/<username2>"
]
},
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-bucket",
"arn:aws:s3:::my-bucket/*"
]
}
]
}
您可以详细了解Principal
元素here。
答案 1 :(得分:1)
好的,我想出来了。
首先,我尝试向StringgNotLike
添加第二个Condition
子句,但这不起作用。
在做了更多的阅读之后,我意识到Condition子句接受多个键/值对。事实上,我在问题中展示的原始政策已经做到了。我只需要为已经存在的数组添加更多值。
有效的政策如下:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Deny",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::my-private-bucket",
"arn:aws:s3:::my-private-bucket/*"
],
"Condition": {
"StringNotLike": {
"aws:userId": [
"AIDA<obfuscated-id-1>:*",
"AIDA<obfuscated-id-1>",
"AIDA<obfuscated-id-2>:*",
"AIDA<obfuscated-id-2>",
"111111111111"
]
}
}
}
]
}
当我意识到密钥已经指定了一个值数组时,我只是将第二个用户ID添加到数组中,它运行得很好。