.NET敏感信息分离托管 娓娓道来
引言
互联网每隔一段时间就会爆出 【某程序猿在代码托管平台上传了公司机密配置信息,导致公司核心数据被黑客获取或修改】, 一茬又一茬背锅侠层出不穷。
软件工程理论早以加粗字体给出 经典原则:Never store production passwords or other sensitive data in source code
头脑风暴
.Net Framework
<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/ 需要转义--> </appSettings>
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>();
据此思路,可将敏感信息叫由其他组件托管,.NetCore开发者还有其他3种实践:
– 适用于Dev的 Secrets manager tool 托管
Asp.NETCore 在开发环境下保存密钥的方式,总体思路是 使用一个匿名GUID引用存储在系统文件夹下同名配置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的环境变量托管
下面对环境变量方式分离敏感信息做进一步说明。
环境变量托管
环境变量能在进程创建时被导入/注入,因此可作为一种敏感信息分离的思路, 环境变量来自 3个级别 : 系统, 用户,进程。
介绍几种修改环境变量的方式:
①电脑CMD命令行: setx命令
②系统控制面板-我的电脑-属性-高级设置-环境变量
以上两种形式可理解 为 AspNetCore进程启动时导入 系统环境变量。
③在Visual Studio launchsettings.json设定进程启动时要注入的环境变量
{ "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设定进程启动时要注入的环境变量
{ "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
⑤ 在进程启动时通过命令行参数注入
// 某.Netcore Program.cs文件启用命令行参数 var config = new ConfigurationBuilder() .AddCommandLine(args) .Build(); // 程序启动时, 指定该环境变量 dotnet run --environment "development"
⑥ 若使用IIS托管AspNetCore,可在部署机器IIS的配置编辑器 新增/重写环境变量
在.NetCore生产部署实践中,比较常用的方式是使用独立的appsettings.secrets.json,环境变量来分离敏感信息。