Вопрос или проблема
Вот полный сценарий. Мой случай использования требует 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 не имеет достаточных прав для выполнения операции с ключом. Возможно, это связано с:
-
Необходимыми правами для SNS и SQS: Права на выполнение операций с ключом KMS для сервисов SNS и SQS могут быть неправильно настроены.
-
Настройками политики в KMS: Политики на уровне KMS могут не полностью охватывать требуемые условия для работы с ключами.
-
Перекрестным доступом аккаунтов: Даже если роли и политики установлены, доступ между аккаунтами требует особого внимания к деталям.
Решение проблем
Для устранения данной проблемы рекомендуется предпринять следующие шаги:
-
Обновление политики 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 аккаунта. -
Проверка IAM ролей: Убедитесь, что роли IAM, используемые SNS и SQS, имеют разрешения, позволяющие взаимодействовать с KMS. Политики должны быть привязаны к задачам, использующим эти сервисы.
-
Логирование ошибок: Включите детализированное логирование с использованием AWS CloudTrail для отслеживания вызовов к KMS и выяснения, какие именно действия не удались.
Заключение
Использование центральных KMS ключей в рамках распределенных приложений AWS требует тщательной настройки и мониторинга. Мы рассмотрели основные шаги по устранению ошибки KMS.AccessDeniedException
, которая возникает при взаимодействии SNS с SQS. Придерживаясь этих рекомендаций, вы сможете минимизировать риск доступа и обеспечить должную работу системы.
Если у вас есть дополнительные вопросы или требуется дальнейшая помощь по данной теме, не стесняйтесь обращаться за поддержкой.