Неправильная политика Terraform - PullRequest
1 голос
/ 09 июля 2020

Я работаю над импортом kms в terraform, я импортировал эти ресурсы, но когда я пытаюсь запустить план terraform, он переупорядочивает arn, и, следовательно, последний arn имеет запятую. Таким образом, мое применение терраформы не работает.

Можно ли как-нибудь избежать этой перестановки? Я думаю, что в этом случае я должен использовать блок данных вместо прямого добавления политики. Но я не уверен, как передать блок данных ..

Похоже, я не могу использовать блок данных. Могу ли я как-нибудь избежать переупорядочения на arn в основном блоке?

Я использую terraform 0.12.20

policy. json .tpl

{
    "Version": "2012-10-17",
    "Id": "key-policy-1",
    "Statement": [{
            "Sid": "Enable IAM User Permissions",
            "Effect": "Allow",
            "Principal": {
                "AWS": ${allowed_resources}
            },
            "Action": "kms:*",
            "Resource": "*"
        },
        {
            "Sid": "Allow use of the key",
            "Effect": "Allow",
            "Principal": {
                "AWS": ${allowed_resources}
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        }
    ]
}

main.tf

resource "aws_kms_key" "key" {
  description = ""
  tags        = local.common_tags
  policy      = templatefile("${path.module}/policy.json.tpl", {
    allowed_resources = var.allowed_resources
  })
}

variables.tf

variable "allowed_resources" {
  description = "list of all principal resources"
  type        = list(string)
  default = [
    "arn:aws:iam::xxxxxxxxxxxx:user/a",
    "arn:aws:iam::xxxxxxxxxxxxx:user/b",
    "arn:aws:iam::xxxxxxxxxx:user/c",
    "arn:aws:iam::xxxxxxxxxx:role/abc
  ]
}

Ошибка

10:53:19 Error: MalformedPolicyDocumentException: Policy contains a statement with one or more invalid principals.
10:53:19 
10:53:19   on main.tf line 8, in resource "kms_key" "key":
10:53:19    8: resource "aws_kms_key" "key" {

План Terraform: Terraform будет выполнять следующие действия:

  # aws_kms_key.amp_key will be updated in-place
  ~ resource "aws_kms_key" "amp_key" {
        arn                      = "arn:aws:kms:us-east-1:xxxx:key/xxx-xxx-xxx-xx-xxxxxxxx"
        customer_master_key_spec = "SYMMETRIC_DEFAULT"
        enable_key_rotation      = false
        id                       = "xxx-xxx-xxx-xx-xxxxxxxx"
        is_enabled               = true
        key_id                   = "xxx-xxx-xxx-xx-xxxxxxxx"
        key_usage                = "ENCRYPT_DECRYPT"
      ~ policy                   = jsonencode(
          ~ {
                Id        = "key-policy-1"
              ~ Statement = [
                    {
                        Action    = "kms:*"
                        Effect    = "Allow"
                        Principal = {
                            AWS = "arn:aws:iam::xxxxxxxx:root"
                        }
                        Resource  = "*"
                        Sid       = "Enable IAM User Permissions"
                    },
                  ~ {
                        Action    = [
                            "kms:Encrypt",
                            "kms:Decrypt",
                            "kms:ReEncrypt*",
                            "kms:GenerateDataKey*",
                            "kms:DescribeKey",
                        ]
                        Effect    = "Allow"
                      ~ Principal = {
                          ~ AWS = [
                              + "arn:aws:iam::xxxxxx:user/c",
                              + "arn:aws:iam::xxxxxx:user/a",
                              - "arn:aws:iam::xxxxxx:role/abc",
                              - "arn:aws:iam::xxxxxx:user/a",
                              - "arn:aws:iam::xxxxxx:user/c",
                                "arn:aws:iam::xxxxxx:user/b",
                              + "arn:aws:iam::xxxxxx:role/abc",
                         ]
                       }
                     ]
                Version   = "2012-10-17"
                     }
                 )

Когда я пытался использовать блок данных

data "template_file" "temp_file" {
  template = "${file("${path.module}/amp_key_policy.json.tpl")}"
  vars = {
    allowed_resources = "${var.allowed_resources}" //tried without quotes
  }
}
resource "aws_kms_key" "amp_key" {
  description = ""
  tags        = local.common_tags
  policy      = data.template_file.temp_file.rendered
}

Ошибка: неверный тип значения атрибута

  on main.tf line 10, in data "template_file" "temp_file":
  10:   vars = {
  11:     allowed_resources = "${var.allowed_resources}"
  12:   }

Несоответствующее значение для атрибута «vars»: элемент «allowed_resources»: требуется строка.

Обновлено:

Я пытался использовать aws_iam_policy_document.

data "aws_iam_policy_document" "amp_key_doc" {
  for_each = toset(var.allowed_resources)
  statement {
    sid    = "Enable IAM User Permissions"
    effect = "Allow"
    principals {
      identifiers = ["arn:aws:iam::xxxxx:root"]
      type        = "AWS"
    }
    actions   = ["kms:*"]
    resources = ["*"]
  }

  statement {
    sid    = "Allow access for Key Administrators"
    effect = "Allow"
    principals {
      identifiers = ["arn:aws:iam::xxxx:user/a"]
      type        = "AWS"
    }
    actions = [
      "kms:Create*",
      "kms:Describe*",
      "kms:Enable*",
      "kms:List*",
      "kms:Put*",
      "kms:Update*",
      "kms:Revoke*",
      "kms:Disable*",
      "kms:Get*",
      "kms:Delete*",
      "kms:TagResource",
      "kms:UntagResource",
      "kms:ScheduleKeyDeletion",
    "kms:CancelKeyDeletion"]
    resources = ["*"]
  }

  statement {
    sid    = "Allow use of the key"
    effect = "Allow"
    principals {
      identifiers = [var.allowed_resources]
      type        = "AWS"
    }
    actions = [
      "kms:Encrypt",
      "kms:Decrypt",
      "kms:ReEncrypt*",
      "kms:GenerateDataKey*",
      "kms:DescribeKey"
    ]
    resources = ["*"]
  }

  statement {
    sid    = "Allow attachment of persistent resources"
    effect = "Allow"
    principals {
      identifiers = [var.allowed_resources]
      type        = "AWS"
    }
    actions = [
      "kms:CreateGrant",
      "kms:ListGrants",
      "kms:RevokeGrant"
    ]
    resources = ["*"]
    condition {
      test     = "Bool"
      values   = ["true"]
      variable = "kms:GrantIsForAWSResource"
    }
  }
}


resource "aws_kms_key" "key" {
  description = ""
  tags        = local.common_tags
  policy      = data.aws_iam_policy_document.key_doc.json

Получена ошибка, как передать весь фрагмент разрешенных_ресурсов?

Error: Incorrect attribute value type

  on data.tf line 43, in data "aws_iam_policy_document" "key_doc":
  43:       identifiers = [var.allowed_resources]

Inappropriate value for attribute "identifiers": element 0: string required.

Ошибка: неверный тип значения атрибута

в data.tf строка 60 в данных «aws_iam_policy_document» «key_do c»: 60: identifiers = [var.allowed_resources]

Несоответствующее значение для att ribute "идентификаторы": элемент 0: обязательная строка.

1 Ответ

1 голос
/ 09 июля 2020

Ошибка сводится к значениям vars, поддерживающим только примитивные типы , как указано в документации

Переменные для интерполяции в шаблоне. Обратите внимание, что все переменные должны быть примитивами. Прямые ссылки на списки или карты вызовут ошибку проверки.

Если вы создаете свою политику как iam_policy_document , вы можете использовать атрибут json ресурса для передачи в свой aws_kms_key ресурс.

...