.NET Core 6:保护连接字符串中可能包含的敏感信息

3
如何将敏感信息移至“秘密管理工具”中?
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
=> optionsBuilder.UseSqlServer("Server=Test; column encryption setting=enabled;Database=Test;user id=User1;password='Password1';Trust Server Certificate=true");

我知道我可以右键单击解决方案名称,然后选择“管理用户机密”,这将生成机密Json文件,但我要粘贴到此文件中的内容是什么?

当我将此应用程序移动到生产服务器时,我是否也要复制并粘贴secret.json

提前致谢。


您可以使用自动添加到您的“配置”中的环境变量。因此,当您将应用程序部署到生产服务器时,只需在 env 变量中指定连接字符串即可。 - Neistow
5个回答

5
你需要退一步并考虑ASP.NET Core/.NET提供的用于处理配置的工具。
DbContext Lifetime, Configuration, and Initialization文档中可以看到,常见的模式之一是使用依赖注入,在应用程序启动时设置连接字符串。这将需要向上下文添加构造函数(并修改/删除OnConfiguring重载-docs)。
public class ApplicationDbContext : DbContext
{
    public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options)
        : base(options)
    {
    }
}

"并且:"
builder.Services.AddDbContext<ApplicationDbContext>(
        options => options.UseSqlServer("ConnectionStringHere")); // or AddDbContextFactory

下一步是从设置中读取连接字符串:
builder.Services.AddDbContext<ApplicationDbContext>(
        options => options.UseSqlServer(builder.Configuration.GetConnectionString("ConnStringName"))); // or AddDbContextFactory

这将需要从配置文件中读取连接字符串,例如从appsettting.json文件中:
{
  "ConnectionStrings": {
    "ConnStringName": "ACTUAL_CONNECTION_STRING"
  },
}

您可以将连接字符串移动到任何受支持的配置提供程序之一,例如Secret Manager(请注意,它仅适用于开发环境,对于其他环境最好使用环境变量或安全密钥存储)。

1
在AWS、GCP或Azure中运行生产应用程序时,我们将所有机密保留在云提供商的相应秘密管理器中(例如 AWS Secrets Manager),并在创建运行时环境时使用脚本将这些机密注入到环境变量中。
请注意,通过Secrets Manager,我是指.NET Secret Manager,它仅在开发机器上的文件中存储机密。
.NET可以从环境中读取配置,包括连接字符串。
采用这种方法,只有受信任的DevOps人员才能查看连接字符串。它永远不会出现在文件中,当然也永远不会出现在源代码控制中。

0

在生产服务器中,您需要创建一个与生产连接字符串同名的配置密钥。

将ASPNETCORE_ENVIRONMENT变量设置为“Production”

当环境“ASPNETCORE_ENVIRONMENT”处于“Production”状态时,将忽略secrets.json源。您可以在默认应用程序配置源中检查此内容。

根据ASP.NET Core文档

WebApplication.CreateBuilder使用预配置的默认值初始化WebApplicationBuilder类的新实例。初始化的WebApplicationBuilder(builder)从最高优先级到最低优先级提供应用程序的默认配置:

  1. 使用命令行配置提供程序的命令行参数。
  2. 使用非前缀环境变量配置提供程序的非前缀环境变量。
  3. 在应用程序以开发环境运行时使用用户机密。
  4. 使用JSON配置提供程序的appsettings.{Environment}.json。例如,appsettings.Production.json和appsettings.Development.json。
  5. 使用JSON配置提供程序的appsettings.json。
  6. 回退到下一节中描述的主机配置。

0

生产服务器连接字符串的最佳处理方式是配置Windows身份验证。

  1. 必须配置网络用户。该用户应在SQL Server中被赋予权限。
  2. 当您配置Web服务器池时,请使用#1创建的标识运行此池
  3. 此时,您的连接字符串如下所示:Server = MyServerName; Database = MyDbName; Trusted_Connection = SSPI; Encrypt = false; TrustServerCertificate = true 。正如您所见-没有passworduser

有了这个设置,除非攻击者知道池运行下的帐户密码,否则这是足够安全的。

如果坚持使用Sql Authentication,则需要将凭据存储在安全秘密管理器(即使是自定义),然后在运行时获取它们并构建连接字符串。


0
最简单的解决方案可能是
    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            => optionsBuilder.UseSqlServer("Name=ConnectionStrings:DB1ConnectionString");

你的appsetting.json文件。
{
  "ConnectionStrings": {
    "DB1ConnectionString": "Data Source=sqlServer;Initial Catalog=<databseName>;User=<UserName>;Password=<Password>;TrustServerCertificate=True"
    "DB2ConnectionString": ...
  }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接