.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>
外置配置文件
<?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。
- 适用于Azure云的 Azure Key Vault 托管
https://azure.microsoft.com/en-us/resources/samples/key-vault-dotnet-core-quickstart/
- 适用于General Deploy的环境变量托管
下面对环境变量方式分离敏感信息做进一步说明。
环境变量托管
环境变量能在进程创建时被导入/注入,因此可作为一种敏感信息分离的思路, 环境变量来自三个级别 :系统、用户、进程。
介绍几种修改环境变量的方式:
①Windows-CMD命令行: setx命令, 注意该方式设置的环境变量需要在新的CMD界面上才能验证生效。
②系统控制面板-我的电脑-属性-高级设置-环境变量
以上两种形式均为在ASP.NET Core进程启动时导入系统环境变量,
③在Visual Studio launchsettings.json设定进程启动时注入环境变量
{
"iisSettings": {
"windowsAuthentication": false,
"anonymousAuthentication": true,
"iisExpress": {
"applicationUrl": "http://localhost:11761/",
"sslPort":
}
},
"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
⑤ 在进程启动时通过命令行参数注入,这种方式严格来说并不属于环境变量方式,是一种参数配置。
public static IWebHost BuildWebHost(string[] args)
{
var webHostBuilder = WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, configBuilder) =>
{
// 启用命令行参数配置
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,可在IIS的配置编辑器新增/重写环境变量

在.NetCore生产部署实践中,比较常用的方式是使用独立的appsettings.secrets.json或环境变量来分离敏感信息。
掌握这些,.Net程序猿应该就不会因为在git上传机密信息而背锅了。
~~~~~~~~~更多方式,欢迎大家留言补充。~~~~
.NET敏感信息分离托管 娓娓道来的更多相关文章
- 保护 .NET Core 项目的敏感信息
我们的项目中几乎都会有配置文件,里面可能会存储一些敏感信息,比如数据库连接字符串.第三方 API 的 AppKey 和 SecretKey 等. 对于开源项目,这些敏感信息肯定不能随着源代码一起提交到 ...
- 血淋淋的事实告诉你:你为什么不应该在JS文件中保存敏感信息
在JavaScript文件中存储敏感数据,不仅是一种错误的实践方式,而且还是一种非常危险的行为,长期以来大家都知道这一点. 而原因也非常简单,我们可以假设你为你的用户动态生成了一个包含API密钥的Ja ...
- DotNet隐藏敏感信息操作方法
在项目中,有时候一些信息不便完全显示,只需要显示部分信息.现在提供一些隐藏敏感信息的操作方法,主要为对信息的截取操作: 1.指定左右字符数量,中间的*的个数和实际长度有关: /// <summa ...
- SharedPreferences漏洞, 无法避免,所以不要在里面存储敏感信息
1. SharedPreferences漏洞, 无法避免,所以不要在里面存储敏感信息2. 数据存储检测,content://com.starcor.launcherInfo/deviceInfo&q ...
- jboss eap 6.2+ 版本中 加密datasource密码等敏感信息
默认情况下,在jboss eap 6.2+ 管理控制台创建datasource后,会在standalone.xml(独立模式)或host.xml(域模式)中以明文保存相关敏感信息. 这会给服务器留下安 ...
- SPRING IN ACTION 第4版笔记-第九章Securing web applications-011-把敏感信息请求转为https(requiresChannel())
1.把包含敏感信息的请求转为https请求,则较为安全,但如何只把有需要安全的请求转为https,而不是不加分辩就把所有请求都转为https呢?可以用requiresChannel() @Overri ...
- jboss加密敏感信息
默认情况下,我们配置在domain.xml或host.xml文件中的信息都是明文,对一些敏感信息就显得安全性不够,可以使用jboss提供的vault机制来进行加密 下面的内容来自 http://www ...
- 解决MVC Jquery"此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站"的问题
在ASP.NET MVC项目中,使用AJAX向控制器发送GET请求获取JSON数据时,出现这个错误:"此请求已被阻止,因为当用在 GET 请求中时,会将敏感信息透漏给第三方网站.若要允许 G ...
- 【转】Android应用开发allowBackup敏感信息泄露的一点反思
转载:http://blog.csdn.net/yanbober/article/details/46417531 1 背景 其实这篇文章可能有些小题大作,但回过头想想还是很有必要的,有点阴沟里翻船的 ...
随机推荐
- spring-Scheduler
作者:纯洁的微笑出处:http://www.ityouknow.com/ 版权所有,欢迎保留原文链接进行转载:) 在我们的项目开发过程中,经常需要定时任务来帮助我们来做一些内容,springboot默 ...
- 在eclipse中创建Web项目中没有web.xml的解决方法
右键点击项目 → “Java EE Tool” → “Generate Deployment descriptor stub” 即可生成web.xml文件
- Angular JS 中的服务注册方法
在Angular JS中创建服务的几种方法 factory() service() constant() value() provider() factory(name,fn(){}) 该服务为单例的 ...
- 内容汇总(c语言)
一,内容 常量(整型,浮点型,字符型,字符串型,符号常量) 变量(基本类型:整形,浮点型,字符型,枚举型:构造类型:数组,结构体,共用体:另外还有指针类型和NULL) 顺序结构 分支结构 循环结构 当 ...
- 定制开发kubernetes流程
kubernetes集群三步安装 概述 本文介绍如何对kubernetes进行二次开发,仓库如何管理,git分支如何管理,怎样利用CI去编译与发布以及如何给社区贡献代码等,结合实际例子,望对大家有所帮 ...
- 微信JSSDK签名
微信JS-SDK说明文档 https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141115 生成签名 1.签名规则 参与签名的 ...
- Two types of people with high scores of English exams
I believe that there are two types of people who get high scores in English exams: 1) have high inte ...
- C语言tips_1 关于&& || ! 的优先级
关于&& || ! 三种操作的优先级 测试如下 简要分析 假设&&>|| 则结果为1 假设||>&& 则结果为0 结果为1 得证 & ...
- ZooKeeper系列(三)—— Zookeeper 常用 Shell 命令
一.节点增删改查 1.1 启动服务和连接服务 # 启动服务 bin/zkServer.sh start #连接服务 不指定服务地址则默认连接到localhost:2181 zkCli.sh -serv ...
- Gitment评论插件的使用
前言 继上一篇的 GitPages部署自己的网站 现在开始添加博客的评论插件Gitment.这里的话我是使用hexo添加gitment插件,如果不是使用hexo,请到官网指定这里. 开始 第一步 注册 ...