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 = ["*"]
}

我认为这里没有真正的重复,因为操作列表之间没有重叠。