7

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

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

我想这也可以使用 AWS CLI 工具来实现,但我没有对此进行调查,因为我正在 Terraform 中构建环境并希望将其全部保存在一个地方。

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

4

2 回答 2

13

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

使用密钥策略的文档说明您必须拥有密钥策略,但您也可以选择使用 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 Policy 文档(推荐的方法,比导入 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_use.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_attachment使用name角色的属性,而不是 arn。
  • 您可以将任意数量的策略附加到角色
  • 如果您不知道密钥的 arn,但您知道 KMS 密钥的别名,则可以使用aws_kms_key 数据源查找 arn ,这将使您无需 terraform 接管密钥资源的控制即可获取 arn。验证密钥是否存在也很有帮助。
于 2018-11-07T12:18:15.993 回答
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 管理,你现在可以更新它的 iam 角色了terraform plan/apply

于 2017-10-05T00:42:18.743 回答