我有以下策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "",
"Effect": "Allow",
"Action": [
"iam:TagRole"
],
"Resource": "arn:aws:iam::*:role/*",
}
},
{
"Sid": "",
"Effect": "Deny",
"Action": [
"iam:TagRole"
],
"Resource": "arn:aws:iam::*:role/*",
"Condition": {
"StringNotEquals": {
"aws:RequestTag/TeamCode": [
"aaaa"
]
}
}
}
]
}
我希望此策略允许我标记任何角色(从第一条语句开始(,除非我想添加与"aaaa"不匹配的TeamCode
标记。
如图所示,如果我想向角色添加"CostCenter"标记,我希望aws:RequestTag/TeamCode
密钥不存在于请求上下文中,这将导致条件不满足,并且拒绝为否不会发生。当我使用IAM策略模拟器或实际角色进行测试时,不会发生这种情况。拒绝块每次都会被激活(我得到一个带有角色的明确拒绝,拒绝块由Policy Sim突出显示(。
我错过了什么?
如果aws:RequestTag/TeamCode
不存在,则以下将是不匹配(false
(:
"aws:RequestTag/TeamCode": [
"aaaa"
]
但是,由于在StringNotEquals
中使用Not
运算符,因此将条件翻转为true
,使其处于活动状态。
随后,您的策略只允许向角色添加标记TeamCode=aaaa
。由于不匹配,其他所有标记都将被拒绝。原因是,对于此标记,条件为true
(存在匹配(,并且运算符中的Not
会将其翻转为false
,而Deny
不适用。
我不知道如何改变你的政策,因为我不明白你想要实现什么。我刚刚向你解释了你为什么会遇到这个问题。