0 反对 收藏 我创建了一个 IAM 策略,如果未使用“empname”和“team”键标记,则拒绝创建 EBS 卷。该策略已附加到测试用户。
当我尝试创建未定义标签的卷时,它会抛出错误,这很好。但现在当我尝试创建带有任何其他标签(任何具有动态值的标签)的卷时,它会创建卷,这是意料之外的。
这是为其创建的 IAM 策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCreateTaggedVolumes",
"Effect": "Deny",
"Action": "ec2:CreateVolume",
"Resource": "arn:aws:ec2:us-east-1:axxxxxxxxxxx:volume/*",
"Condition": {
"ForAllValues:StringNotLike": {
"aws:RequestTag/empname": "*",
"aws:RequestTag/team": "*"
},
"ForAllValues:StringEquals": {
"aws:TagKeys": [
"empname",
"team"
]
}
}
}
]
}
有没有办法限制当且仅当使用这两个标签时才创建卷。如果我们也可以指定要使用的标签值,那就太好了。
答案1
AWS 文档中有一个具体示例:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "AllowCreateTaggedVolumes",
"Effect": "Allow",
"Action": "ec2:CreateVolume",
"Resource": "arn:aws:ec2:us-east-1:123456789012:volume/*",
"Condition": {
"StringEquals": {
"aws:RequestTag/costcenter": "115",
"aws:RequestTag/stack": "prod"
},
"ForAllValues:StringEquals": {
"aws:TagKeys": ["costcenter","stack"]
}
}
}
}
它基于允许而不是拒绝,并且使用正向字符串匹配而不是负向字符串匹配。你有什么理由要使用拒绝吗?
使用拒绝,你是说:
如果用户尝试创建卷,则如果 (1) 不包含标签“empname”和“team”且 (2) 指定的任何标签为“empname”或“team”,则拒绝该操作。
当你指定随机标签时,第一个条件得到满足,但第二个不是,因此不会发生拒绝。
我认为,如果您遵循 AWS 示例并使用允许和正向字符串匹配,则会更合乎逻辑且不会那么令人困惑。
否则,尝试将第二个条件更改为:
"ForAllValues:StringNotEquals": {
"aws:TagKeys": [
"empname",
"team"
]
}
但我实际上并不确定这是否有效。