Terraform и AWS: изменить существующую политику - PullRequest
4 голосов
/ 29 мая 2020

У меня есть существующая политика IAM, привязанная к роли. Каждый раз, когда в диспетчере секретов создается новый секрет, мне нужно добавить новый ARN в политику. Можно ли это сделать с помощью Terraform? Мне удалось импортировать политику в файл terraform.state, но я не знаю, как: 1) Добавить новый ARN в список «Ресурсы» 2) Pu sh изменить на 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>

Ответы [ 2 ]

3 голосов
/ 29 мая 2020

Похоже, вы уже выяснили, как импортировать политику в свое состояние. Теперь вам нужно определить ресурс в коде 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 обновляет политику соответствующим образом.

2 голосов
/ 29 мая 2020

Другой, возможно, более простой вариант - использовать авторизацию на основе тегов. То есть измените политику, чтобы предоставить доступ только к секретам с помощью указанного тега c, а затем, когда вы создаете секрет, добавьте этот тег. Для этого есть также примеры документов .

...