存储在Google秘密管理器中的DotNet用户秘密

时间:2020-07-24 20:17:05

标签: c# .net-core google-cloud-platform google-cloud-run google-secret-manager

我需要将dotnet网络应用程序部署到Google Cloud Run,并希望使用用户秘密文件来存储凭据。当前,它们处于不安全的appsettings中。有人使用Google秘密管理器完成此操作吗?

  • 最好存储键值对,即json blob吗?
  • 我想在启动时而不是在构建时提取值。

如果有现有的示例或摘要,将不胜感激。

谢谢。

2 个答案:

答案 0 :(得分:3)

Google Cloud Run和Google Secret Manager可以很好地协作。关键是向Cloud Run服务帐户授予特权以访问Secret Manager。这样就消除了在应用程序中访问秘密管理器所需的秘密。

Access control

最好存储键值对,即json blob吗?

这取决于要存储的数据量。通常,您使用名称(secretId)创建一个机密,然后(通过API或CLI gcloud)将数据分配给该机密。在您的应用程序中,您按名称(secretId)读取机密。

我想在启动时而不是在构建时提取值。

Seth Vargo(此处重复)提供的链接具有C#和许多其他语言的示例。您的应用程序在运行时会从Secret Manager中读取机密。

Creating secrets and versions

Guillaume Blaquiere写了一篇文章,展示了如何使用Secret Manager,Cloud Run和环境变量。绝对值得一读。

Secret Manager: Improve Cloud Run security without changing the code

答案 1 :(得分:-1)

恕我直言,最好使用专用的秘密引擎。

大多数秘密引擎:

Hashicorp保险柜<<可能是最灵活的。有人称它为秘密的“瑞士军刀”

毒品秘密商店

Azure KeyVault(天蓝色云)

AKS(AWS)(亚马逊云)

(还有您的好友Google)

相似

如果您正在使用Kubernetes,则可以编写一个具体的代码,它将从Kubernetes的“已安装的机密”中读取值。 (我更喜欢虚拟文件安装的机密)。

我要做的是创建一个抽象,然后为我的实现选择编写具体的代码。

对于开发环境,您还可以对此进行编码:https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-3.1&tabs=windows

但是对于生产而言,我使用下面的抽象,并将我的具体代码编码为上述解决方案之一。

https://pbhadani.com/posts/google-secret-manager/

using System.Threading;
using System.Threading.Tasks;


public interface ISecretRetriever
{
    Task<SecretModel> GetSecret(string secretName);

    Task<SecretModel> GetSecret(string secretName, CancellationToken ct);
}

..

using System.Collections.Generic;
using System.Linq;

[System.Diagnostics.DebuggerDisplay("SecretName='{SecretName}', SubSecretsCount='{SubSecrets.Count}'")]
public class SecretModel
{


    public SecretModel()
    {
        this.SubSecrets = new List<SubSecret>();
    }

    public string SecretName { get; set; }

    public ICollection<SubSecret> SubSecrets { get; set; }
}

..

using System.Security;

[System.Diagnostics.DebuggerDisplay("KeyName = '{KeyName}', SecretValueLength='{null == SecretValue ? 0 : SecretValue.Length}'")]
public class SubSecret
{
    public string KeyName { get; set; }

    public SecureString SecretValue { get; set; }
}

然后您的IoC注册将如下所示:

        if (hostingEnvironment.IsDevelopment()) /* https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.hostingenvironmentextensions.isdevelopment?view=aspnetcore-3.1 */
        {
            /* code your LowerEnvironmentsInsecureSecretRetriever to https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-3.1&tabs=windows */
            services.AddSingleton<ISecretRetriever, LowerEnvironmentsInsecureSecretRetriever>();
        }
        else
        {
            /* code your HashicorpVaultSecretRetriever to HashicorpVault (or use a different one */
            services.AddSingleton<ISecretRetriever, HashicorpVaultSecretRetriever>();
        }