使用 terraform 更新 KMS 密钥策略
Use terrform to update a KMS Key Policy
有谁知道如何让 Terraform 更新现有的 KMS 密钥策略?
我已经创建了 KMS 密钥,但我有一个临时 IAM 角色需要使用现有的 KMS 密钥。我希望能够将此 "new" IAM 角色添加到现有的 KMS 密钥策略中。我可以看到使用 AWS 控制台可以做到这一点,但我看不到如何在 Terraform 中做到这一点。
我想这也可以使用 AWS CLI 工具实现,但我没有对此进行调查,因为我正在 Terraform 中构建环境并希望将其全部保存在一个地方。
我应该指出,当前的 KMS 密钥用于加密 S3 上传和下载,并且各种 IAM 用户和角色已经可以访问当前密钥,因此创建新密钥只会为那些已经访问的人反转问题桶。
如果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 角色
如果密钥策略禁止使用 IAM 角色,BMW 的回答是正确的,但是,如果 KMS 密钥策略已设置为启用 IAM 策略,那么您可能不需要更新它。
using key policies 的文档说明您必须有密钥策略,但您也可以选择使用 IAM 策略来控制访问。
如果KMS Key Policy中包含此语句,则IAM Policies已启用,您可以继续创建IAM Policy来解决问题;您无需担心更新密钥策略。
{
"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
Create an IAM Policy document (recommended method, nicer than importing json and less messy that using templates)
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>"
]
}
}
Create an IAM Policy from that document
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}"
}
Attach it to the role
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 data source 查找 arn,这样您就可以获取 arn 而无需 terraform 接管密钥的控制资源。验证密钥是否存在也很有帮助。
有谁知道如何让 Terraform 更新现有的 KMS 密钥策略?
我已经创建了 KMS 密钥,但我有一个临时 IAM 角色需要使用现有的 KMS 密钥。我希望能够将此 "new" IAM 角色添加到现有的 KMS 密钥策略中。我可以看到使用 AWS 控制台可以做到这一点,但我看不到如何在 Terraform 中做到这一点。
我想这也可以使用 AWS CLI 工具实现,但我没有对此进行调查,因为我正在 Terraform 中构建环境并希望将其全部保存在一个地方。
我应该指出,当前的 KMS 密钥用于加密 S3 上传和下载,并且各种 IAM 用户和角色已经可以访问当前密钥,因此创建新密钥只会为那些已经访问的人反转问题桶。
如果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 角色,BMW 的回答是正确的,但是,如果 KMS 密钥策略已设置为启用 IAM 策略,那么您可能不需要更新它。
using key policies 的文档说明您必须有密钥策略,但您也可以选择使用 IAM 策略来控制访问。
如果KMS Key Policy中包含此语句,则IAM Policies已启用,您可以继续创建IAM Policy来解决问题;您无需担心更新密钥策略。
{
"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
Create an IAM Policy document (recommended method, nicer than importing json and less messy that using templates)
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>"
]
}
}
Create an IAM Policy from that document
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}"
}
Attach it to the role
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 data source 查找 arn,这样您就可以获取 arn 而无需 terraform 接管密钥的控制资源。验证密钥是否存在也很有帮助。