KMS.AccessDeniedException при получении сообщения SNS в SQS. KMS-ключ в другом аккаунте.

Вопрос или проблема

Вот полный сценарий. Мой случай использования требует SNS и SQS с включенной SSE. Мы используем ключи KMS BYOK, хранящиеся в центральном управляемом KMS-аккаунте. И SNS Topic, и SQS получают доступ к ключу из одного и того же аккаунта приложения. Политика имеет следующее для разрешения доступа (заметка: это не полная политика, только соответствующие кросс-аккаунтные и SNS/SQS моменты):

{
            "Sid": "Разрешить использование ключа",
            "Effect": "Allow",
            "Principal": {
                "AWS": [
                    "arn:aws:iam::112233445566:role/XYZ",
                    "arn:aws:iam::778899110022:root"
                ]
            },
            "Action": [
                "kms:Encrypt",
                "kms:Decrypt",
                "kms:ReEncrypt*",
                "kms:GenerateDataKey*",
                "kms:DescribeKey"
            ],
            "Resource": "*"
        },
        {
            "Sid": "Разрешить Amazon SNS использовать этот ключ",
            "Effect": "Allow",
            "Principal": {
                "Service": [
                    "sns.amazonaws.com",
                    "sqs.amazonaws.com"
                ]
            },
            "Action": [
                "kms:Decrypt",
                "kms:Encrypt",
                "kms:GenerateDataKey*"
            ],
            "Resource": "*"
        }
    ]
}

Что бы я ни пробовал, я получаю следующую ошибку от SQS при попытке прочитать сообщение:

“{\”ErrorCode\”:\”KMS.AccessDeniedException\”,\”ErrorMessage\”:\”null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: blahblahblah)\”,\”sqsRequestId\”:\”Unrecoverable\”}”

С учетом всего сказанного… когда я создаю свой собственный ключ в KMS-аккаунте и использую этот ключ, у меня все получается. К сожалению, наша политика безопасности требует использования их ключей KMS. Любая информация будет полезна.

Добавьте следующую политику в KMS:

 {
        "Sid": "Разрешить использование ключа",
        "Effect": "Allow",
        "Principal": {
            "AWS": "arn:aws:iam::222222222222:root"
        },
        "Action": [
            "kms:Decrypt",
            "kms:Encrypt",
            "kms:GenerateDataKey*"
        ],
        "Resource": "*",
        "Condition": {
            "StringEquals": {
                "kms:CallerAccount": "222222222222",
                "kms:ViaService": "sns.us-east-2.amazonaws.com"
            }
        }
    }

Ответ или решение

Решение проблемы KMS.AccessDeniedException при получении сообщения SNS в SQS

Введение

Использование Amazon SNS и SQS в сочетании с шифрованием на стороне сервиса (SSE) и управления ключами (KMS) создает множество возможностей, но также вызывает определённые сложности, особенно в случае, когда ключи KMS хранятся в, казалось бы, защищённом центральном аккаунте. В данном посте мы рассмотрим причины возникновения ошибки KMS.AccessDeniedException, когда сообщения SNS пытаются быть прочитанными через SQS, и предложим шаги для её устранения.

Описание проблемы

Ваша ситуация заключается в следующем: у вас имеется настроенный SNS и SQS с включённым шифрованием SSE, и вы используете ключи KMS (Bring Your Own Key) из центрального аккаунта с управлением безопасностью. Вы указали правильные политики, чтобы разрешить доступ к этим ключам, но всё равно получаете ошибку:

{"ErrorCode":"KMS.AccessDeniedException","ErrorMessage":"null (Service: AWSKMS; Status Code: 400; Error Code: AccessDeniedException; Request ID: blahblahblah)","sqsRequestId":"Unrecoverable"}

Анализ причин ошибки

Ошибка KMS.AccessDeniedException указывает на то, что вызов KMS не имеет достаточных прав для выполнения операции с ключом. Возможно, это связано с:

  1. Необходимыми правами для SNS и SQS: Права на выполнение операций с ключом KMS для сервисов SNS и SQS могут быть неправильно настроены.

  2. Настройками политики в KMS: Политики на уровне KMS могут не полностью охватывать требуемые условия для работы с ключами.

  3. Перекрестным доступом аккаунтов: Даже если роли и политики установлены, доступ между аккаунтами требует особого внимания к деталям.

Решение проблем

Для устранения данной проблемы рекомендуется предпринять следующие шаги:

  1. Обновление политики KMS: Убедитесь, что политики KMS разрешают необходимые действия на всех требуемых уровнях. Проверьте, чтобы политика содержала следующее:

    {
       "Sid": "Allow use of the key",
       "Effect": "Allow",
       "Principal": {
           "Service": [
               "sns.amazonaws.com",
               "sqs.amazonaws.com"
           ]
       },
       "Action": [
           "kms:Decrypt",
           "kms:Encrypt",
           "kms:GenerateDataKey*"
       ],
       "Resource": "*",
       "Condition": {
           "StringEquals": {
               "kms:CallerAccount": "YOUR_APP_ACCOUNT_ID",
               "kms:ViaService": "sns.us-east-2.amazonaws.com"
           }
       }
    }

    Пожалуйста, замените YOUR_APP_ACCOUNT_ID на фактический ID аккаунта.

  2. Проверка IAM ролей: Убедитесь, что роли IAM, используемые SNS и SQS, имеют разрешения, позволяющие взаимодействовать с KMS. Политики должны быть привязаны к задачам, использующим эти сервисы.

  3. Логирование ошибок: Включите детализированное логирование с использованием AWS CloudTrail для отслеживания вызовов к KMS и выяснения, какие именно действия не удались.

Заключение

Использование центральных KMS ключей в рамках распределенных приложений AWS требует тщательной настройки и мониторинга. Мы рассмотрели основные шаги по устранению ошибки KMS.AccessDeniedException, которая возникает при взаимодействии SNS с SQS. Придерживаясь этих рекомендаций, вы сможете минимизировать риск доступа и обеспечить должную работу системы.

Если у вас есть дополнительные вопросы или требуется дальнейшая помощь по данной теме, не стесняйтесь обращаться за поддержкой.

Оцените материал
Добавить комментарий

Капча загружается...