Используйте terrform для обновления политики ключей KMS

Кто-нибудь знает, как я могу заставить Terraform ОБНОВИТЬ существующую политику KMS Key?

У меня уже есть ключи KMS, но у меня есть временная роль IAM, которая должна использовать существующий ключ KMS. Я хотел бы иметь возможность добавить эту «новую» роль IAM в существующую политику KMS Key. Я вижу, что это возможно с помощью консоли AWS, но не вижу, как это сделать в Terraform.

Я предполагаю, что это также возможно с помощью инструментов AWS CLI, но я не исследовал это, поскольку я создаю среду в Terraform и хотел бы сохранить все это в одном месте.

Я должен отметить, что текущий ключ KMS используется для шифрования загрузок и загрузок S3, и различные пользователи и роли IAM уже имеют доступ к текущему ключу, поэтому создание нового ключа просто устранит проблему для тех, кто уже имеет доступ к корзинам.


person SnazzyBootMan    schedule 04.10.2017    source источник


Ответы (2)


Ответ от BMW правильный, если политика ключей отключает использование ролей IAM, однако, если политика ключей 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 для роли Temp IAM, которую я здесь обозначил как temp_role_made_earlier

Создайте документ политики IAM (рекомендуемый метод, лучше, чем импорт 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, вы можете найти arn, используя источник данных aws_kms_key, который позволит вам получить arn без принятия терраформом контроля над ресурсом Key. Также может быть полезно проверить, существует ли ключ.
person Davos    schedule 07.11.2018
comment
Я особенно хочу поблагодарить вас за ссылку на источник данных aws_kms_key. Я не хочу импортировать свои ключи в Terraform из-за отсутствия реальной защиты от случайного уничтожения. - person Erica Kane; 30.07.2020
comment
Политики управления службой поиска для предотвращения разрушения KMS. - person koblas; 30.06.2021

Если ключ kms существует и не контролируется terraform, вам необходимо сначала импортировать этот ресурс.

Во-первых, убедитесь, что у вас есть готовые коды.

resource "aws_iam_role" "example" {
  name = "example"
  assume_role_policy = "<redacted>"
}

resource "aws_kms_key" "example" {
  description = "example"
  deletion_window_in_days = 10

  policy = "${file("kms-policy.json")}"
}

Затем запустите terraform import, чтобы импортировать этот ресурс.

$ terraform import aws_kms_key.example arn:aws:kms:us-west-2:111122223333:key/1234abcd-12ab-34cd-56ef-1234567890ab

После этого ключом kms можно будет управлять с помощью terraform, теперь вы можете обновить его роль iam с помощью terraform plan/apply

person BMW    schedule 05.10.2017
comment
Не будет ли это также означать, что при разрушении окружающей среды будет уничтожен и ключ? Я надеялся, что Terraform сможет использовать команду aws cli put-key-policy или что-то подобное. - person SnazzyBootMan; 05.10.2017
comment
Я обновил ответ, этот ресурс aws_kms_key имеет параметр «deletion_window_in_days = 10», (Необязательно) Продолжительность в днях, после которой ключ удаляется после уничтожения ресурса, должна составлять от 7 до 30 дней. По умолчанию 30 дней. - person BMW; 05.10.2017
comment
Да, вы можете по ошибке удалить критические ресурсы, если этот ресурс будет удален из файла конфигурации. Даже если был установлен prevent_destroy. См. github.com/hashicorp/terraform/issues/17599. - person Erica Kane; 30.07.2020