要求标签的EC2 IAM策略

时间:2017-03-30 14:59:51

标签: amazon-web-services amazon-ec2

AWS刚刚发布了针对EC2 / EBS的必需标记支持: New – Tag EC2 Instances & EBS Volumes on Creation

但是,给出的示例仅检查标签是否具有对我们无用的固定值,因为我们的用户可以为所需标签输入自由格式值。如何编写策略来检查标签?

例如,我们需要这样的东西:

"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 个答案:

答案 0 :(得分:2)

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 :(得分:1)

该页面实际上将标记强制列为:

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

documentation for ForAllValues说:

   ForAllValues 限定符要求所有请求的值都列在政策中

因此,该部分可能会强制执行标记,而不强制执行实际内容。

答案 2 :(得分:0)

您可以使用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": "*"
      ]
    }
  }
]

我没有对它进行过测试,但它应该有效。