【问题标题】:Caching secrets retrieved from Secrets Manager缓存从 Secrets Manager 检索到的密钥
【发布时间】:2021-08-05 16:23:48
【问题描述】:

我想使用 AWS Secrets Manager 在 Web 应用程序中存储 RDS 的密钥。 AWS 提供AWSSDK.SecretsManager.Caching 库以提高性能并降低成本。我正在重新考虑它。在完美的世界里,秘密只有在我需要的时候才会存在于记忆中。另一方面,有了缓存,它们就永远存在。缓存 (AWSSDK.SecretsManager.Caching) 中的数据是否加密?缓存在实践中会降低安全性吗?是手动实现 System.Security.SecureString 更好的解决方案?感谢您的任何反馈。

【问题讨论】:

  • 如果有人入侵了你的服务器,他们可以主动读取你的进程持有的内存,那么所有的安全措施都已经失败了,再做点什么已经太迟了。想一想,即使秘密在内存中被加密,您也需要以某种方式对其进行解密,您如何以一种在您的计算机上运行恶意软件的人无法检测到的方式做到这一点?
  • 补充一下上面的评论,不,缓存库只是一个非常简单的内存缓存。但是你可以而且应该查看 GitHub 中的源代码
  • 我发现更令人担忧的是,该库一年多以来没有收到任何更新,并且自今年 5 月以来无法将其与较新的 .NET Core 版本一起使用存在一个未解决的问题年...所以分叉它以使其与当前的软件包版本兼容实际上可能是一个好主意。

标签: c# .net aws-secrets-manager


【解决方案1】:

您可以将自定义扩展添加到缓存中,此扩展可以加密/解密内存中的数据。为此,您必须实现ISecretCacheHook 接口:

public class SecretCacheHook : ISecretCacheHook
{
  private readonly IEncryptionProvider _encryptionProvider;

  public SecretCacheHook(IEncryptionProvider encryptionProvider)
  {
    _encryptionProvider = encryptionProvider;
  }

  public object Get(object obj)
  {
    return _encryptionProvider.Decrypt(obj);
  }

  public object Put(object obj)
  {
    return _encryptionProvider.Encrypt(obj);
  }
}

并将对象传递给缓存配置:

var secretsManagerCache = new SecretsManagerCache(
  new AmazonSecretsManagerClient(RegionEndpoint.GetBySystemName(region)),
  new SecretCacheConfiguration
  {
    CacheHook = new SecretCacheHook(new EncryptionProvider())
  });

您可以在 AWS blog 上阅读更多信息。

【讨论】:

    猜你喜欢
    • 2021-10-29
    • 2021-06-25
    • 1970-01-01
    • 1970-01-01
    • 2021-10-22
    • 2019-02-15
    • 2020-01-09
    • 2020-09-29
    • 2021-09-18
    相关资源
    最近更新 更多