使用terraform版本0.12的AWS KMS和IAM关联

拉哥

嗨,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": "*"
    }
]
}
福克·坦德茨基

解决方法

解决方法是运行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角色,第二次运行该策略将纠正策略。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

AWS IAM 和 java sdk 服务客户端 - 如何使用与服务关联的角色生成凭证?

使用 Terraform 升级版本时如何忽略 aws_iam_policy 更改?

Terraform:将aws_iam_role_policy与aws_iam_role相关联

使用aws_s3_bucket时Terraform重写标签和版本控制信息

使用Cloudformation创建KMS密钥时,出现消息“没有IAM权限来处理AWS :: KMS :: Key资源上的标签”

使用AWS KMS和AWS CloudHSM进行现场级加密

在备用terraform上的IAM组中添加和删除的Terraform AWS IAM用户apply命令

如何使用Terraform创建具有访问权和密钥的AWS IAM服务账户

AWS KMS 和相关资源

Terraform:使用存储在AWS CodeCommit中的版本控制模块

AWS / Terraform Iam-内联

使用简单英语的AWS IAM角色和策略?

AWS QuickSight 能否同时使用 Active Directory 和 IAM 登录?

AWS:将IAM角色关联到IAM用户

将多个IAM角色与CloudFormation中的AWS :: IAM :: InstanceProfile关联

Terraform - aws_kms_key 抛出 MalformedPolicyDocumentException

如何使用Packer和Terraform管理映像版本?

特定的 nodejs 版本、opsworks_ruby、aws、chef 12

如何在Terraform中使用AWS为SQS提供的kms加密密钥

AWS IAM ARN和通配符

AWS - IAM 和清洁角色

通过terraform和gitlab yml脚本对AWS Lambda进行版本控制

通过CloudFormation将默认KMS密钥的使用授予IAM角色

导入terraform aws_iam_policy

如何使用Terraform和AWS API Gateway创建API代理

使用Secretsmanager Terraform设置AWS Access Key和Secret Key

创建使用Terraform创建新的AWS ecs taskdefinition版本时如何保留

如何使用terraform为RDS postgres db用户提供AWS IAM auth?

Terraform-使用针对多个账户的IAM变量的AWS权限边界