使用terrform更新KMS密钥策略

时间:2017-10-04 12:20:49

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

有谁知道如何让Terraform更新现有的KMS密钥策略?

我已经创建了KMS密钥,但我有一个需要使用现有KMS密钥的临时IAM角色。我希望能够将这个“新的”IAM角色添加到现有的KMS密钥策略中。我可以看到使用AWS控制台可以实现这一点,但我看不到如何在Terraform中执行此操作。

我认为这也可以使用AWS CLI工具,但我没有调查过,因为我在Terraform中构建一个环境,并希望将它们全部放在一个地方。

我应该指出,当前的KMS密钥用于加密S3上传和下载,并且各种IAM用户和角色已经可以访问当前密钥,因此创建新密钥只会为已经访问存储桶的人解决问题。

2 个答案:

答案 0 :(得分:1)

如果kms密钥存在且不受terraform控制,则需要先导入此资源。

首先,确保准备好这些代码

resource "aws_iam_role" "example" {
  name = "example"
  assume_role_policy = "<redacted>"
}

resource "aws_kms_key" "example" {
  description = "example"
  deletion_window_in_days = 10

  policy = "${file("kms-policy.json")}"
}

然后运行terraform import以导入此资源。

$ terraform import aws_kms_key.example arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

之后,kms密钥可以通过terraform进行管理,您现在可以使用terraform plan/apply更新其iam角色

答案 1 :(得分:1)

如果密钥策略禁用了IAM角色,那么BMW的答案是正确的,但是,如果已将KMS密钥策略设置为启用IAM策略,则您可能不需要更新它。

using key policies的文档说明您必须具有密钥策略,但是您也可以选择使用IAM策略来控制访问。

如果KMS密钥策略包含此语句,则将启用IAM策略,您可以继续创建IAM策略来解决此问题;您不必担心更新密钥策略。

{
  "Sid": "Enable IAM User Permissions",
  "Effect": "Allow",
  "Principal": {"AWS": "arn:aws:iam::111122223333:root"},
  "Action": "kms:*",
  "Resource": "*"
}

在Terraform中,您可以创建一个IAM策略,并将其附加到该临时角色。

以下内容假设您已经在Terraform中获得了有关临时IAM角色的代码,在这里我将其称为temp_role_made_earlier

  

创建一个IAM策略文档(推荐方法,比导入json更好,并且比使用模板少混乱)

data "aws_iam_policy_document" "kms_use" {
  statement {
    sid = "Allow KMS Use"
    effect = "Allow"
    actions = [
      "kms:Encrypt",
      "kms:Decrypt",
      "kms:ReEncrypt*",
      "kms:GenerateDataKey*",
      "kms:DescribeKey",
    ]
    resources = [
      "<arn of the key goes here>"
    ]
  }
}
  

从该文档创建IAM策略

resource "aws_iam_policy" "kms_use" {
  name = "kmsuse"
  description = "Policy to allow use of KMS Key"
  policy = "${data.aws_iam_policy_document.kms_usage.json}"
}
  

将其附加到角色

resource "aws_iam_role_policy_attachment" "temp" {
  role = "${aws_iam_role.temp_role_made_earlier.name}"
  policy_arn = "${aws_iam_policy.kms_use.arn}"
}

注意

  • aws_iam_role_policy_attachement使用name属性作为角色,而不是arn。
  • 您可以为角色附加任意数量的策略
  • 如果您不知道Key的密钥,但您知道KMS密钥的别名,则可以使用aws_kms_key data source查找该arn,这样您就可以在不使用terraform接管Key资源的控制的情况下获取该arn。验证密钥是否存在也很有帮助。