• 安全机密管理:Asp.Net Core中的本地敏感数据保护技巧


    前言

    在我们开发过程中基本上不可或缺的用到一些敏感机密数据,比如SQL服务器的连接串或者是OAuth2Secret等,这些敏感数据在代码中是不太安全的,我们不应该在源代码中存储密码和其他的敏感数据,一种推荐的方式是通过Asp.Net Core机密管理器

    机密管理器

    ASP.NET Core 中,机密管理器通常指的是一种工具或机制,用于安全地存储和管理应用程序中的敏感数据,如数据库连接字符串、API 密钥、密码等。这样的工具可以帮助开发人员有效地管理敏感信息,避免将其硬编码在代码中或与源代码一同提交到版本控制系统中,从而提高数据安全性和保密性。

    通过上面我们可以得知,应用机密存储和项目数在不同的位置,也就是说不被 git 等源代码管理器所管理,所以不会随源代码迁入到远程服务器。

    为什么要使用机密管理器:

    • 安全性:通过使用机密管理器,可以将敏感数据存储在安全的位置,避免在代码中明文存储密码等敏感信息,从而减少数据泄露的风险。

    • 便捷性:机密管理器提供了方便的方式来存储和访问敏感数据,使开发人员能够轻松地在开发过程中使用这些数据,而无需担心泄露或不当处理。

    • 灵活性:通过机密管理器,可以轻松地在不同环境中管理不同的敏感数据,如开发、测试和生产环境,同时确保每个环境中的数据安全性。

    • 遵循最佳实践:使用机密管理器有助于遵循最佳实践,如将敏感数据与应用程序代码分离、避免硬编码密码等敏感信息,提高应用程序的安全性和可维护性。

    如何启用机密存储

    有两种方案第一种是使用CLI第二种是使用Visual Studio

    我们创建一个新的WebApi 项目dotNetParadise.UserSecret

    使用CLI

    机密管理器工具包含一个 init 命令 用来启用机密存储,在项目所在的目录,在我的示例中就是Api项目dotNetParadise.UserSecret的所在目录执行一下命令:

    dotnet user-secrets init
    

    image

    通过输出我们可以看到在我们项目的CSPROJ文件生成了一个UserSecretsId 元素添加到项目文件的 PropertyGroup 中,内部文本是任意的,但对于项目来说是唯一的。

      <PropertyGroup>
        <TargetFramework>net8.0TargetFramework>
        <Nullable>enableNullable>
        <ImplicitUsings>enableImplicitUsings>
        <UserSecretsId>c3cda712-dc63-439b-b6af-9c4d6060fde2UserSecretsId>
      PropertyGroup>
    
    

    设置机密

    使用 dotnet user-secrets set 命令来存储机密数据。

    在项目文件夹目录中执行此命令

    dotnet user-secrets set "Movies:ServiceApiKey" "12345"
    

    在这个示例中,使用 dotnet user-secrets set 命令设置了一个名为 "Movies:ServiceApiKey" 的应用机密,其值为 "12345"。冒号表示 "Movies" 是具有 "ServiceApiKey" 属性的对象文字。

    我们设置好的机密数据存到了哪里?

    Windows系统中

    %APPDATA%\Microsoft\UserSecrets\\secrets.json
    

    比如我刚才添加的就在机密存储位置:

    %APPDATA%\Microsoft\UserSecrets\c3cda712-dc63-439b-b6af-9c4d6060fde2\secrets.json
    

    image

    看一下里面的内容

    {
      "Movies:ServiceApiKey": "12345"
    }
    

    也可以通过单击该项目(项目名称),然后从上下文菜单中选择“管理用户机密”设置,在VS编辑器查看secrets.json机密数据。

    --project 属性

    除了在项目文件目录中执行dotnet user-secrets set命令设置机密之外,还可以在通过 --project 选项用于指定项目文件所在的文件系统路径,以便在其他目录中使用User Secrets机密管理器工具,这种用法允许从任意目录设置应用机密,而不仅限于项目文件所在的当前目录

    dotnet user-secrets set "Movies:ServiceApiKey" "12345" --project "C:\apps\WebApp1\src\WebApp1"
    

    机密管理器工具不会加密存储的机密,不得被视为受信任的存储,它仅用于开发,密钥和值存储在用户配置文件目录中的 JSON 配置文件中。

    使用Visual Studio

    当在 Visual Studio 中进行敏感数据管理时,可以按照以下步骤操作:

    • 在解决方案资源管理器中右键 单击该项目(项目名称),然后从上下文菜单中选择“管理用户机密”

    • Visual Studio 将自动为该项目添加一个 UserSecretsId 元素,其中填充有一个唯一的 GUID

    image

    设置完之后在 VS 的编辑界面就会打开一个secrets.json文件

    {}
    

    这里面是一个空的 json 串,可以手动设置机密键值对象,也可以通过dotnet user-secrets set来设置机密数据

    批量设置机密

    可以通过一个json文件来批量设置机密

    type .\input.json | dotnet user-secrets set
    

    读取机密

    Asp.Net Core 中我们在项目中读取配置如appSetting.json或者环境变量的参数都是通过IConfiguration对象来操作,机密的读取和Asp.Net Core的配置都是一样的我们来实战一下

    var apiKey = builder.Configuration["Movies:ServiceApiKey"];
    Console.WriteLine(apiKey);
    

    image

    可以看到机密信息已经正常读到。

    配置的优先级

    那么如果 user-secretsappSetting.json或者还有其他的配置源设置相同的数据,那个优先级高呢?

    根据Asp.Net Core 配置介绍

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

    • 使用命令行配置提供程序通过命令行参数提供。
    • 使用非前缀环境变量配置提供程序通过非前缀环境变量提供。
    • 应用在 Development 环境中运行时的用户机密。
    • 使用 JSON 配置提供程序通过 appsettings.{Environment}.json 提供。 例如,appsettings.Production.jsonappsettings.Development.json
    • 使用 JSON 配置提供程序通过 appsettings.json 提供。

    可以看出如果用户机密比默认的 appsettings.json 优先级要高。

    对应机密的绑定成POCO对象和 Asp.Net Core 使用配置一样可以用IConfiguration提供的各种扩展如Get,Bind等来实现,此处不过多介绍

    列出机密

    从所在项目目录中运行

    dotnet user-secrets list
    

    输出:

    Movies:ServiceApiKey = 12345
    

    删除单个机密

    dotnet user-secrets remove Movies:ServiceApiKey
    

    使用 dotnet user-secrets remove 命令来删除 ASP.NET Core 项目中的单个机密。在这个示例中,执行命令 dotnet user-secrets remove Movies:ServiceApiKey 将删除名为 "Movies:ServiceApiKey" 的机密信息。

    通过这种方式,你可以方便地管理和更新项目中的机密数据,确保不再需要的敏感信息不再存储在用户机密存储中。

    删除所有机密

    dotnet user-secrets clear
    

    dotnet user-secrets clear 用于清除 ASP.NET Core 项目中存储的所有用户机密。执行这个命令将删除用户机密存储中的所有机密信息,使存储中不再包含任何敏感数据。

    使用 dotnet user-secrets clear 命令是一种快速清除整个用户机密存储中数据的方式,适用于需要重置或清除所有敏感信息的情况。请谨慎使用此命令,确保在执行之前备份重要的机密数据。

    最后

    面向非Web的环境,可以参考下方官网的实现,本文注重讲解了通过user-secrets来管理本地的机密,线上环境的机密配置可以ASP.NET Core 中的 Azure Key Vault 配置提供程序,或者大家如果在k8s的环境中可以通过Secret或者ConfigMap,亦或是配置中心等方式来让自己的机密信息避免在源码中出现。


    __EOF__

  • 本文作者: 董瑞鹏
  • 本文链接: https://www.cnblogs.com/ruipeng/p/18154605
  • 关于博主: 评论和私信会在第一时间回复。或者直接私信我。
  • 版权声明: 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
  • 声援博主: 如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。
  • 相关阅读:
    网络瘤 24 题做题寄录
    【JVM】 类加载器 ClassLoader
    [LeetCode]剑指 Offer 34. 二叉树中和为某一值的路径
    iOS开发证书发布证书,推送证书,描述文件的生成总集(一)​
    hexo搭建个人博客
    基于JavaSwing开发打飞鸟游戏 课程设计 大作业 毕业设计
    Java基础教学 日期类Api导学
    HTTP【总结】
    Node连接MySql数据库创建Api接口
    机器学习:决策树
  • 原文地址:https://www.cnblogs.com/ruipeng/p/18154605