使用AWS Secrets Manager安全存储敏感信息

在现代软件开发中,保护敏感信息如数据库连接字符串、API密钥等至关重要。AWS Secrets Manager提供了一种安全、易于实现的方法来存储和管理这些秘密。本文将介绍如何使用AWS Secrets Manager,并展示如何通过.NET Core实现一个简单的API来访问这些秘密。

AWS Secrets Manager概述

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格式的完整实现。

为了实现这个功能,需要以下依赖:

  • AWSSDK.SecretsManager - 由Amazon Web Services提供
  • Microsoft.AspNetCore.App
  • Microsoft.NETCore.App
  • Swashbuckle.AspNetCore - 用于Swagger

首先,需要通过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; }

Swagger测试结果

附加的源代码将提供所有关于如何构建的详细信息。如果需要更多解释,请随时在评论中留言。

沪ICP备2024098111号-1
上海秋旦网络科技中心:上海市奉贤区金大公路8218号1幢 联系电话:17898875485