前言
在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL
服務器的連接串或者是OAuth2
的Secret
等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core
的機密管理器。
機密管理器
在 ASP.NET Core
中,機密管理器通常指的是一種工具或機制,用于安全地存儲和管理應用程序中的敏感數據,如數據庫連接字符串、API
密鑰、密碼等。這樣的工具可以幫助開發人員有效地管理敏感信息,避免將其硬編碼在代碼中或與源代碼一同提交到版本控制系統中,從而提高數據安全性和保密性。
通過上面我們可以得知,應用機密存儲和項目數在不同的位置,也就是說不被 git
等源代碼管理器所管理,所以不會隨源代碼遷入到遠程服務器。
為什么要使用機密管理器:
安全性:通過使用機密管理器,可以將敏感數據存儲在安全的位置,避免在代碼中明文存儲密碼等敏感信息,從而減少數據泄露的風險。
便捷性:機密管理器提供了方便的方式來存儲和訪問敏感數據,使開發人員能夠輕松地在開發過程中使用這些數據,而無需擔心泄露或不當處理。
靈活性:通過機密管理器,可以輕松地在不同環境中管理不同的敏感數據,如開發、測試和生產環境,同時確保每個環境中的數據安全性。
遵循最佳實踐:使用機密管理器有助于遵循最佳實踐,如將敏感數據與應用程序代碼分離、避免硬編碼密碼等敏感信息,提高應用程序的安全性和可維護性。
如何啟用機密存儲
有兩種方案第一種是使用CLI
第二種是使用Visual Studio
我們創建一個新的WebApi
項目dotNetParadise.UserSecret
使用CLI
機密管理器工具包含一個 init
命令 用來啟用機密存儲,在項目所在的目錄,在我的示例中就是Api
項目dotNetParadise.UserSecret
的所在目錄執行一下命令:
dotnet user-secrets init
通過輸出我們可以看到在我們項目的CSPROJ
文件生成了一個UserSecretsId
元素添加到項目文件的 PropertyGroup
中,內部文本是任意的,但對于項目來說是唯一的。
<PropertyGroup>
<TargetFramework>net8.0</TargetFramework>
<Nullable>enable</Nullable>
<ImplicitUsings>enable</ImplicitUsings>
<UserSecretsId>c3cda712-dc63-439b-b6af-9c4d6060fde2</UserSecretsId>
</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\<user_secrets_id>\secrets.json
比如我剛才添加的就在機密存儲位置:
%APPDATA%\Microsoft\UserSecrets\c3cda712-dc63-439b-b6af-9c4d6060fde2\secrets.json
看一下里面的內容
{
"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
中進行敏感數據管理時,可以按照以下步驟操作:
設置完之后在 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);
可以看到機密信息已經正常讀到。
配置的優先級
那么如果 user-secrets
和appSetting.json
或者還有其他的配置源設置相同的數據,那個優先級高呢?
根據Asp.Net Core 配置介紹
WebApplication.CreateBuilder
使用預配置的默認值初始化 WebApplicationBuilder
類的新實例。 經過初始化的 WebApplicationBuilder (builder)
按照以下順序為應用提供默認配置(從最高優先級到最低優先級):
使用命令行配置提供程序通過命令行參數提供。
使用非前綴環境變量配置提供程序通過非前綴環境變量提供。
應用在 Development
環境中運行時的用戶機密。
使用 JSON
配置提供程序通過 appsettings.{Environment}.json
提供。 例如,appsettings.Production.json
和 appsettings.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
,亦或是配置中心等方式來讓自己的機密信息避免在源碼中出現。
本文來自博客園,作者:董瑞鵬,轉載請注明原文鏈接:https://www.cnblogs.com/ruipeng/p/18154605
該文章在 2024/5/27 9:00:49 編輯過