【问题标题】:How to store production secrets in an ASP.NET Core 2.0 using environment variables?如何使用环境变量在 ASP.NET Core 2.0 中存储生产机密?
【发布时间】:2019-05-16 06:54:04
【问题描述】:

根据我阅读here 的内容,建议在开发期间使用secret manager 来存储机密,然后在部署到 IIS 时使用环境变量。我不太确定解决此问题的最佳方法是什么 - 我需要能够在不同的 IIS 应用程序中将相同的变量设置为不同的值,因此系统范围的环境变量设置不起作用。

我知道我可以在web.config 中为应用程序设置变量,但是当您进行网络部署时,即使项目中没有web.conifg,VS 也会覆盖服务器上的web.config。我知道使用 web deploy 部署到生产环境可能不是一个好习惯,但我们希望将它用于临时环境等。

如果目标站点上已经存在web.config,有没有办法阻止网络部署覆盖它?

【问题讨论】:

  • 使用 appsettings.json 而不是 web.config 在开发过程中将这些应用设置的环境特定值放在用户机密中,并将它们与您为每个应用选择的值一起放置。项目文件中有一个设置,您可以通过在发布期间跳过文件来跳过在部署期间覆盖 appsettings.json 文件。
  • 我查找了防止覆盖 appsettings.json 的设置,但找不到。我在哪里设置它?

标签: asp.net-core


【解决方案1】:

ASP.NET Core 不使用 Web.config。它是作为发布的一部分添加的,仅与 IIS 中的托管兼容。它不打算让您以任何有意义的方式修改或使用。

ASP.NET Core 中配置提供程序的内置选项包括:JSON、命令行参数、用户机密、环境变量和 Azure Key Valult。但是,User Secrets 仅用于开发,在 IIS 中托管时很难使用命令行参数。 (从技术上讲,您实际上可以修改 Web.config 以添加命令行参数,但如前所述,这将在下一次发布时被覆盖,因此这不是最可行的方法。)

在 JSON、环境变量和 Azure Key Vault 的其余选项中,只有 Azure Key Vault 支持加密。无论您是否实际在 Azure 中托管,都可以使用 Azure Key Vault,但它不是免费的。不过,它也不是很贵,所以可能值得研究。

在安全方面,JSON 可能是最糟糕的选择,主要是因为它要求您将秘密实际存储在源代码控制中,而源代码控制是(或应该是)非入门。环境变量虽然未加密,但可以受到保护。但是,如果多个应用程序都需要为相同的环境变量提供不同的密钥,那么在同一台服务器上运行多个应用程序是很困难的(尽管技术上并非不可能)。您可以在技术上在用户级别设置环境变量,然后您还可以分配应用程序池以作为特定用户运行。不过,这是很多设置。

也就是说,您也完全可以创建自己的配置提供程序,这意味着您可以在技术上使用您喜欢的任何东西。例如,您可以编写一个 SQL Server 配置提供程序,然后将您的凭据存储在那里。您仍然需要在某处配置连接字符串,但也许您可以为所有站点的配置使用相同的连接字符串。

【讨论】:

  • JSON is probably the worst option, security-wise, mostly because it requires you to actually store your secrets in your source control 它不应该这样做。尽可能在最晚的时间在您的发布管道上生成它。
  • @Chris Pratt - 至少原则上应该可以为每个进程设置环境变量,对吧?我假设当您在 web.config 中设置它们时会发生这种情况。如果没有办法为每个应用程序设置它们,那么我们应该如何将 ASPNETCORE_ENVIRONMENT 设置为不同的值,或者它期望它基于每个服务器设置?如果 ASP.NET Core 连 ASP.NET Core 都不使用的话,web.config 在部署过程中被覆盖,这似乎有点不令人满意。
  • @Mardox - 我很想知道我使用什么样的工具来创建你心目中的发布管道。我想我们可以将一般配置设置放在 appsettings.json 中,该设置已检查到源代码管理中,然后将秘密放入 appsettings.production.json 中,它是按照您的建议生成的。
【解决方案2】:
  • web.config 不能用于机密,因为它是未加密的纯文本文件
  • 可以通过新的配置 API 添加的任何其他文件配置源(如 appsettings.json)在未加密之前都无法使用。

  • 可以使用环境变量,但前提是您可以保证无法在 prod 机器上创建环境变量的快照。查看Environment Variables Considered Harmful for Your Secrets 了解有关此风险的更多详细信息。

  • 如果您在 Azure 上托管,请查看 Azure Key Vault

  • 有很多工具/服务,例如Hashicorp Vault,可以帮助处理敏感数据

【讨论】:

  • +1。我喜欢 Hashicorp Vault,但是你有额外的失败点。话虽如此,您不能为了减少工作而打折安全功能。如果处理不当,可能会给组织带来巨额成本。
猜你喜欢
  • 2017-03-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-09
  • 1970-01-01
相关资源
最近更新 更多