【问题标题】:Encrypt Web.Config (Web.Release.config) Transform files using aspnet_regiis加密 Web.Config (Web.Release.config) 使用 aspnet_regiis 转换文件
【发布时间】:2014-05-31 20:51:27
【问题描述】:

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

【问题讨论】:

  • 在源代码管理中不包含 web.config 文件怎么样?和/或签入“空白”文件,开发人员必须在使用前复制和自定义配置文件?
  • @gunr2171 我不能代表 OP,但我遇到了同样的事情,因为我正在使用我的源代码控制进行持续部署。通常我会说另一种方法是将连接字符串放在更高级别的 web.config 或 machine.config 中,但不幸的是,这种方法在部署到 azure web-services 时不可行。
  • @BrianDiggs 如果你提到this article by scott hanselman,这就是我保护私人应用程序设置和连接字符串的方式。
  • 感谢添加到此问题的其他答案和想法。虽然它们中的大多数都提供了处理安全/秘密信息的出色方法,但我将赏金奖励给了在 aspnet_regiis 庄园中解决加密的狭隘问题的人,web.release.config 文件到位。

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


【解决方案1】:

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

【讨论】:

【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    试试下面,我刚刚给出了保护连接字符串的例子。替换要替换的标签 使用 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' is an undeclared prefix,我将它用于xdt:Transform="SetAttributes" xdt:Locator="Match(name)"。有什么想法吗?
    【解决方案4】:

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

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

    创建您的 web.config 并使用 aspnet_regiis.exe 加密应用程序设置和连接字符串。然后在每个环境的转换(例如 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"
    【解决方案5】:

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

    【讨论】:

      【解决方案6】:

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

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

      开发过程中

      appSettings 元素有一个文件属性,允许您指定包含敏感应用配置设置的外部文件。只要外部文件未检入源代码树,您就可以将所有机密移动到外部文件中。

      然后您可以执行以下操作:

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

      关于连接字符串

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

      部署期间

      您可以转到 Azure 管理门户并手动设置它们,在 WebApps > you webApp > All settings > Application settings

      查看this链接以获取更多参考

      【讨论】:

      • 您假设 OP 正在使用 Azure,但看起来 - 根据他们的问题的上下文 - 他们不是。
      【解决方案7】:

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


      我们的设置是这样的……

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

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

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2011-12-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-01
        • 2023-03-24
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        相关资源
        最近更新 更多