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

时间:2014-04-16 19:37:45

标签: c# asp.net .net encryption web.config-transform

我要求不在源代码管理中存储任何敏感信息(例如用户名和密码)。我们正在做一个.NET 4.5 MVC应用程序,所以我的计划是使用aspnet_regiis.exe和ASP.NET的内置功能来加密web.config。我在这里工作没有问题,但我遇到的问题是我还要加密转换(Web.Release.config等),因为它还包含敏感信息。我环顾四周,没有看到任何方法这样做。有没有人知道实现这个目标的方法?

7 个答案:

答案 0 :(得分:9)

我能够完成这项工作的方法是转到每台计算机并使用正确的连接字符串加密web.config,然后将新加密的连接字符串部分复制到相应的web.cong转换中。这是一个巨大的痛苦,但它确实有效。

答案 1 :(得分:2)

您可以将生产转换文件保存在只有您的运营团队才能访问的机密信息库中。您的CI系统将引用两个repos并将转换文件从您的秘密仓库复制到您的构建目录,并像现在一样进行编译。

这将从主存储库中删除任何敏感配置值,并仍然允许您利用转换功能。

答案 2 :(得分: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();
                }

答案 3 :(得分:2)

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

选项1.将加密的转换文件签入源代码管理。

使用aspnet_regiis.exe创建web.config并加密appsettings和connectionstrings。然后在每个环境的转换(例如web.release.config)中使用以下值:

<appSettings configProtectionProvider="ProviderName" xdt:Transform="Replace">
<EncryptedData>.....</EncryptedData
</appSettings>

如果您在每个环境中使用不同的提供程序(您应该),那么您将需要为每个环境执行加密。

问题:如果您有多个开发人员/项目正在进行中,很容易错过新的应用程序设置值,直到部署后才会知道

选项2.在服务器上使用Transforms + Token Replacement and Encrypt

对于此选项,您可以使用传统转换,但使用令牌替换所有敏感数据,例如{{WebServicePassword}}。令牌替换是大多数部署工具中常见的功能。在这种情况下,您将在部署工具(VSTS,UrbanCode等)中创建一个具有{{WebServicePassword}}真值的变量。然后,您需要将部署配置为执行标记化替换,并且具体的详细信息将根据相关部署工具的不同而不同。 部署文件后,在服务器上远程运行aspnet_regiis.exe以加密web.config文件。

问题:未加密的文件将在加密之前暂时停留在服务器上。根据您的情况,这可能是也可能不是问题。

我个人更喜欢选项#2,因为它允许您查看所有appsettings键,并且您可以通过拉取请求/代码审查轻松处理键(而不是值)的更改。在源代码管理中处理加密的appsettings / databaseconnections值时,您不知道加密值是否实际包含应用程序所需的密钥。

答案 4 :(得分:0)

有一种方法可以使用Protected Configuration加密敏感信息,您需要将文件保存在appdata中的任何文件夹中并使用应用程序对其进行加密

答案 5 :(得分:0)

  

我要求不在源代码管理中存储任何敏感信息(例如用户名和密码)。

是的,你不应该,并且实现此目的的一种方法是使用环境变量或用户级配置选项。 根据微软的说法

在开发过程中

  

appSettings元素具有一个文件属性,允许您指定包含敏感应用程序配置设置的外部文件。只要没有将外部文件签入源树,就可以将所有秘密移到外部文件中。

然后你可以这样做:

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

至于connectionStrings

  

您可以使用configSource属性替换整个标记。与合并标记的文件属性不同,configSource属性替换标记。

部署期间

您可以转到Azure管理门户并在 WebApps&gt;中手动设置它们。你webApp&gt;所有设置&gt;申请设置

检查this链接以获取进一步参考

答案 6 :(得分:0)

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

我们的设置是......

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

我们的构建服务器管理&#34;发布&#34;和变换。所以会发生什么:当我们为特定配置构建时,运行该转换并删除所有敏感信息。

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

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

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

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