我要求不要在源代码管理中存储任何敏感信息(例如用户名和密码)。我们正在做一个 .NET 4.5 MVC 应用程序,所以我的计划是使用 aspnet_regiis.exe 和 ASP.NET 的内置功能加密 web.config。我在这里工作没有问题,但我遇到的问题是我还想加密转换(Web.Release.config 等),因为它也包含敏感信息。我环顾四周,没有看到任何方法可以做到这一点。有谁知道实现这一目标的方法?
7 回答
我能够完成这项工作的方法是转到每台机器并使用正确的连接字符串加密 web.config,然后将新加密的连接字符串部分复制到适当的 web.cong 转换中。这是一个巨大的痛苦,但它有效。
试试下面,我刚刚给出了保护连接字符串的例子。使用 System.Configuration 替换要替换的标签;
ExeConfigurationFileMap configMap = new ExeConfigurationFileMap();
configMap.ExeConfigFilename = modulePath + "Web.Release.config";
System.Configuration.Configuration config = ConfigurationManager.OpenMappedExeConfiguration(configMap, ConfigurationUserLevel.None);
System.Configuration.ConfigurationSection section = config.GetSection("connectionStrings");
if (!section.SectionInformation.IsProtected)
{
section.SectionInformation.ProtectSection("RsaProtectedConfigurationProvider");
config.Save();
}
您可以将生产转换文件保存在只有您的运营团队可以访问的机密存储库中。您的 CI 系统将引用存储库并将转换文件从您的秘密存储库复制到您的构建目录并像现在一样编译。
这将从您的主存储库中删除任何敏感的配置值,并且仍然允许您利用转换功能。
根据您的需要以及您和您的开发团队对服务器的不同类型的访问,有几种不同的方法可以处理此问题。
选项 1. 将加密的转换文件签入源代码管理。
创建 web.config 并使用 aspnet_regiis.exe 加密 appsettings 和 connectionstrings。然后在每个环境的转换(例如 web.release.config)中使用以下值:
<appSettings configProtectionProvider="ProviderName" xdt:Transform="Replace">
<EncryptedData>.....</EncryptedData
</appSettings>
如果您在每个环境中使用不同的提供程序(您应该是),那么您将需要为每个环境进行加密。
问题:如果您有多个开发人员/项目正在进行,很容易错过一个新的应用程序设置值,并且在部署之前您不会知道
选项 2. 在服务器上使用转换 + 令牌替换和加密
对于此选项,您将使用传统转换,但将所有敏感数据替换为令牌,例如 {{WebServicePassword}}。令牌替换是大多数部署工具中存在的常见功能。在这种情况下,您将在部署工具(VSTS、UrbanCode 等)中创建一个具有 {{WebServicePassword}} 真实值的变量。然后,您需要配置您的部署以进行标记化替换,并且具体细节会因相关部署工具而异。部署文件后,在服务器上远程运行 aspnet_regiis.exe 以加密 web.config 文件。
问题:未加密的文件在加密之前将在服务器上停留片刻。根据您的情况,这可能是也可能不是问题。
我个人更喜欢选项 #2,因为它允许您查看所有 appsettings 键,并且您可以通过拉取请求/代码审查轻松处理对键(而不是值)的更改。在源代码管理中处理加密的 appsettings/databaseconnections 值时,您不知道加密值是否实际包含应用程序所需的密钥。
有一种方法可以使用受保护的配置来加密敏感信息,否则您需要将文件保存在 appdata 内的任何文件夹中并使用应用程序对其进行加密
我在我的项目中处理此问题的方式是,转换删除所有开发连接字符串和任何安全 appSettings 的值等......以便可以在每个环境中单独管理它们。
我们的设置是这样的...
项目 web.config 包含所有常见的开发内容。包括在生产环境中被视为私有的任何开发应用程序设置。在我们的例子中,签入这些设置并不重要,因为它们仅供我们内部使用。转换会在发布时删除所有这些信息。
我们的构建服务器管理“发布”和转换。所以发生的事情是:当我们为特定配置构建时,该转换运行并删除所有敏感信息。
下一步是将构建重命名web.config
为web.config.default
. 这允许我们提供一个配置文件,其中包含特定于该构建但没有敏感数据的所有默认设置。
在第一次部署时,由部署人员重命名web.config.default
并web.config
填写敏感信息。他们可以从那里选择是否加密信息。
每个后续部署都不会覆盖当前的web.config
- 它只添加默认值 - 由执行部署的人添加或删除任何新的/不推荐使用的配置元素。
此外,这里的手动步骤也可以使用某种安装程序自动执行...
我要求不要在源代码管理中存储任何敏感信息(例如用户名和密码)。
是的,您不应该这样做,实现此目的的一种方法是使用环境变量或用户级配置选项。根据微软
在开发过程中
appSettings 元素有一个文件属性,允许您指定包含敏感应用配置设置的外部文件。只要未将外部文件签入源代码树,您就可以将所有机密移动到外部文件中。
然后您可以执行以下操作:
</connectionStrings>
<appSettings file="relative\path\to\AppSettingsSecrets.config">
</appSettings>
<system.web>
至于连接字符串
您可以使用 configSource 属性来替换整个标记。与合并标记的文件属性不同,configSource 属性替换了标记。
部署期间
您可以转到 Azure 管理门户并手动设置它们,在WebApps > you webApp > All settings > Application settings
检查此链接以获取更多参考