如果您的应用程序托管在 AWS 上,此解决方案可能是最简单的。它依赖于SecretConfiguration.AwsKms NuGet 包。
秘密以加密形式存储在单独的配置文件中。然后在运行时使用AWS Key Management Service 解密这些秘密。通过这种方式,您可以将机密信息与应用程序的源代码一起进行版本控制,同时避免以明文形式存储机密信息。
具体来说,它是一个与Microsoft.Extensions.Configuration 堆栈集成的配置提供程序。
步骤如下:
1.创建 KMS 密钥
使用 AWS 控制台或 CLI 创建 KMS 密钥(对称加密)。确保您的开发人员拥有加密但不解密的权限,并且只有用于运行您的应用程序的角色才有解密权限。
2。加密您的秘密
使用 AWS CLI 加密您的密钥。要使用的命令如下(将key-id 替换为您的 KMS 密钥的密钥 ID):
aws kms encrypt --cli-binary-format raw-in-base64-out --key-id "11111111-0000-0000-0000-000000000000" --plaintext "SECRET_TO_ENCRYPT"
输出将包含密文:
{
"CiphertextBlob": "AQICAHhDR/VQh6Ap...rfyKsKCG2h6WVK8=",
"KeyId": "arn:aws:kms:eu-west-1:123456789:key/11111111-0000-0000-0000-000000000000",
"EncryptionAlgorithm": "SYMMETRIC_DEFAULT"
}
对应用程序中的所有秘密重复此步骤。
3.为机密创建单独的配置文件
除了字符串值是加密的之外,此文件看起来就像您在 ASP.NET Core 应用程序中拥有的普通配置文件。例如,它可能看起来像:
{
"Database": {
"Password": "AQICAHhDR/VQh6Ap...rfyKsKCG2h6WVK8="
},
"Redis": {
"Password": "AQICAHhDR/VQh6Ap...47iiHg/XifWcxvQ="
}
}
如果您愿意,也可以为每个环境创建一个文件(例如 secrets.Staging.json 和 secrets.Production.json)。
4.启动时注册配置
在您的应用程序启动中,配置源配置,添加这个新的配置源:
string keyId = "arn:aws:kms:eu-west-1:123456789:key/11111111-0000-0000-0000-000000000000";
builder.Configuration.AddAwsKmsEncryptedConfiguration(
new AmazonKeyManagementServiceClient(),
keyId,
encryptedSource => encryptedSource
.SetBasePath(builder.Environment.ContentRootPath)
.AddJsonFile($"secrets.{builder.Environment.EnvironmentName}.json"));
这将具有在运行时透明地解密秘密的效果,并将键/值配置对与已配置的其余配置源合并。
5.以与通常访问配置设置相同的方式访问您的机密
现在您可以像使用 IConfiguration 一样使用配置:
IConfiguration configuration;
// Comes from your regular configuration file
string databaseLogin = configuration["Database:Login"];
// Comes from the encrypted configuration file
string databasePassword = configuration["Database:Password"];