如果密钥策略禁用 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。验证密钥是否存在也很有帮助。