【问题标题】:AWS KMS and IAM association using terraform version 0.12使用 terraform 版本 0.12 的 AWS KMS 和 IAM 关联
【发布时间】:2020-04-01 18:21:50
【问题描述】:

您好 AWS 和 Terraform 专家,我正在生成由我们以前的同事手动构建的 KMS 和 IAM 关联,​​我在完成以下所述的 kms 政策副本时遇到了问题:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::12345678912345:root"
        },
        "Action": "kms:*",
        "Resource": "*"
    },
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "ALSKDJFHGNVBCMXJDH0987"
        },
        "Action": "kms:Decrypt",
        "Resource": "*"
    }
]

}

这个 ALSKDJFHGNVBCMXJDH0987 是一个 IAM 角色,我相信它已被 AWS 控制台转换(尚不确定原因)

  {
        "Effect": "Allow",
        "Principal": {
            "AWS": "ALSKDJFHGNVBCMXJDH0987"
        },
        "Action": "kms:Decrypt",
        "Resource": "*"
    }

我在使用我创建的 terraform 脚本时遇到了这个错误:

Error: MalformedPolicyDocumentException: Policy contains a statement with one or more invalid principals.
status code: 400, request id: alsknldkj2-assd-3333-0sdc-askdjaksdjn2

on main.tf line 84, in resource "aws_kms_key" "secrets":
84: resource "aws_kms_key" "secrets" {

顺序有问题吗?还是我错过了什么?这里附上我使用的 terraform 代码:​​

data "template_file" "my-lambda-policy" {
 template = "${file("policy/lambda.json")}"
  vars = {
      SWAG = var.AWS-SWAG
      STUDENT-BELONGS = var.STUDENT
      STUDENT-TEACHER = var.TEACHER
      ROOM = var.CLASSROOM
  }
}

resource "aws_iam_policy" "my-lambda-pol" {
  name = "my-lambda-policy"
  policy = data.template_file.my-lambda-policy.rendered
}

data "template_file" "my-my-lambda-pol2" {
  template = "${file("policy/lambda2.json")}"
}

resource "aws_iam_policy" "my-lambda-pol2" {
  name = "my-my-lambda-pol2"
  policy = data.template_file.my-my-lambda-pol2.rendered
}

data "template_file" "my-lambda-to-my-kms-policy" {
  template = "${file("policy/kms-lambda.json")}"
  vars = {
      SWAG = var.AWS-SWAG
      KMS_KEY_ID = aws_kms_key.mysecret.id
  }
}

resource "aws_iam_policy" "lambda-to-kms" {
  name = "my-lambda-to-my-kms-policy"
  policy = data.template_file.my-lambda-to-my-kms-policy.rendered
}

resource "aws_iam_role" "the-lambda-role" {
  name = "{STUD_CHAIR}-${STU_SEAG}-${STUDENT-BELONGS}-${STUDENT-TEACHER}"
  assume_role_policy = <<EOF
{
   "Version": "2012-10-17",
   "Statement": [
      {
         "Effect": "Allow",
         "Principal": {
            "Service": "lambda.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
      }
   ]
}
EOF
}

resource "aws_iam_role_policy_attachment" "my-lambda-policy_attachment" {
  policy_arn = aws_iam_policy.my-lambda-pol.arn
  role = aws_iam_role.the-lambda-role.name
}

resource "aws_iam_role_policy_attachment" "my-lambda-pol2_attachment" {
  policy_arn = aws_iam_policy.my-lambda-pol2.arn
  role = aws_iam_role.the-lambda-role.name
}

resource "aws_iam_role_policy_attachment" "kms-attachment" {
  depends_on = [aws_kms_key.mysecret]
  policy_arn = aws_iam_policy.lambda-to-kms.arn
  role = aws_iam_role.the-lambda-role.name
}

data "template_file" "my-kms-policy" {
  template = "${file("policy/my-kms-policy.json")}"
  vars = {
      STUD_CHAIR= "${var.CHAIR}"
      STU_SWAG = "${l{var.SWAG}}"
      STUDENT-BELONGS = "${var.STUDENT}"
      STUDENT-TEACHER = "${var.TEACHER}"
      ROOM = "${var.CLASSROOM}"
  }
}

resource "aws_kms_key" "mysecret" {
  description = "KMS Key for ${var.STUDENT}-${var.TEACHER}-key-${var.CLASSROOM}"
  policy = data.template_file.my-kms-policy.rendered
  depends_on = [aws_iam_role.the-lambda-role]
}

resource "aws_kms_alias" "mysecret" {
  name = "alias/${var.STUDENT}-${var.TEACHER}-key-${var.CLASSROOM}"
  depends_on = [aws_iam_role.the-lambda-role]
  target_key_id = aws_kms_key.mysecret.key_id
}

这就是 my-kms-policy.json

里面的内容
{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::${ROOM}:root"
        },
        "Action": "kms:*",
        "Resource": "*"
    },
    {
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::${ROOM}:role/${STUD_CHAIR}-${STU_SEAG}-${STUDENT-BELONGS}-${STUDENT-TEACHER}"
        },
        "Action": "kms:Decrypt",
        "Resource": "*"
    }
]
}

【问题讨论】:

  • ALSKDJFHGNVBCMXJDH0987 主体值是在删除之前引用的 IAM 角色 ARN 时创建的。您确定您尝试授予权限的 IAM 角色存在吗?

标签: amazon-web-services terraform amazon-iam aws-kms


【解决方案1】:

解决方法

一种解决方法是运行terraform apply 两次。

原因

重新创建 IAM 角色时,需要更新引用此角色的策略,原因如下所述:

https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-user.html

如果您的 Principal 元素包含特定 IAM 角色或用户的 ARN,则在保存策略时,该 ARN 会转换为唯一的委托人 ID。这有助于通过删除和重新创建角色或用户来降低某人升级其权限的风险。您通常不会在控制台中看到此 ID,因为在显示信任策略时还会反向转换回 ARN。但是,如果您删除角色或用户,则委托人 ID 会出现在控制台中,因为 AWS 无法再将其映射回 ARN。因此,如果您删除并重新创建信任策略的 Principal 元素中引用的用户或角色,则必须编辑该角色以替换 ARN。

第一次运行 Terraform 将重新创建 IAM 角色,从而破坏策略。通过将新创建的引用添加到 IAM 角色,第二次运行将更正策略。

【讨论】:

    猜你喜欢
    • 2019-11-05
    • 2021-11-14
    • 2021-03-21
    • 2021-08-22
    • 1970-01-01
    • 2018-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多