在开发过程中安全地存储应用程序机密

小窍门

此内容摘自电子书《适用于容器化 .NET 应用程序的 .NET 微服务体系结构》,可以在 .NET Docs 上获取,也可以下载免费的 PDF 以供离线阅读。

适用于容器化 .NET 应用程序的 .NET 微服务体系结构电子书封面缩略图。

若要使用受保护的资源和其他服务进行连接,ASP.NET Core 应用程序通常需要使用包含敏感信息的连接字符串、密码或其他凭据。 这些敏感的信息片段称为 机密。 最佳做法是不要在源代码中包含机密,并确保不要将机密存储在源代码管理中。 相反,应使用 ASP.NET Core 配置模型从更安全的位置读取机密。

必须将用于访问开发和暂存资源的秘钥与用于访问生产资源的秘钥分开,因为不同的人员需要访问这些不同的秘钥集。 若要存储开发期间使用的机密,常见方法是将机密存储在环境变量中或使用 ASP.NET 核心机密管理器工具。 为了在生产环境中实现更安全的存储,微服务可以将机密存储在 Azure Key Vault 中。

将机密存储在环境变量中

使机密远离源代码的一种方法是让开发人员在其开发计算机上将基于字符串的机密设置为 环境变量 。 使用环境变量存储具有分层名称的机密(例如嵌套在配置节中的机密)时,必须将变量命名为包含其节的完整层次结构(用冒号分隔)。:)。

例如,将环境变量 Logging:LogLevel:Default 设置为 Debug 值等效于以下 JSON 文件中的配置值:

{
    "Logging": {
        "LogLevel": {
            "Default": "Debug"
        }
    }
}

要从环境变量中访问这些值,应用程序只需在构造AddEnvironmentVariables对象时通过ConfigurationBuilder调用IConfigurationRoot

注释

环境变量通常以纯文本形式存储,因此,如果计算机或进程遭到环境变量入侵,则环境变量值将可见。

使用 ASP.NET 核心机密管理器存储机密

ASP.NET 核心 机密管理器 工具提供了另一种在 开发过程中将机密从源代码中保留出来的方法。 若要使用机密管理器工具,请在项目文件中安装包 Microsoft.Extensions.Configuration.UserSecrets 。 一旦依赖项存在且已还原,便可使用 dotnet user-secrets 命令行工具从命令行设置机密的值。 这些机密将存储在用户配置文件目录中的 JSON 文件中(详细信息因 OS 而异),与源代码不同。

机密管理器工具设置的机密是根据使用这些机密的项目的UserSecretsId属性来组织的。 因此,必须确保在项目文件中设置 UserSecretsId 属性,如下面的代码片段所示。 默认值是由 Visual Studio 分配的 GUID,但只要它在计算机中是唯一的,则实际字符串并不重要。

<PropertyGroup>
    <UserSecretsId>UniqueIdentifyingString</UserSecretsId>
</PropertyGroup>

通过调用 AddUserSecrets<T> 实例上的 ConfigurationBuilder 将应用程序的机密包含在其配置中,就可以在应用程序中使用通过机密管理器存储的机密。 泛型参数 T 应是 UserSecretId 应用到的程序集中的类型。 通常,使用 AddUserSecrets<Startup> 很好。

使用 AddUserSecrets<Startup>() 方法在 CreateDefaultBuilder 中时,开发环境的默认选项包括