Параметры AWS SSM GET с использованием расшифровки KMS
Сценарий: один из наших скриптов использует api boto3 км / с для PUT и GET SSM параметров с шифрованием и дешифрованием KMS. SSM param put работает отлично и параметры добавляются (с расшифровкой как true) с защищенной строкой в хранилище параметров ECM SSM. Проблема, с которой мы сталкиваемся, заключается в попытке получить значения параметров SSM с расшифровкой как true. Соответствующий лямбда-код, который запускает этот скрипт, выдает следующую ошибку при попытке запустить следующий скрипт boto3 (при запуске get_ssm_parameters_by_path):
session = boto3.Session()
ssm_client = session.client('ssm', 'us-east-1')
ssm_parameters = []
response = ssm_client.get_parameters_by_path(
Path=self.ssm_parameter_path,
Recursive=True,
WithDecryption=True
)
ОШИБКА: произошла ошибка (AccessDeniedException) при вызове операции GetParametersByPath: зашифрованный текст ссылается на главный ключ клиента, который не существует, не существует в этом регионе или у вас нет доступа к нему. (Сервис: AWSKMS; Код состояния: 400; Код ошибки: AccessDeniedException; Идентификатор запроса: eaaxx-7ae7-11e8-97xx5e-b9exxxxxxx410): ClientError
Я ознакомился с различными документами AWS по работе с шифрованием и дешифрованием KMS и обновил свой программный документ, как показано ниже, но пока не повезло. Роль, которую использует лямбда, имеет следующую политику доступа:
{
"Sid": "AllowSSMAccess",
"Effect": "Allow",
"Action": ["kms:Encrypt", "kms:Decrypt", "kms:ReEncrypt*", "kms:GenerateDataKey*", "kms:DescribeKey"],
"Resource": "arn:aws:kms:us-east-1:AWS_ACCOUNT_NUMBER:key/<aws/ssm default key id>",
"Condition": {
"StringEquals": {
"kms:ViaService": "ssm.us-east-1.amazonaws.com",
"kms:CallerAccount": "AWS_ACCOUNT_NUMBER"
}
}
},
{
"Sid": "AllowKeyMetadata",
"Effect": "Allow",
"Action": ["kms:Describe*", "kms:Get*", "kms:List*"],
"Resource": "arn:aws:kms:us-east-1:AWS_ACCOUNT_NUMBER:key/<aws/ssm default key id>"
},
{
"Sid": "KeyAccess",
"Effect": "Allow",
"Action": [
"kms:Describe*",
"kms:Enable*",
"kms:List*",
"kms:Get*",
"kms:TagResource"
],
"Resource": "arn:aws:kms:us-east-1:AWS_ACCOUNT_NUMBER:key/<aws/ssm default key id>"
}
Где AWS_ACCOUNT_NUMBER - это номер моей учетной записи AWS, а идентификатор ключа KMS - это ключ по умолчанию "aws / ssm" для шифрования и дешифрования параметра SSM. Ключ существует в учетной записи. Мы предоставляем регион "us-east-1", так что все в порядке на 0. В последней части ошибки написано "или у вас нет доступа".
Я вижу, что параметр доступен в хранилище параметров ECM SSM и правильно расшифрован с помощью KEY ID, который я использую для расшифровки.
Какие другие политики доступа или дополнения нам нужно выполнить, чтобы запустить get_parameters_by_path?
1 ответ
Вы должны определить следующую политику для доступа к ключу хранилища параметров.
{
"Sid": "getParameter",
"Effect": "Allow",
"Action": [
"ssm:GetParameters"
],
"Resource": "arn:aws:ssm:<region>:<AWS_ACCOUNT_NUMBER>:parameter/<Parameter_Store_Key_Name>"
},
{
"Sid": "decryptKey",
"Effect": "Allow",
"Action": [
"kms:Decrypt"
],
"Resource": "arn:aws:kms:<region>:<AWS_ACCOUNT_NUMBER>:key/<aws/ssm_Key_Id>"
}
ssm: GetParameters позволит нам получить доступ к Parameter_Store_Key_Name. См. https://docs.aws.amazon.com/kms/latest/developerguide/services-parameter-store.html.
Так что, по крайней мере, для нас решение было в IAM. Внизу списка есть раздел "Ключи шифрования". Вам необходимо добавить соответствующего пользователя или роль в соответствующий ключ. Эта ошибка является проблемой, поскольку она напрямую относится только к SSM, поэтому она вводит в заблуждение относительно того, где находится решение.
Дополнительная информация: https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html.