Lambda не может получить доступ к ключу 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

comment
Спасибо за решение, но не могли бы опубликовать его как ответ с кратким описанием того, что вы изменили? Было бы легче читать и понимать, что вы изменили.   -  person Federico    schedule 25.02.2019
comment
Для меня решением было создать необходимые конечные точки, как указано в docs.aws.amazon.com/systems-manager/latest/userguide/   -  person Federico    schedule 25.02.2019
comment
Возможно, глупый вопрос, но разве приведенный выше шаблон не является циклической ссылкой?   -  person Blam    schedule 14.11.2019
comment
Да, на самом деле это не сработает   -  person Madeo    schedule 11.07.2020


Ответы (1)


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

Вот официальный ресурс AWS о том, почему это происходит — https://docs.aws.amazon.com/kms/latest/developerguide/iam-policies.html

Согласно этому

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

person SanD    schedule 16.10.2019