加密 Web.Config(Web.Release.config)变换文件使用 aspnet_regiis

23
我有一个要求,不希望在源代码控制中存储任何敏感信息(如用户名和密码)。我们正在开发一个.NET 4.5 MVC 应用程序,因此我的计划是使用aspnet_regiis.exe和ASP.NET的内置功能来加密web.config文件。我成功做到了这一点,但我想加密transforms (例如Web.Release.config等),因为那里也包含敏感信息,但我没有找到任何方法可以实现它。请问是否有人知道如何实现?

不在源代码控制中包含web.config文件怎么样?或者提交一个“空白”文件,开发人员在使用前需要复制并自定义配置文件? - gunr2171
@gunr2171 我不能代表 OP 说话,但我遇到了同样的问题,因为我正在使用我的源代码控制进行持续部署。通常我会说另一种选择是将连接字符串放在更高级别的 web.config 或 machine.config 中,但是当部署到 Azure Web 服务时,这种方法不可行。 - Kelly Robins
@BrianDiggs 如果你参考了Scott Hanselman的这篇文章,这就是我如何保护私有应用程序设置和连接字符串的方法。 - Nkosi
我感谢在这个问题中添加的额外答案和想法。虽然它们中的大多数提供了处理安全/机密信息的优越方法,但我将赏金授予了那个回答狭窄问题的人,即以aspnet_regiis方式加密web.release.config文件。 - Brian Diggs
7个回答

9

我能够使这个工作的方式是,前往每台机器并使用正确的连接字符串加密web.config文件,然后将新加密的连接字符串部分复制到相应的web.cong转换中。虽然非常麻烦,但它能够正常运行。


1
因为这个问题,我们已经转用集中式配置存储。此文章可能会对您有所帮助:一个简单的技巧来集中化你的.NET配置 - Albert
请查看我的解决方案,看它是否可以解决你的问题。 - muhammad hasnain
感谢@tjeuten! - Syntax Error

2

根据您的需求和开发团队对服务器的不同访问方式,有几种不同的处理方法。

选项1. 将加密的转换文件检入源代码控制。

使用aspnet_regiis.exe创建您的web.config并加密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值时,您无法确定加密值是否实际包含应用程序所需的键。

选项1不起作用。您需要包括命名空间xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0"才能使用EncryptedData,否则Visual Studio将报错:Failed to decrypt using provider 'RsaProtectedConfigurationProvider'. Error message from the provider: The RSA key container could not be opened.。添加命名空间后,由于某种原因,Visual Studio忽略了xdt:Transform="Replace" - Neurion

2
你可以将生产转换文件保存在只有运维团队可以访问的机密存储库中。你的CI系统会引用两个存储库,并将转换文件从机密存储库复制到构建目录中,然后像现在一样进行编译。
这将从主要存储库中删除任何敏感的配置值,同时仍然允许你利用转换功能。

2
尝试以下操作,我刚刚给出了保护连接字符串的示例。替换您想要更改的标签。 使用 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();
                }

我得到了一个错误信息:“'xdt'是未声明的前缀”,这个前缀我用在了xdt:Transform="SetAttributes" xdt:Locator="Match(name)"中。你有什么想法吗? - Sam

0
在我的项目中,我处理这个问题的方式是,转换器会删除所有开发连接字符串和任何安全 appSettings 的值,以便可以在每个环境中单独管理它们。

我们的设置是这样的...

项目 web.config 中包含所有常见的开发内容,包括任何在生产环境中被视为私有的开发应用程序设置。在我们的情况下,这些设置被检入并不重要,因为它们只是供我们内部使用。通过发布,转换会删除所有这些信息。

我们的构建服务器管理“发布”和转换。所以当我们为特定的配置进行构建时,该转换会运行并删除所有敏感信息。

下一步是构建将 web.config 重命名为 web.config.default。这允许我们提供一个配置文件,其中包含所有默认设置,但没有敏感数据,这些设置是针对该构建的特定设置。

在第一次部署时,由部署人员将 web.config.default 重命名为 web.config 并填写敏感信息。从那里开始,他们可以选择是否加密信息。

每个后续部署都不会覆盖当前的 web.config - 它只会添加默认值 - 由进行部署的人员添加或删除任何新/弃用的配置元素。

此外,这里的手动步骤也可以使用某种安装程序自动化...


0

有一种方法可以使用受保护的配置来加密敏感信息,否则您需要将文件保存在appdata内的任何文件夹中,并使用应用程序进行加密。


0
我有一个要求,不在源代码控制中存储任何敏感信息(例如用户名和密码)。
是的,你不应该这样做,而实现此目标的一种方法是使用环境变量或用户级配置选项。根据微软的说法:
在开发过程中,
appSettings元素具有文件属性,允许您指定包含敏感应用程序配置设置的外部文件。只要外部文件没有被检入您的源代码树,您就可以将所有机密信息移动到外部文件中。

Then you can do something like:

</connectionStrings>
   <appSettings file="relative\path\to\AppSettingsSecrets.config">          
   </appSettings>
  <system.web>

关于connectionStrings

您可以使用configSource属性替换整个markup。与合并markup的file属性不同,configSource属性会替换markup。

部署期间

您可以前往Azure管理门户手动设置它们,在WebApps > 您的WebApp > 所有设置 > 应用程序设置中进行设置。

请查看this链接以获取更多参考资料。


1
您假设 OP 正在使用 Azure,但从他们的问题上下文来看,似乎并非如此。 - Michael Coxon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接