EC2 IAM策略要求标签

4
AWS刚刚发布了EC2/EBS的必需标签支持: 新功能 - 创建时标记EC2实例&EBS卷
然而,所给出的示例仅检查标签是否具有固定值,这对我们来说没有用,因为我们的用户可以为必需标签输入自由格式的值。如何编写策略以检查标签是否存在?
例如,我们需要像这样的内容:
"Statement": [
    {
      "Sid": "DenyMissingTags",
      "Effect": "Deny",
      "Action": "ec2:RunInstances",
      "Resource": "arn:aws:ec2:us-east-1:accountid:instance/*",
      "Condition": {
        "StringExists": [
          "aws:RequestTag/costcenter",
          "aws:RequestTag/stack",
         ]
       }
     }
]

显然,我编造了StringExists
3个回答

3
AWS支持提供了一个解决方案,我证实它可行。需要两个单独的条件块来确保只有1个标签存在时拒绝该操作:
{
    "Sid": "AllowLaunchOnlyWithRequiredTags1",
    "Effect": "Deny",
    "Action": "ec2:RunInstances",
    "Resource": "arn:aws:ec2:us-east-1:accountid:instance/*",
    "Condition": {
        "Null": {"aws:RequestTag/costcenter": "true"}
    }
},
{
    "Sid": "AllowLaunchOnlyWithRequiredTags2",
    "Effect": "Deny",
    "Action": "ec2:RunInstances",
    "Resource": "arn:aws:ec2:us-east-1:accountid:instance/*",
    "Condition": {
        "Null": {"aws:RequestTag/stack": "true"}
    }
}

1
在条件语句中,Null 运算符是做什么用的? - Robert Fischer
2
@RobertFischer Null 运算符检查条件键是否存在,因此在这种情况下,它会在拒绝操作之前检查 "aws:RequestTag/stack" 是否为 null。 - silvamerica

2

那个页面实际上将标签执行列为:

  "Condition": {
    "StringEquals": {
      "aws:RequestTag/costcenter": "115",
      "aws:RequestTag/stack": "prod"
     },
     "ForAllValues:StringEquals": {
         "aws:TagKeys": ["costcenter","stack"]
     }
   }

ForAllValues 的文档中写道:

ForAllValues 限定符要求策略中列出所有请求的值。

因此,这部分可能会强制存在一个标签,但不会强制实际内容。


1
如果ForAllValues:StringEquals包含第三个标签键,它会失败吗? - Robert Fischer

-1

你可以使用StringLikeStringNotLike来实现某些功能,但它仅限于通配符,如果这对你有用的话。

String Conditional Operators

StringLike - 区分大小写匹配。值可以包含多字符匹配通配符(*)或单字符匹配通配符(?)在字符串的任何位置。

例如:

"Statement": [
{
  "Sid": "DenyMissingTags",
  "Effect": "Deny",
  "Action": "ec2:RunInstances",
  "Resource": "arn:aws:ec2:us-east-1:accountid:instance/*",
  "Condition": {
    "StringLike": [
      "aws:RequestTag/costcenter": "*",
      "aws:RequestTag/stack": "*"
      ]
    }
  }
]

我还没有测试过,但应该可以工作。


如果costcenterstack标签缺失或者有值(即始终存在),那么这不会拒绝ec2:RunInstances操作吗? - Robert Fischer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接