Лямбда не может получить доступ к ключу KMS
Когда я запускаю свой лямбда-код, я получаю следующую ошибку:
The ciphertext refers to a customer master key that does not exist, does not exist in this region, or you are not allowed to access.
Я в основном следовал этому, чтобы создать стек с помощью aws-sam-cli, а соответствующие разделы шаблона находятся ниже кода.
Соответствующий код:
const ssm = new AWS.SSM();
const param = {
Name: "param1",
WithDecryption: true
};
const secret = await ssm.getParameter(param).promise();
Соответствующая часть файла template.yaml:
KeyAlias:
Type: AWS::KMS::Alias
Properties:
AliasName: 'param1Key'
TargetKeyId: !Ref Key
Key:
Type: AWS::KMS::Key
Properties:
KeyPolicy:
Id: default
Statement:
- Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
Action:
- 'kms:Create*'
- 'kms:Encrypt'
- 'kms:Describe*'
- 'kms:Enable*'
- 'kms:List*'
- 'kms:Put*'
- 'kms:Update*'
- 'kms:Revoke*'
- 'kms:Disable*'
- 'kms:Get*'
- 'kms:Delete*'
- 'kms:ScheduleKeyDeletion'
- 'kms:CancelKeyDeletion'
Resource: '*'
Sid: Allow root account all permissions except to decrypt the key
Version: 2012-10-17
LambdaFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ../
Handler: app.lambda
Runtime: nodejs8.10
Policies:
- DynamoDBReadPolicy:
TableName: !Ref Table
- KMSDecryptPolicy:
KeyId: !Ref Key
- Statement:
- Action:
- "ssm:GetParameter"
Effect: Allow
Resource: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/param1"
Ли KMSDecryptPolicy
не разрешить использование ключа? Что мне не хватает? Спасибо!
РЕДАКТИРОВАТЬ: изменение шаблона ниже работает, но я бы очень хотел использовать KMSDecryptPolicy
в лямбда-определении, если это возможно.
LambdaFunction:
Type: AWS::Serverless::Function
Properties:
CodeUri: ../
Handler: app.lambda
Runtime: nodejs8.10
Policies:
- DynamoDBReadPolicy:
TableName: !Ref Table
- KMSDecryptPolicy:
KeyId: !Ref Key
- Statement:
- Action:
- "ssm:GetParameter"
Effect: Allow
Resource: !Sub "arn:aws:ssm:${AWS::Region}:${AWS::AccountId}:parameter/param1"
Key:
Type: AWS::KMS::Key
Properties:
KeyPolicy:
Id: default
Statement:
- Effect: Allow
Principal:
AWS: !Sub arn:aws:iam::${AWS::AccountId}:root
Action:
- 'kms:Create*'
- 'kms:Encrypt'
- 'kms:Describe*'
- 'kms:Enable*'
- 'kms:List*'
- 'kms:Put*'
- 'kms:Update*'
- 'kms:Revoke*'
- 'kms:Disable*'
- 'kms:Get*'
- 'kms:Delete*'
- 'kms:ScheduleKeyDeletion'
- 'kms:CancelKeyDeletion'
Resource: '*'
Sid: Allow root account all permissions except to decrypt the key
- Sid: 'Allow use of the key for decryption by the LambdaFunction'
Effect: Allow
Principal:
AWS: !GetAtt LambdaFunctionRole.Arn
Action:
- 'kms:Decrypt'
Resource: '*'
Version: 2012-10-17
0 ответов
Сам вопрос содержит ответ. Изменение заключается в том, что вместо предоставления разрешений KMS только для лямбда-роли (способ на основе идентификации) он также предоставил разрешения для лямбда-роли в ключевой политике (способ на основе ресурсов).
Вот официальный ресурс AWS о том, почему это происходит - https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html.
Согласно этому
Все KMS CMK имеют ключевую политику, и вы должны использовать ее для управления доступом к CMK. Политики IAM сами по себе недостаточны для разрешения доступа к CMK, хотя вы можете использовать их в сочетании с ключевой политикой CMK.