Назад | Перейти на главную страницу

Политика IAM для принудительного применения тегов не работает

0 фаворит "против" Я создал политику IAM, запрещающую создание томов EBS, если они не помечены как ключами "empname" и "team". Политика прикреплена к тесту.

Когда я пытаюсь создать том без определенных тегов, возникает ошибка, и это нормально. Но теперь, когда я пытаюсь создать том с любым другим тегом (чем угодно с динамическим значением), он создает том, что неожиданно.

Это созданная политика 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"
            ]
        }
    }
  }
]
}

Есть ли способ ограничить создание тома тогда и только тогда, когда используются оба этих тега. Было бы здорово, если бы мы также могли указать значения тегов для использования.

В документации AWS есть конкретный пример:

https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ExamplePolicies_EC2.html#iam-example-manage-volumes-tags

{
  "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"]
          }
       }
  }
}

Он основан на разрешении, а не на запрете, и использует сопоставление положительной строки, а не отрицательное сопоставление строк. Есть ли причина, по которой вы хотите использовать запрет?

Используя Deny, вы говорите:

Если пользователь пытается создать том, отклоните действие, если (1) теги empname и team не включены И (2) если какие-либо указанные теги являются либо empname, либо team.

Когда вы указываете случайные теги, первое условие выполняется, но второй нет, поэтому отказ не произойдет.

Я думаю, что было бы намного логичнее и менее запутанно, если бы вы последовали примеру AWS и использовали Allow и положительное сопоставление строк.

В противном случае попробуйте изменить второе условие на:

    "ForAllValues:StringNotEquals": {
        "aws:TagKeys": [
            "empname",
            "team"
        ]
    }

но я не уверен, что это сработает.