如何在asp.net core(on-prem)中保护ConnectionString和/或AppSettings

3

首先,我知道在 .Net Core 中我们没有 ConnectionStrings 和 AppSettings,但在我的情况下,我想加密一个 ConnectionString,以及可能存储在 appsettings.json(或其他设置文件)中的一些其他应用程序配置。

我知道这个问题已经在互联网上被讨论了很多次,但没有人似乎有一个合法的答案......所以提出的建议是:

  • 使用 EnvironmentConfigurationBuilder,但是...这并没有真正解决问题,因为我们只是将明文配置从 appsettings.json 移动到环境变量中
  • 创建一个自定义 ConfigurationProvider,它可以加密和解密 appsettings.json(或其中的某些部分),但是...这也不能解决问题,因为我们需要将解密的秘钥存储在我们的应用程序可以访问的地方,即使我们将密钥作为“硬编码”字符串存储在我们的应用程序中,一个“黑客”也可以简单地对其进行反编译。

还有人提到,即使你加密了 appsettings.json,一个“黑客”仍然可以进行内存转储并找到数据的解密版本......我不是该领域的专家,所以我不确定这样的事情有多么可能或者有多么复杂。

Azure Key Vault 也被提到了几次,但是...在我的情况下,以及在许多与当局合作的情况下,这不是一个选项,因为不允许使用云服务。

我可能有点过于担心了,因为如果攻击者/黑客实际上已经成功进入了我们的服务器,那么我们可能会有更大的问题......但是应该如何处理这个问题呢?你只是不关心,将其全部保留为“明文”吗?还是应该采取一些行动来加密或混淆秘密?

2个回答

0
保护ASP.NET Core应用程序中的appsettings.json文件是至关重要的,特别是当其中包含敏感数据,如数据库连接字符串、API密钥或其他秘密值时。出于安全原因,不建议将敏感配置设置以明文形式存储在appsettings.json文件中。以下是一些保护这些设置的方法:

环境变量

管理敏感配置的最简单方法之一是使用环境变量。与配置文件不同,环境变量易于在部署之间进行更改,而无需更改任何代码。

# set an environment variable in a shell
export MySensitiveData="MyValue"

你可以在代码中像这样访问它:
var mySensitiveData = Configuration["MySensitiveData"];

用户机密(仅用于开发)

ASP.NET Core提供了一个名为“用户机密”的功能,仅用于开发环境。这使开发人员能够存储和检索敏感数据,而不会将数据添加到源代码控制中。

dotnet user-secrets set "MySensitiveData" "MyValue"

要启用用户机密,您需要在您的csproj文件中添加对用户机密ID的引用。
<Project Sdk="Microsoft.NET.Sdk.Web">
  <PropertyGroup>
    <TargetFramework>netcoreapp3.1</TargetFramework>
    <UserSecretsId>your-user-secrets-id-here</UserSecretsId>
  </PropertyGroup>
  ...
</Project>

Azure Key Vault

如果您在Azure上部署应用程序,您可以利用Azure Key Vault来存储秘密、密钥和证书。

首先,添加必要的NuGet包:

dotnet add package Microsoft.Extensions.Configuration.AzureKeyVault

然后,在你的Program.cs中修改配置,将Azure Key Vault包含进去。
public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        {
            webBuilder.UseStartup<Startup>();
        })
        .ConfigureAppConfiguration((context, config) =>
        {
            if (context.HostingEnvironment.IsProduction())
            {
                var builtConfig = config.Build();
                var azureServiceTokenProvider = new AzureServiceTokenProvider();
                var keyVaultClient = new KeyVaultClient(
                    new KeyVaultClient.AuthenticationCallback(
                        azureServiceTokenProvider.KeyVaultTokenCallback));
                config.AddAzureKeyVault(
                    builtConfig["AzureKeyVault:BaseUrl"],
                    keyVaultClient,
                    new DefaultKeyVaultSecretManager());
            }
        });

加密

当您将敏感数据读回应用程序时,您可以对其进行加密和解密。这更复杂,需要您管理加密密钥。

第三方工具

许多第三方工具和库,例如HashiCorp的Vault,可以安全地管理应用程序的机密信息。

文件权限

确保您用于存储机密信息的文件或服务具有适当的文件权限,以防止未经授权的访问。

永远不要将机密信息存储在源代码中

这是不言而喻的,但永远不要将敏感数据存储在您的源代码或版本控制系统中。

通过使用这些方法中的一个或多个组合,您可以提高ASP.NET Core中敏感设置的安全性。


0

您不需要加密配置文件中的连接字符串,因为最好的方法仍然是不要将此信息存储在配置文件中,而是作为服务器上的环境变量。

在您的appsettings.json文件中,只需存储本地开发连接字符串。对于其他环境,在部署的服务器上为您的配置文件中的每个子节点设置一个带有__(双下划线)的环境变量。

您可以阅读此页面了解其工作原理。

如果您有以下配置文件

{ 
   "ConnectionStrings": { 
     "default": "Server=192.168.5.1; Database=DbContextFactorySample3; user id=database-user; password=Pa$$word;" 
   } 
}

在 Windows 服务器上,您可以设置值如下:
set "ConnectionStrings__default=Server=the-production-database-server; Database=DbContextFactorySample2; Trusted_Connection=True;"

我不知道你的部署流程和工具是怎样的,但值得深入研究并找出如何使用此功能。

例如,如果你正在 Kubernetes 上部署,可以使用 Helm 设置你的密钥值。

在我的公司中,我们在 TFS 上创建了一个发布管道,并利用变量部分来设置密钥值。这些值将在代码部署到 Kubernetes 时使用。 TFS 中发布管道中的变量可以像密码一样隐藏,没有开发人员能够看到生产值。只有管理员可以查看。


1
是的,我知道EnvironmentConfigurationBuilder(如上所述).. 但是..如果您的服务器遭到入侵,您的ConnectionString和其他设置将以明文形式暴露给攻击者阅读(即使它们位于环境变量中..只需点击几下),我也使用TFS(或Azure DevOps在我的情况下)和您提到的方法可以防止“不得不”将生产秘密检入repo,这正是我要使用的方法..但是..正如前面提到的那样,它仍然将机密留作纯文本并打开“基础设施”以进行额外的攻击。 - Inx51

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