【问题标题】:Terraform and AWS: modify an existing policyTerraform 和 AWS:修改现有策略
【发布时间】:2020-09-17 02:30:01
【问题描述】:

我有一个附加到角色的现有 IAM 策略。每次在 Secrets Manager 中创建新密钥时,我都需要将新 ARN 附加到策略中。这可以用 Terraform 完成吗?我已设法将策略导入 terraform.state 文件,但我不知道如何: 1) 在“资源”列表中添加一个新的 ARN 2) 将更改推送到 AWS

政策现在是这样的:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": "secretsmanager:GetSecretValue",
        "Resource": [
            "SECRET_ARN_1",
            "SECRET_ARN_2",
            "SECRET_ARN_3"
        ]
    },
    {
        "Effect": "Allow",
        "Action": "kms:Decrypt",
        "Resource": "KMS_ARN"
    }
]

}

这就是我需要的样子:

{
"Version": "2012-10-17",
"Statement": [
    {
        "Effect": "Allow",
        "Action": "secretsmanager:GetSecretValue",
        "Resource": [
            "SECRET_ARN_1",
            "SECRET_ARN_2",
            "SECRET_ARN_3",
            "MY_BRAND_NEW_SECRET_ARN"
        ]
    },
    {
        "Effect": "Allow",
        "Action": "kms:Decrypt",
        "Resource": "KMS_ARN"
    }
]

}

通过将现有策略导入对象 aws_iam_policy.mysimplepolicy 来进行以下导入,但我不知道如何从这里开始。

terraform import aws_iam_policy.mysimplepolicy <MY_POLICY_ARN>

【问题讨论】:

    标签: amazon-web-services terraform amazon-iam terraform-provider-aws aws-secrets-manager


    【解决方案1】:

    听起来您已经知道如何将政策导入您所在的州。现在您需要在 Terraform 代码中定义资源,使其与策略匹配。

    首先,为 ARN 定义变量:

    variable "secret_arns" {
        description = "A list of secret manager ARNs that the IAM policy should permit access to."
        type        = list(string)
    }
    
    variable "kms_key_arns" {
        description = "A list of KMS Key ARNs that the IAM policy should permit access to."
        type        = list(string)
    }
    

    接下来,使用变量将策略文档定义为数据源:

    data "aws_iam_policy_document" "secret_access" {
        statement {
            sid       = "SecretsAccess"
            actions   = ["secretsmanager:GetSecretValue"]
            resources = var.secret_arns
            effect    = "Allow"
        }
        statement {
            sid       = "KMSAccess"
            actions   = "kms:Decrypt"
            resources = var.kms_key_arns
            effect    = "Allow"
        }
    }
    

    现在使用数据源创建一个策略:

    resource "aws_iam_policy" "mysimplepolicy" {
      name   = "MySimplePolicy"  # Make sure this has the name you want
      policy = data.aws_iam_policy_document.secret_access.json
    }
    

    最后,当您调用代码时,使用您喜欢的任何方法在变量中传递 ARN。它可以来自terraform.tfvars 文件或在命令行上使用-var 语法或作为另一个创建机密的 Terraform 模块的输出。例如:

    terraform apply -var='secret_arns=["arn1", "arn2", <etc>]' -var='kms_key_arns=["key-arn1", "key-arn2"]'
    

    每次您将新项目附加到其中一个变量并运行 terraform apply 时,Terraform 都会相应地更新策略。

    【讨论】:

    • 谢谢!这澄清了很多,解决了80%的问题。您是否知道是否有一种方法可以检索现有的秘密 ARN 列表并附加新的列表,而不是再次输入所有这些?此时我有一个 8 个长 ARN 的列表,将来会很痛苦。再次感谢。
    • 很高兴它有帮助!如果它对您有用,请投票和/或接受答案。至于检索现有的秘密,您可以使用aws_secretsmanager_secret 数据源来动态检索秘密。见:terraform.io/docs/providers/aws/d/secretsmanager_secret.html
    【解决方案2】:

    另一个可能更简单的选择是使用基于标签的授权。也就是说,修改策略以仅授予对具有特定标签的机密的访问权限,然后在创建机密时添加该标签。还有example docs 这样做。

    【讨论】:

      猜你喜欢
      • 2019-02-06
      • 2017-04-16
      • 2021-06-04
      • 2019-06-30
      • 2021-09-14
      • 2020-10-17
      • 2016-04-03
      • 2022-01-19
      • 1970-01-01
      相关资源
      最近更新 更多