Terraform:如何在同一 iam 策略文档语句中分离不同标识符的操作
Terraform: How to separate actions for different identifiers inside the same iam policy document statement
我正在尝试通过 Terraform 使用 aws_iam_policy_document 数据源为不同的 IAM 用户应用不同的操作。
让我们以下面的 KMS Key 政策声明为例:
data "aws_iam_policy_document" "kms_key_policy" {
statement {
sid = "Allow use of the key"
principals {
type = "AWS"
identifiers = var.A == true ? [ARN1, ARN2] : [ARN1]
}
actions = [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]
resources = ["*"]
}
}
在上述政策中,我想限制前两个actions
到ARN2,但保留ARN1最初在操作块中的所有 actions
。当然,我可以只添加另一个语句并将两个逻辑分开(如下所示),但我试图将所有逻辑保持在相同的 statement
中并避免重复代码:
statement {
sid = "Allow ARN1 use of the key"
principals {
type = "AWS"
identifiers = [ARN1]
}
actions = [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]
resources = ["*"]
}
statement {
sid = "Allow ARN2 use of the key"
principals {
type = "AWS"
identifiers = var.A == true ? [ARN2] : []
}
actions = [
"kms:Encrypt",
"kms:Decrypt"
]
resources = ["*"]
}
我已经尝试添加一个类似于用于检查是否存在 ARN2 的条件(如果定义了 var A),但我限制 ARN1与 ARN2 的动作(如果存在 ARN2),如下所示:
actions = var.A == true ? ["kms:Encrypt", "kms:Decrypt"] : ["kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey"]
我如何分离 actions
用于相同 [=15] 中的 不同 principal identifiers
ARN =]?
您所描述的是不可能的,因为您无法在政策评估期间将操作列表作为委托人的功能。这不是 Terraform 的限制,而是这些 AWS 语句的工作方式。您在此处编写的条件会在您应用 Terraform 代码时进行评估,而不是在策略评估期间进行评估。
无论 var.A
的值如何,您都不想允许两个主体使用相同的操作列表,因此您将始终需要至少两个语句。我希望这对你有意义。
我建议这样:
statement {
sid = "AllowEncryptDecrypt"
principals {
type = "AWS"
identifiers = var.A == true ? [ARN1, ARN2] : [ARN1]
}
actions = [
"kms:Encrypt",
"kms:Decrypt",
]
resources = ["*"]
}
statement {
sid = "AllowOtherKeyUse"
principals {
type = "AWS"
identifiers = [ARN1]
}
actions = [
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey",
]
resources = ["*"]
}
我认为这里没有真正的重复,因为操作列表之间没有重叠。
我正在尝试通过 Terraform 使用 aws_iam_policy_document 数据源为不同的 IAM 用户应用不同的操作。 让我们以下面的 KMS Key 政策声明为例:
data "aws_iam_policy_document" "kms_key_policy" {
statement {
sid = "Allow use of the key"
principals {
type = "AWS"
identifiers = var.A == true ? [ARN1, ARN2] : [ARN1]
}
actions = [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]
resources = ["*"]
}
}
在上述政策中,我想限制前两个actions
到ARN2,但保留ARN1最初在操作块中的所有 actions
。当然,我可以只添加另一个语句并将两个逻辑分开(如下所示),但我试图将所有逻辑保持在相同的 statement
中并避免重复代码:
statement {
sid = "Allow ARN1 use of the key"
principals {
type = "AWS"
identifiers = [ARN1]
}
actions = [
"kms:Encrypt",
"kms:Decrypt",
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey"
]
resources = ["*"]
}
statement {
sid = "Allow ARN2 use of the key"
principals {
type = "AWS"
identifiers = var.A == true ? [ARN2] : []
}
actions = [
"kms:Encrypt",
"kms:Decrypt"
]
resources = ["*"]
}
我已经尝试添加一个类似于用于检查是否存在 ARN2 的条件(如果定义了 var A),但我限制 ARN1与 ARN2 的动作(如果存在 ARN2),如下所示:
actions = var.A == true ? ["kms:Encrypt", "kms:Decrypt"] : ["kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey"]
我如何分离 actions
用于相同 [=15] 中的 不同 principal identifiers
ARN =]?
您所描述的是不可能的,因为您无法在政策评估期间将操作列表作为委托人的功能。这不是 Terraform 的限制,而是这些 AWS 语句的工作方式。您在此处编写的条件会在您应用 Terraform 代码时进行评估,而不是在策略评估期间进行评估。
无论 var.A
的值如何,您都不想允许两个主体使用相同的操作列表,因此您将始终需要至少两个语句。我希望这对你有意义。
我建议这样:
statement {
sid = "AllowEncryptDecrypt"
principals {
type = "AWS"
identifiers = var.A == true ? [ARN1, ARN2] : [ARN1]
}
actions = [
"kms:Encrypt",
"kms:Decrypt",
]
resources = ["*"]
}
statement {
sid = "AllowOtherKeyUse"
principals {
type = "AWS"
identifiers = [ARN1]
}
actions = [
"kms:ReEncrypt*",
"kms:GenerateDataKey*",
"kms:DescribeKey",
]
resources = ["*"]
}
我认为这里没有真正的重复,因为操作列表之间没有重叠。