我们有一个AWS用户,他应该能够Create
不同的资源,如Instances
, Volumes
和SecurityGroups
,但不能修改不属于其项目的资源。
为此目的,我们允许创建资源,并让用户CreateTags
使用Project
标记和<user's team name here>
值来创建资源。他不应该能够标记已经标记的资源,而不是其他团队的资源。(每个单独的资源在这里都有适当的标记)。
我创建了一个策略,语句:
[...]
{
"Effect": "Allow",
"Action": "ec2:CreateTags",
"Resource": "*",
"Condition": {
"Null": {
"ec2:ResourceTag/Project": "true"
}
}
}
[...]
如果我使用AWS的策略模拟器,我允许在没有Project
标记的资源上调用CreateTags
。如果我通过设置Project
标记来模拟它,则该操作如预期的那样是拒绝。
不幸的是,如果我对此策略使用AWS CLI中的相同操作,CreateTags
每次都是允许的。即使标签已经设置,甚至在外部实例上,用户也不应该能够修改:
作为上述策略的用户
aws ec2 create-security-group --group-name "test-sg" --description "test" # creation of a new resource
(AWS answer){
"GroupId": "sg-4a3151aa"
}
.
aws ec2 create-tags --resources sg-4a31513c --tags Key=Project,Value=web-performance # this should work, ResourceTag Project is Null
(success)
aws ec2 create-tags --resources sg-4a31513c --tags Key=Project,Value=web-performance # should *not* work, ResourceTag Project is already set and not Null
(success)
正如你所看到的,它两次都有效,并且它也适用于已经设置了标签的foreign Projects。
我也试过
"Condition": {
"StringNotLike": {
"ec2:ResourceTag/Project": "*"
}
}
它的行为完全类似于"Null"条件,即使在策略模拟器中也是如此。
你有什么想法吗?
Amazon EC2部分支持资源级权限。在撰写本文时,CreateTags操作不支持资源级权限。您可以在这里看到支持资源级权限的操作列表。
您可以通过更改策略来指定StopInstances(它支持资源级权限)来代替CreateTags来验证这一点。如果实例没有有Project标签,您的IAM用户将只能停止EC2实例。或者,如果您将Null条件更改为false,那么IAM用户将只能在实例确实具有Project标记时才能停止EC2实例。
因此,当CreateTags支持资源级权限时,您的策略可能在将来的某个时刻是正确的。