Зашифрованные уведомления корзины от S3 до SQS

Как настроить уведомления корзины S3 для очереди в SQS, где KMS используется как для корзины, так и для очереди?

  • У меня есть корзина в S3, где содержимое зашифровано с помощью управляемого ключа AWS (ключ aws/s3 по умолчанию).
  • У меня есть очередь в SQS, где SSE (шифрование на стороне сервера) включено, но с использованием CMK (ключа, управляемого клиентом).

Когда я захожу в веб-консоль S3 и пытаюсь добавить событие уведомления в свой сегмент, которое отправляется в мою очередь в SQS, я получаю следующее сообщение об ошибке:

Невозможно проверить следующие конфигурации назначения. Сообщение в очередь SSE не может быть зашифровано с помощью KMS. (arn: aws: sqs: ca-central-1: ...: ...)

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

        {
            "Sid": "Let S3 encrypt messages so that bucket notifications can be encrypted",
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey",
                "kms:Encrypt"
            ],
            "Resource": "*"
        },

Что мне нужно сделать, чтобы разрешить уведомления корзины в зашифрованной очереди?


person Nic    schedule 04.05.2020    source источник
comment
Ведро и очередь находятся в одном регионе?   -  person Marcin    schedule 05.05.2020


Ответы (1)


Согласно документация, второе действие должно быть kms:Decrypt вместо kms:Encrypt.

Это немного противоречит интуиции относительно того, зачем нужен kms:Decrypt. Вы можете подумать, что поскольку очередь SQS зашифрована, поэтому, когда служба S3 вызывает SendMessage API, ему нужно kms:Encrypt разрешение, чтобы убедиться, что сообщение может быть зашифровано службой KMS, верно? Не совсем, и вот почему:

  1. Сообщение не зашифровано напрямую с помощью главного ключа (CMK). Вместо этого он использует шифрование конверта, а данные зашифрован с помощью ключа данных. Почему? Поскольку максимальный размер данных, которые симметричный CMK может зашифровать с помощью Encrypt API составляет 4096 байт, а размер сообщения, поддерживаемого службой SQS, может быть намного больше 4 КБ. Следовательно, kms:Encrypt не требуется, а вместо этого kms:GenerateDataKey требуется для генерации ключа данных, который используется для шифрования сообщения SQS.

  2. В разделе Настройка разрешений KMS для производителей этот документ AWS объясняет, зачем нужен kms:Decrypt.

Вызов kms:Decrypt состоит в том, чтобы проверить целостность нового ключа данных перед его использованием.

Чтобы быть предельно ясным, GenerateDataKey API возвращает как открытый текст ключ данных и зашифрованная копия ключа данных. Ключ данных в виде открытого текста используется для шифрования сообщения SQS, и ключ зашифрованных данных будет храниться вместе с сообщением в очереди. Единственный способ убедиться, что ключ зашифрованных данных действительно является зашифрованным текстом ключа данных открытого текста, - это то, что служба должна иметь kms:Decrypt разрешение на дешифрование зашифрованного текста и удостовериться, что вывод точно такой же, как ключ данных в виде обычного текста, возвращенный в ответе API GenerateDataKey.

person jellycsc    schedule 04.05.2020