在现代软件开发中,保护敏感信息如数据库连接字符串、API密钥等至关重要。AWS Secrets Manager提供了一种安全、易于实现的方法来存储和管理这些秘密。本文将介绍如何使用AWS Secrets Manager,并展示如何通过.NET Core实现一个简单的API来访问这些秘密。
AWS Secrets Manager是一个托管服务,用于加密并安全地存储敏感信息。它使用在AWS Key Management Service (KMS)中拥有的加密密钥来加密秘密。当检索秘密时,Secrets Manager会解密秘密,并通过TLS安全地将其传输到本地环境。默认情况下,Secrets Manager不会将秘密写入或缓存到持久存储中。可以使用细粒度的AWS Identity and Access Management (IAM)策略来控制对秘密的访问。
Secrets Manager提供了版本控制功能,可以跟踪哪些秘密发生了变化以及何时发生了变化。此外,可以为秘密设置CloudWatch日志,以获取秘密版本控制的详细信息。
使用AWS Secrets Manager,可以按计划或按需轮换秘密,使用Secrets Manager控制台或AWS SDK。还可以通过修改示例Lambda函数来扩展此功能,以轮换其他秘密。例如,可以轮换用于授权应用程序的OAuth刷新令牌或用于本地托管的MySQL数据库的密码。所有这些操作都可以通过AWS提供的Secrets ManagerAPI来完成。
为了演示如何使用Secrets Manager,创建了一个微服务,它只做一件事:从AWS检索数据并以字符串格式返回秘密。这个服务包含了从Amazon Secrets Manager请求数据并返回JSON格式的完整实现。
为了实现这个功能,需要以下依赖:
首先,需要通过REST端点API接收输入。由于正在创建一个API,可以发送详细信息和秘密。为了做到这一点,让创建一个模型,它可以用来执行此操作。
public class SecretsDetail
{
public string Region { get; set; } // 部署秘密的区域
public string SecretName { get; set; } // 访问秘密的名称
public string AccessKeyID { get; set; } // 为秘密授权创建的访问ID
public string SecretKey { get; set; } // 授权的密钥
public string VersionStage { get; set; } // 想要访问的版本
public string ServiceURL { get; set; } // 端点的路径
}
一旦模型准备好,就可以将其用于控制器,它将传递给GetSecretManager类。当拥有所有AWS通信的详细信息时,就可以构建对象了。在下面的代码块中,使用AmazonSecretsManagerConfig构建Secrets Manager的端点信息。
string secretName = secretsDetail.SecretName;
string region = secretsDetail.Region;
string secret = "";
MemoryStream memoryStream = new MemoryStream();
AmazonSecretsManagerConfig amazonSecretsManagerConfig = new AmazonSecretsManagerConfig();
amazonSecretsManagerConfig.ServiceURL = secretsDetail.ServiceURL;
IAmazonSecretsManager client = new AmazonSecretsManagerClient(secretsDetail.AccessKeyID, secretsDetail.SecretKey, amazonSecretsManagerConfig);
GetSecretValueRequest request = new GetSecretValueRequest();
request.SecretId = secretName;
request.VersionStage = secretsDetail.VersionStage == null ? "AWSCURRENT" : secretsDetail.VersionStage;
GetSecretValueResponse response = null;
AmazonSecretsManagerConfig将获取端点信息。这将有助于从SecretManagerClient获取值。AccessKeyID和SecretKey将为提供Response的详细信息。下面的代码将从内存流中提取数据,并给一个明文字符串,可以将其转换为Json格式。
try
{
response = client.GetSecretValueAsync(request).Result;
}
catch (DecryptionFailureException)
{
// Secrets Manager无法使用提供的KMS密钥解密受保护的秘密文本。
// 在这里处理异常,或者根据判断重新抛出
throw;
}
if (response.SecretString != null)
{
secret = response.SecretString;
}
else
{
memoryStream = response.SecretBinary;
StreamReader reader = new StreamReader(memoryStream);
string decodedBinarySecret = System.Text.Encoding.UTF8.GetString(Convert.FromBase64String(reader.ReadToEnd()));
return decodedBinarySecret;
}
附加的源代码将提供所有关于如何构建的详细信息。如果需要更多解释,请随时在评论中留言。