Настройка исходных ключей KMS для репликации зашифрованных объектов

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

Я использую следующий скрипт Terraform:

replication_configuration {
  role = "${aws_iam_role.replication.arn}"

  rules {
    id     = "${var.service}"
    prefix = "${var.replication_bucket_prefix}"
    status = "Enabled"

    destination {
      bucket        = "${aws_s3_bucket.replication_bucket.arn}"
      storage_class = "STANDARD"
      replica_kms_key_id = "xxxxx"
    }

    source_selection_criteria {
      sse_kms_encrypted_objects {
        enabled = true
      }
    }
  }
}

Этот скрипт работает (он применяется), но при проверке в консоли AWS ключи KMS для исходного объекта не выбираются.

Глядя на конфигурацию, я не вижу нигде, чтобы указать эти ключи. replica_kms_key_id указывает ключ KMS, который будет использоваться для шифрования объектов в корзине назначения.


person Thomas Larsen    schedule 22.03.2018    source источник


Ответы (3)


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

В какой-то момент я заметил, что исходный ключ KMS отсутствует в конфигурации (как и вы), и добавил его через веб-интерфейс S3. После этого AWS создал другую политику (нигде ее не упомянув; я нашел ее днем ​​позже, когда занимался еще чем-то), назвав что-то вроде crr-$SOURCE_BUCKET_NAME-to-$TARGET_BUCKET_NAME, и присоединил ее к роли репликации. Изучив это правило, я понял, что это недостающая часть головоломки.

Это важная часть политики:

{
        "Action": [
            "kms:Decrypt"
        ],
        "Effect": "Allow",
        "Condition": {
            "StringLike": {
                "kms:ViaService": "s3.${var.source_bucket_region}.amazonaws.com",
                "kms:EncryptionContext:aws:s3:arn": [
                    "arn:aws:s3:::${var.source_bucket_name}/*"
                ]
            }
        },
        "Resource": [
            "${var.source_kms_key_arn}"
        ]
    },

${var.source_kms_key_arn} - ваш исходный ключ KMS arn.

PS: Эта проблема сводила меня с ума! (╯ ° □ °) ╯︵ ┻━┻

person malte    schedule 12.10.2018

Когда вы настраиваете репликацию в консоли, она создает новую политику и присоединяет ее к вашей роли репликации. Если вы создадите эту политику с помощью Terraform, она отобразится в консоли, и репликация будет работать.

В приведенном ниже коде предполагается, что вы создаете все сегменты и ключи в terraform, имена ресурсов - aws_s3_bucket.source и aws_s3_bucket.replica, а ключевые ресурсы - aws_kms_key.source и aws_kms_key.replica.

Это обязательно должно быть описано в документации ресурсов корзины s3 на сайте Terraform, потому что без нее она не будет работать, но это не так.

resource "aws_iam_policy" "replication" {
  name = "tf-iam-role-policy-replication-12345"

  policy = <<POLICY
{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Action": [
        "s3:ListBucket",
        "s3:GetReplicationConfiguration",
        "s3:GetObjectVersionForReplication",
        "s3:GetObjectVersionAcl",
        "s3:GetObjectVersionTagging",
        "s3:GetObjectRetention",
        "s3:GetObjectLegalHold"
      ],
      "Effect": "Allow",
      "Resource": [
        "${aws_s3_bucket.source.arn}",
        "${aws_s3_bucket.source.arn}/*"
      ]
    },
    {
      "Action": [
        "s3:ReplicateObject",
        "s3:ReplicateDelete",
        "s3:ReplicateTags",
        "s3:GetObjectVersionTagging"
      ],
      "Effect": "Allow",
      "Resource": [
        "${aws_s3_bucket.replica.arn}/*"
      ]
    },
    {
      "Action": [
        "kms:Decrypt"
      ],
      "Effect": "Allow",
        "Condition": {
          "StringLike": {
            "kms:ViaService": "s3.${aws_s3_bucket.source.region}.amazonaws.com",
            "kms:EncryptionContext:aws:s3:arn": [
              "${aws_s3_bucket.source.arn}/*"
            ]
          }
        },
        "Resource": [
          "${aws_kms_key.source.arn}"
        ]
    },
    {
      "Action":[
        "kms:Encrypt"
      ],
      "Effect":"Allow",
      "Condition": {
        "StringLike": {
          "kms:ViaService": "s3.${aws_s3_bucket.replica.region}.amazonaws.com",
          "kms:EncryptionContext:aws:s3:arn": [
            "${aws_s3_bucket.replica.arn}/*"
          ]
        }
      },
      "Resource":[
        "${aws_kms_key.replica.arn}"
      ]
    }
  ]
}
POLICY
}

Более подробную информацию можно найти в выпуске № 6046 в репозитории terraform-provider-aws

person Matt    schedule 27.12.2019

Столкнулся с той же проблемой. Я начал с документов политики в предыдущих комментариях от Мэтта и malte, но работает только с этим:

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Action": [
                "s3:ListBucket",
                "s3:GetReplicationConfiguration",
                "s3:GetObjectVersionForReplication",
                "s3:GetObjectVersion",
                "s3:GetObjectVersionAcl",
                "s3:GetObjectVersionTagging",
                "s3:GetObjectRetention",
                "s3:GetObjectLegalHold"
            ],
            "Effect": "Allow",
            "Resource": [
                "${aws_s3_bucket.source.arn}",
                "${aws_s3_bucket.source.arn}/*"
            ]
        },
        {
            "Action": [
                "s3:ReplicateObject",
                "s3:ReplicateDelete",
                "s3:ReplicateTags",
                "s3:GetObjectVersionTagging"
            ],
            "Effect": "Allow",
            "Condition": {
                "StringLikeIfExists": {
                    "s3:x-amz-server-side-encryption": [
                        "aws:kms",
                        "AES256"
                    ],
                    "s3:x-amz-server-side-encryption-aws-kms-key-id": [
                        "${aws_kms_key.replica.arn}"
                    ]
                }
            },
            "Resource": [
                "${aws_s3_bucket.replica.arn}/*"
            ]
        },
        {
            "Action": [
                "kms:Decrypt"
            ],
            "Effect": "Allow",
            "Condition": {
                "StringLike": {
                    "kms:ViaService": "s3.${aws_s3_bucket.source.region}.amazonaws.com",
                    "kms:EncryptionContext:aws:s3:arn": [
                        "${aws_s3_bucket.source.arn}/*"
                    ]
                }
            },
            "Resource": [
                "${aws_kms_key.source.arn}"
            ]
        },
        {
            "Action": [
                "kms:Encrypt"
            ],
            "Effect": "Allow",
            "Condition": {
                "StringLike": {
                    "kms:ViaService": "s3.${aws_s3_bucket.replica.region}.amazonaws.com",
                    "kms:EncryptionContext:aws:s3:arn": [
                        "${aws_s3_bucket.replica.arn}/*"
                    ]
                }
            },
            "Resource": [
                        "${aws_kms_key.replica.arn}"
            ]
        }
    ]
}

Обратите внимание на изменения, возможно, из V3 политики CRR (AWS создает s3crr_kms_v3_ * при выборе из консоли):

"Condition": {
                "StringLikeIfExists": {
                    "s3:x-amz-server-side-encryption": [
                        "aws:kms",
                        "AES256"
                    ],
                    "s3:x-amz-server-side-encryption-aws-kms-key-id": [
                        "${aws_kms_key.replica.arn}"
                    ]
                }
            }

Документация Terraform по S3 CRR с KMS все еще очень ограничена.

person coppaste    schedule 15.07.2020