首页 > 解决方案 > 将敏感值作为环境变量传递到 aws-cdk 自定义资源中是否安全

问题描述

在通过自定义资源初始化 cdk 堆栈时,我想将初始管理员用户保存到我的 dynamodb 表中,并且不确定安全地为该用户传递值的最佳方法。我的代码dotEnv现在使用并将值作为环境变量传递:

import * as cdk from "@aws-cdk/core";
import * as lambda from "@aws-cdk/aws-lambda";
import * as dynamodb from "@aws-cdk/aws-dynamodb";
import * as customResource from "@aws-cdk/custom-resources";

require("dotenv").config();

export class CDKBackend extends cdk.Construct {
    public readonly handler: lambda.Function;
    constructor(scope: cdk.Construct, id: string) {
        super(scope, id);

        const tableName = "CDKBackendTable";

        // not shown here but also:
        // creates a dynamodb table for tableName and a seedData lambda with access to it
        // also some lambdas for CRUD operations and an apiGateway.RestApi for them

        const seedDataProvider = new customResource.Provider(this, "seedDataProvider", {
            onEventHandler: seedDataLambda
        });

        new cdk.CustomResource(this, "SeedDataResource", {
            serviceToken: seedDataProvider.serviceToken,
            properties: {
                tableName,
                user: process.env.ADMIN,
                password: process.env.ADMINPASSWORD,
                salt: process.env.SALT
            }
        });
    }
}

此代码有效,但以这种方式通过 ADMIN、ADMINPASSWORD 和 SALT 是否安全?这种方法与从 AWS Secrets Manager 访问这些值之间的安全差异是什么?我还计划在为所有新用户生成 passwordDigest 值时使用该 SALT 值,而不仅仅是这个管理员用户。

标签: aws-cdk

解决方案


这些properties值将在部署时进行评估。因此,它们将成为 CloudFormation 模板的一部分。CloudFormation 模板可以在 AWS Web 控制台中查看。因此,从安全角度来看,以这种方式传递秘密是有问题的。

解决此问题的一种方法是使用AWS Secrets Manager存储密钥。aws-cdk与 Secrets Manager 有很好的集成。创建秘密后,您可以通过以下方式导入它:

const mySecretFromName = secretsmanager.Secret.fromSecretNameV2(stack, 'SecretFromName', 'MySecret')

不幸的是,AWS 自定义资源中不支持解析CloudFormation 动态引用。你可以在你的 lambda ( seedDataLambda) 中自己解决这个秘密。SqlRun存储库提供了一个示例。

请记住授予对自定义资源 lambda ( seedLambda) 的密钥的访问权限,例如

secret.grantRead(seedDataProvider.executionRole)

推荐阅读