Lambda 访问 KMS 所需的权限

Ama*_*mar 5 amazon-web-services amazon-dynamodb aws-lambda amazon-kms aws-cdk

我正在使用 AWS CDK。

我已创建客户管理的 CMK KMS 密钥以在 dynamoDB 表上启用服务器端加密。

KMS 关键政策:

  public static getKMSKeyPolicyDocument(): PolicyDocument {
    return new PolicyDocument({
      statements: [
        //Allow root in IAM Policy: https://docs.aws.amazon.com/kms/latest/developerguide/key-policies.html#key-policy-default-allow-root-enable-iam
        new PolicyStatement({
          principals: [new AccountRootPrincipal()],
          actions: ["kms:*"],
          resources: ["*"],
        }),
 
        new PolicyStatement({
          principals: [
            new ServicePrincipal("dynamodb.amazonaws.com"),
            new ServicePrincipal("lambda.amazonaws.com"),
          ],
          actions: [
            "kms:Encrypt",
            "kms:Decrypt",
            "kms:ReEncrypt*",
            "kms:GenerateDataKey*",
            "kms:DescribeKey",
            "kms:Get*",
            "kms:List*",
          ],
          resources: ["*"],
        }),
      ],
    });
  }
Run Code Online (Sandbox Code Playgroud)

一些 Lambda 使用这些 dynamo 数据库表来获取数据。所以,我的问题是:

我们是否再次需要显式授予每个 lambda 访问 KMS 密钥的权限?

public static grantAccessToKMSKey(role: IRole, kmsKey: IKey): void {
    role.addToPrincipalPolicy(
      new PolicyStatement({
        actions: [
          "kms:CreateGrant",
          "kms:Decrypt",
          "kms:DescribeKey",
          "kms:Encrypt",
          "kms:GenerateDataKey*",
          "kms:ReEncrypt*",
          "kms:Get*",
          "kms:List*",
        ],
        resources: [kmsKey.keyArn],
      })
    );
  }

Run Code Online (Sandbox Code Playgroud)

Tof*_*nov 1

您已授予 AWS Lambda 服务访问您的密钥的权限,而不是实际的 lambda 函数。这对于 lambda 函数访问 KMS 密钥来说既不充分,也不是必需的。

相反,您有两个选择:

  1. 更新 KMS 策略并使用您的 lambda 函数 arn 作为主体
  2. 更新 lambda iam 角色策略以访问 KMS 密钥

如果您的 lambda 和密钥都在同一个帐户中,那么上述两个选项之一就足够了。如果它们位于不同的帐户中,那么您需要同时执行这两个操作。