引言
互聯(lián)網(wǎng)每隔一段時(shí)間就會(huì)爆出 【某程序猿在代碼托管平臺(tái)上傳了公司機(jī)密配置信息,導(dǎo)致公司核心數(shù)據(jù)被黑客獲取或修改】, 一茬又一茬背鍋俠層出不窮。拯救自我
<https://help.github.com/en/articles/removing-sensitive-data-from-a-repository>
軟件工程理論早以加粗字體給出 經(jīng)典原則:Never?store production passwords or other sensitive data
in source code
依據(jù)這個(gè)原則,我們來(lái)說(shuō)一些.Net 開發(fā)生涯幾種敏感信息分離的方案。 ?
頭腦風(fēng)暴
常規(guī)思路是【外部文件方式托管敏感信息】,外部是相對(duì)于 代碼托管倉(cāng)庫(kù)。
.Net Framework
可嘗試在appSettings配置節(jié)啟用file屬性,file屬性可引用外部配置文件,具備為原appSetttings新增或重寫同名設(shè)置的能力。
<configuration>
<appSettings file="appsecrets.config">
<add key="FtpUserId" value="test_userid" /><add key="FtpPwd" value="test-pwd
">
</appSettings>
</configuration>
====appsecrets.config====================
<?xml version="1.0" encoding="utf-8" ?> <appSettings> <add key="FtpUrl"
value="sftp.rategain.com" /> <add key="FtpUserId" value="RateGain_M&C" /> <add
key="FtpPwd" value="RateGain@123" /> <add key="RemotePath" value="/M&C/" />
<!--路徑 /M&C/ 需要轉(zhuǎn)義--> </appSettings>
https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/appsettings/appsettings-element-for-configuration
<https://docs.microsoft.com/en-us/dotnet/framework/configure-apps/file-schema/appsettings/appsettings-element-for-configuration>
? .NetCore 可在程序啟動(dòng)時(shí)加載 appsetting.secrets.json文件,該文件也排除在代碼管理倉(cāng)庫(kù)之外,
部署時(shí)手動(dòng)將該文件拷貝到發(fā)布目錄。 var hostBuilder = WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((context, builder)=> { builder.AddJsonFile($"
appsettings.secrets.json", optional: true); if
(context.HostingEnvironment.IsDevelopment()) { builder.AddUserSecrets<Startup>(
true); } builder.AddEnvironmentVariables(); }) .UseStartup<Startup>();
據(jù)此思路,可將敏感信息叫由其他組件托管,.NetCore開發(fā)者還有其他3種實(shí)踐:
-? 適用于Dev的 Secrets manager tool 托管
Asp.NETCore 在開發(fā)環(huán)境下保存密鑰的方式,總體思路是 使用一個(gè)匿名GUID引用存儲(chǔ)在系統(tǒng)文件夾下同名配置Json.
https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-2.2&tabs=windows
-? 適用于Azure云的? Azure Key Vault 托管
https://azure.microsoft.com/en-us/resources/samples/key-vault-dotnet-core-quickstart/
-? 適用于General Deploy的環(huán)境變量托管
下面對(duì)環(huán)境變量方式分離敏感信息做進(jìn)一步說(shuō)明。
環(huán)境變量托管
環(huán)境變量能在進(jìn)程創(chuàng)建時(shí)被導(dǎo)入/注入,因此可作為一種敏感信息分離的思路, 環(huán)境變量來(lái)自 3個(gè)級(jí)別 : 系統(tǒng), 用戶,進(jìn)程。
介紹幾種修改環(huán)境變量的方式:
①Window機(jī)器CMD命令行: setx命令, Powershell也可操作
②系統(tǒng)控制面板-我的電腦-屬性-高級(jí)設(shè)置-環(huán)境變量
? ? ?以上兩種形式可理解 為 AspNetCore進(jìn)程啟動(dòng)時(shí)導(dǎo)入 系統(tǒng)環(huán)境變量。
③在Visual Studio launchsettings.json設(shè)定進(jìn)程啟動(dòng)時(shí)要注入的環(huán)境變量
{ "iisSettings": { "windowsAuthentication": false, "anonymousAuthentication":
true, "iisExpress": { "applicationUrl": "http://localhost:11761/", "sslPort": 0
} },"profiles": { "IIS Express": { "commandName": "IISExpress", "launchBrowser":
true, "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "Development" } }, "
JumpServer": { "commandName": "Project", "launchBrowser": true, "applicationUrl"
:"http://localhost:5020", "environmentVariables": { "ASPNETCORE_ENVIRONMENT": "
production" , "ASPNETCORE_URLS": "http://localhost:5020" } } } }
launchSettings.json
④在VScode launchsettings.json設(shè)定進(jìn)程啟動(dòng)時(shí)要注入的環(huán)境變量
{ "version": "0.2.0", "configurations": [ { "name": ".NET Core Launch (web)", "
type": "coreclr", "request": "launch", "preLaunchTask": "build", "program": "
${workspaceRoot}/bin/Debug/netcoreapp1.0/TestApp.dll", "args": [], "cwd": "
${workspaceRoot}", "stopAtEntry": false, "launchBrowser": { "enabled": true, "
args": "${auto-detect-url}", "windows": { "command": "cmd.exe", "args": "/C
start ${auto-detect-url}" }, "osx": { "command": "open" }, "linux": { "command":
"xdg-open" } }, "env": { "ASPNETCORE_ENVIRONMENT": "Development" }, "
sourceFileMap": { "/Views": "${workspaceRoot}/Views" } } ] } launchsettings.json
⑤ 在進(jìn)程啟動(dòng)時(shí)通過(guò)命令行參數(shù)注入
public static IWebHost BuildWebHost(string[] args) { var webHostBuilder =
WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext,
configBuilder)=> { // 默認(rèn)會(huì)加載工作目錄下 appsettings.*.json配置文件
configBuilder.AddCommandLine(args).AddEnvironmentVariables(); if
(hostingContext.HostingEnvironment.IsDevelopment()) configBuilder.AddUserSecrets
<Startup>(true); }) .ConfigureLogging((hostingContext, logging) => {
logging.AddAzureWebAppDiagnostics(); }) .UseStartup<Startup>(); return
webHostBuilder.Build(); }
--------------
dotnet run --environment "development"
?
?⑥ 若使用IIS托管AspNetCore,可在部署機(jī)器IIS的配置編輯器 新增/重寫環(huán)境變量
?
?在.NetCore生產(chǎn)部署實(shí)踐中,比較常用的方式是使用獨(dú)立的appsettings.secrets.json,環(huán)境變量來(lái)分離敏感信息。
掌握這些,.Net程序猿應(yīng)該就不會(huì)因?yàn)樵趃it上傳機(jī)密信息而背鍋了。
~~~~~~~~~更多方式,歡迎大家留言補(bǔ)充。~~~~
熱門工具 換一換
