如何在AWS策略中提供多个StringNoteQuals条件? 我正在尝试编写AWS S3存储措施策略,该策略否认所有流量,除非来自两个VPC。我要编写的政策看起来像下面的逻辑,并且在两者之间

问题描述 投票:0回答:3

{ "Version": "2012-10-17", "Id": "Policy1415115909152", "Statement": [ { "Sid": "Allow-access-only-from-two-VPCs", "Action": "s3:*", "Effect": "Deny", "Resource": ["arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*"], "Condition": { "StringNotEquals": { "aws:sourceVpc": "vpc-111bbccc" }, "StringNotEquals": { "aws:sourceVpc": "vpc-111bbddd" } }, "Principal": "*" } ] }

至少一个字符串比较返回true,并且无法从任何地方访问S3存储桶。
    

以前从未尝试过。但是以下内容应起作用。来自:

使用IAM策略条件以进行细粒度访问控制

"StringNotEquals": {
       "aws:sourceVpc": ["vpc-111bbccc", "vpc-111bbddd"]
     }

amazon-web-services amazon-s3 amazon-iam
3个回答
30
投票
您原始JSON的问题:

"Condition": { "ForAllValues:StringNotEquals": { "aws:sourceVpc": [ "vpc-111bbccc", "vpc-111bbddd" ] },

您不能有重复的键
"Condition": {
    "StringNotEquals": {
        "aws:sourceVpc": "vpc-111bbccc"
    },
    "StringNotEquals": {
        "aws:sourceVpc": "vpc-111bbddd"
    }
}

22
投票
填充条件并指定

StringNotEquals

而不是
Allow
权限

自言自语:使用
Deny

权限而不是

Allow

Deny
,然后与数组一起使用
StringEquals
。所有值都将作为
OR

条件。

{ "Version": "2012-10-17", "Id": "Policy1415115909152", "Statement": [ { "Sid": "Allow-access-only-from-two-VPCs", "Action": "s3:*", "Effect": "Allow", "Resource": ["arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*"], "Condition": { "StringEquals": { "aws:sourceVpc": ["vpc-111bbccc", "vpc-111bbddd"] } }, "Principal": "*" } ] }

使用设置运算符
IAM策略允许使用
ForAnyValue
ForAllValues

,它使您可以测试A内部的多个值。
Condition

使用黑客组合

{ "Version": "2012-10-17", "Id": "Policy1415115909152", "Statement": [ { "Sid": "Deny-access-except-from-two-VPCs", "Action": "s3:*", "Effect": "Deny", "Resource": ["arn:aws:s3:::my-bucket", "arn:aws:s3:::my-bucket/*"], "Condition": { "ForAllValues:StringNotEquals": { "aws:sourceVpc": ["vpc-111bbccc", "vpc-111bbddd"] } }, "Principal": "*" } ] }

StringNotEquals
我可以肯定的是,这只会将您限制为有条件的2个VPC。
StringNotEqualsIgnoreCase

我不知道问问题时是否有所不同,但是结论是
{
   "Version": "2012-10-17",
   "Id": "Policy1415115909152",
   "Statement": [
     {
       "Sid": "Deny-access-except-from-two-VPCs",
       "Action": "s3:*",
       "Effect": "Deny",
       "Resource": ["arn:aws:s3:::my-bucket",
                    "arn:aws:s3:::my-bucket/*"],
       "Condition": {
         "StringNotEquals": {
           "aws:sourceVpc": ["vpc-111bbccc"]
         },
         "StringNotEqualsIgnoreCase": {
           "aws:sourceVpc": ["vpc-111ddeee"]
         }
       },
       "Principal": "*"
     }
   ]
}
的,好像是在做:

StringNotEqual
Iscrect
.

在正常比较被否定的情况下发生否定。因此,这是有效的:

incoming-value != value0 OR incoming-value != value1 OR ...

4
投票
相同

!(incoming-value == value0 OR incoming-value == value1 OR ...)

这意味着要使具有多个值的键返回

incoming-value != value0 AND incoming-value != value1 AND ...
,输入值必须不匹配给定多个值的
。 with键在键上,带有值

StringNotEqual将正如您期望的那样起作用(您实际上是否尝试过?)。条件只会返回true

DENY

您提供的值都不能与该键的传入值匹配,在这种情况下(
StringNotEqual
评估),

aws:sourceVpc

将像您想要的那样生效。 其他答案可能有效,但是使用
["vpc-111bbccc", "vpc-111bbddd"]
有不同的目的,而不是这个目的。

true

更像是:如果输入密钥具有多个值本身,请确保该集合是您在条件下放置的密钥的值的子集。对于一个有价值的传入键,可能没有理由使用
true
当背景时,我在API网关策略中使用了这种行为,否认除了匹配VPCE的所有人,所有人都会呼叫 - 与您非常相似。一切都很好。 您正确!

DENY

确实确实按预期的是您的场景工作,并且如您提到的那样有不同的目的。

如果源为“ VPC-111BBCCC”,则带有提供的数组的条件将返回false。
StringNoteQuals:此条件检查值的值是否不等于指定数组中的任何值。
阵列值:该数组包含“ VPC-111BBCCC”和“ VPC-111BBDDD”。
SourceVPC值:在这种情况下,SourceVPC明确是“ VPC-111BBCCC”。
由于
ForAllValues
的值与数组中的第一个值匹配,因此
ForAllValues
条件评估为false。
我建议考虑更新“验证的答案”,以反映此准确的解释,以避免对其他用户的任何潜在混淆。
	
最新问题
© www.soinside.com 2019 - 2024. All rights reserved.