dotnet代码管理之密钥分离策略
引言
互联网每隔一段时间就会爆出 【某程序猿在代码托管平台上传了公司机密配置信息,导致公司核心数据被黑客获取或修改】, 一茬又一茬背锅侠层出不穷。拯救自我
软件工程理论早以加粗字体给出 经典原则:Never store production passwords or other sensitive data in source code
依据这个原则,我们来说一些.Net 开发生涯几种敏感信息分离的方案。
头脑风暴
常规思路是【external file方式托管敏感信息】,.gitingore忽略该文件,在部署时预先拷贝该文件到部署目录。
.Net Framework
可尝试在appSettings配置节启用file属性,file属性可引用外部配置文件,具备为原appSetttings新增或重写同名设置的能力,理论传送门
原配置节 <configuration> <appSettings file="appsecrets.config"> <add key="FtpUserId" value="test_userid" /> <add key="FtpPwd" value="test-pwd"> </appSettings></configuration>
外置配置文件 <?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>
.NetCore
同理类似,可指定加载appsetting.secrets.json文件
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。
- 适用于Azure云的 Azure Key Vault 托管