AWS 机密管理器构建库
AWS CDK v1在2023-06-01上达到了支持结束. 此软件包不再更新,用户应该迁移到 AWS CDK v2.
关于如何移徙的更多信息,请参见: 移动到 AWS CDK v2 指南。 。 。 .
import * as secretsmanager from '@aws-cdk/aws-secretsmanager';
在堆栈中创建新密件
为了让SecretsManager自动生成一个新的秘密值, 您可以开始如下:
// Default secret
const secret = new secretsmanager.Secret(this, 'Secret');
// Using the default secret
new iam.User(this, 'User', {
password: secret.secretValue,
});
// Templated secret
const templatedSecret = new secretsmanager.Secret(this, 'TemplatedSecret', {
generateSecretString: {
secretStringTemplate: JSON.stringify({ username: 'user' }),
generateStringKey: 'password',
},
});
// Using the templated secret
new iam.User(this, 'OtherUser', {
userName: templatedSecret.secretValueFromJson('username').toString(),
password: templatedSecret.secretValueFromJson('password'),
});
如果需要使用先前存在的秘密,建议的方法是手动操作
提供其中的秘密 AWS 保密管理器 并使用 Secret.fromSecretArn
或者说 Secret.fromSecretAttributes 在您的 CDK 应用程序中提供它的方法 :
declare const encryptionKey: kms.Key;
const secret = secretsmanager.Secret.fromSecretAttributes(this, 'ImportedSecret', {
secretArn: 'arn:aws:secretsmanager:<region>:<account-id-number>:secret:<secret-name>-<random-6-characters>',
// If the secret is encrypted using a KMS-hosted CMK, either import or reference that key:
encryptionKey,
});
秘密管理器的秘密值只能用于所选的一组属性. 给 属性列表,参见 云格式动态参考文献。 。 。 .
一个秘密可以设置 RemovalPolicy如果设定为 RETAIN移除一个秘密就会失败.
允许将秘密用于某个角色
您必须允许某一资源,才能允许该资源
用一个秘密。 这一点可以通过 Secret.grantRead 和(或) Secret.grantWrite
方法,视需要而定:
const role = new iam.Role(this, 'SomeRole', { assumedBy: new iam.AccountRootPrincipal() });
const secret = new secretsmanager.Secret(this, 'Secret');
secret.grantRead(role);
secret.grantWrite(role);
如果如下例所示, 您的秘密是用 KMS 键创建的 :
declare const role: iam.Role;
const key = new kms.Key(this, 'KMS');
const secret = new secretsmanager.Secret(this, 'Secret', { encryptionKey: key });
secret.grantRead(role);
secret.grantWrite(role);
接下来 Secret.grantRead 财务报告和审定财务报表 Secret.grantWrite 还将赋予其作用
通过 KMS 密钥加密和解密相关权限
保密经理服务校长.
本金自动被添加到秘密资源政策和用于交叉账户访问的 KMS Key 政策中:
const otherAccount = new iam.AccountPrincipal('1234');
const key = new kms.Key(this, 'KMS');
const secret = new secretsmanager.Secret(this, 'Secret', { encryptionKey: key });
secret.grantRead(otherAccount);
旋转一个秘密
使用自定义 Lambda 函数
使用自定义的 Lambda 函数可添加到密件中的旋转调度 :
import * as lambda from '@aws-cdk/aws-lambda';
declare const fn: lambda.Function;
const secret = new secretsmanager.Secret(this, 'Secret');
secret.addRotationSchedule('RotationSchedule', {
rotationLambda: fn,
automaticallyAfter: Duration.days(15),
});
注意: Lambda 调用 secretsManager 所需的权限,而反之则根据 AWS 文档 只要Lambda不是进口的.
见 Lambda旋转函数概览 如何执行Lambda自转功能.
使用主机 Lambda 函数
使用 hostedRotation 使用主机 Lambda 函数旋转密钥的道具 :
const secret = new secretsmanager.Secret(this, 'Secret');
secret.addRotationSchedule('RotationSchedule', {
hostedRotation: secretsmanager.HostedRotation.mysqlSingleUser(),
});
主机旋转是为 MySQL, PostgreSQL, Oracle, MariaDB, SQLServer, RedShift和MongoDB(既用于单一用户计划,也用于多用户计划).
在VPC中部署时,主机旋转执行 ec2.IConnectable数字 :
declare const myVpc: ec2.Vpc;
declare const dbConnections: ec2.Connections;
declare const secret: secretsmanager.Secret;
const myHostedRotation = secretsmanager.HostedRotation.mysqlSingleUser({ vpc: myVpc });
secret.addRotationSchedule('RotationSchedule', { hostedRotation: myHostedRotation });
dbConnections.allowDefaultPortFrom(myHostedRotation);
另见 在 AWS 云阵中自动创建秘密。 。 。 .
旋转数据库证书
定义 a SecretRotation 以旋转数据库证书 :
declare const mySecret: secretsmanager.Secret;
declare const myDatabase: ec2.IConnectable;
declare const myVpc: ec2.Vpc;
new secretsmanager.SecretRotation(this, 'SecretRotation', {
application: secretsmanager.SecretRotationApplication.MYSQL_ROTATION_SINGLE_USER, // MySQL single user scheme
secret: mySecret,
target: myDatabase, // a Connectable
vpc: myVpc, // The VPC where the secret rotation application will be deployed
excludeCharacters: ' %+:;{}', // characters to never use when generating new passwords;
// by default, no characters are excluded,
// which might cause problems with some services, like DMS
});
秘密必须是JSON字符串,格式如下:
{
"engine": "<required: database engine>",
"host": "<required: instance host name>",
"username": "<required: username>",
"password": "<required: password>",
"dbname": "<optional: database name>",
"port": "<optional: if not specified, default port will be used>",
"masterarn": "<required for multi user rotation: the arn of the master secret which will be used to create users/change passwords>"
}
对于多用户方案,a masterSecret 必须指定:
declare const myUserSecret: secretsmanager.Secret;
declare const myMasterSecret: secretsmanager.Secret;
declare const myDatabase: ec2.IConnectable;
declare const myVpc: ec2.Vpc;
new secretsmanager.SecretRotation(this, 'SecretRotation', {
application: secretsmanager.SecretRotationApplication.MYSQL_ROTATION_MULTI_USER,
secret: myUserSecret, // The secret that will be rotated
masterSecret: myMasterSecret, // The secret used for the rotation
target: myDatabase,
vpc: myVpc,
});
另见 径 地点 证书的生成和轮换是一体化的.
导入密钥
现有的秘密可以通过ARN,名称等属性(包括用于加密秘密的KMS密钥)来导入. 由名称导入的秘密应当使用名称的短形(没有由SeclesManager提供的后缀); 3; 密名必须与堆栈在同一账户和区域内存在. 以名称来导入,可以更容易地参考不同区域创造的秘密,每个区域都有自己的后缀和ARN.
const secretCompleteArn = 'arn:aws:secretsmanager:eu-west-1:111111111111:secret:MySecret-f3gDy9';
const secretPartialArn = 'arn:aws:secretsmanager:eu-west-1:111111111111:secret:MySecret'; // No Secrets Manager suffix
const encryptionKey = kms.Key.fromKeyArn(this, 'MyEncKey', 'arn:aws:kms:eu-west-1:111111111111:key/21c4b39b-fde2-4273-9ac0-d9bb5c0d0030');
const mySecretFromCompleteArn = secretsmanager.Secret.fromSecretCompleteArn(this, 'SecretFromCompleteArn', secretCompleteArn);
const mySecretFromPartialArn = secretsmanager.Secret.fromSecretPartialArn(this, 'SecretFromPartialArn', secretPartialArn);
const mySecretFromName = secretsmanager.Secret.fromSecretNameV2(this, 'SecretFromName', 'MySecret')
const mySecretFromAttrs = secretsmanager.Secret.fromSecretAttributes(this, 'SecretFromAttributes', {
secretCompleteArn,
encryptionKey,
});
复制机密
机密可以通过具体说明复制到多个区域 replicaRegions数字 :
declare const myKey: kms.Key;
new secretsmanager.Secret(this, 'Secret', {
replicaRegions: [
{
region: 'eu-west-1',
},
{
region: 'eu-central-1',
encryptionKey: myKey,
}
]
});
或者,使用 addReplicaRegion()数字 :
const secret = new secretsmanager.Secret(this, 'Secret');
secret.addReplicaRegion('eu-west-1');