将 asp.net 核心配置保留在源代码和管道之外

Keeping asp.net core config out of your source and your pipelines

我正在做一个 asp.net 核心项目,我正在努力弄清楚如何让我的源代码和管道 100% 保密。

我有一个 VM 运行 Azure 代理和一个用于构建和发布的 Azure 开发操作管道。 如果我删除 VM 上的站点,发布管道将自动神奇地为我重新创建它并部署最新版本。

超级酷。

现在我阅读了配置 .Net 核心应用程序的最佳实践,并找到了这篇文章:https://www.humankode.com/asp-net-core/asp-net-core-configuration-best-practices-for-keeping-secrets-out-of-source-control

所以在代码中保守秘密是个坏主意,这是完全有道理的。 但是,如果我将相同的安全原则应用于 Yaml,那么我当然也不应该在我的管道中放置秘密。 但我需要管道能够从头开始重新创建网站,它应该可以正常工作。该站点需要以某种方式知道其默认 sql 连接在哪里,或者它需要拥有 azure 应用程序配置服务的密钥。我不应该在每次发布后都登录到 VM 并手动创建一个 appsettings.json!

因此,网站需要运行的任何内容都需要包含在管道中,因此需要一些工件,或包含在代码中。

我用谷歌搜索了好几天,但似乎找不到任何关于如何完全自动化的信息。 我考虑过创建一个从实际 VM 注册表读取的自定义配置提供程序,但这也感觉不对。 我基本上需要一个不在站点本身中托管的配置选项。所以我在虚拟机上设置了一次就再也没有了。

除了问题评论中的建议外,您还可以将秘密存储在管道 "Variables" 部分。

在这里您可以添加变量,然后通过选择 "Keep this value secret" 将它们标记为机密。一旦你保存了一个秘密,它的值就会被混淆,即你可以使用它,但你不能再在 Azure Devops 中看到它的原始值(如果你想重新访问变量来检查它,这无疑是相当令人沮丧的!) .

然后您可以使用以下语法在管道 YAML 中引用秘密变量:

$(variable-name)

因此,这种方法在 Azure Devops 中保持机密安全,直到它们需要由管道 YAML 脚本解析。

Lex Li 在评论中列出的方法是 Microsoft 推荐的在管道中保护 "secrets" 的方法。

我认为 Ben Smith 的回答同样好,但安全性稍差。

我在我们的组织中使用这种方法。我们所有的发布管道都根据它们部署到的环境使用适当的设置进行最终的配置转换。

即数据库连接在开发、测试和 UAT 以及生产部署阶段进行转换。

我将管道变量中的相关秘密作为受保护的秘密保存。我这样做有两个原因:

  1. 只有 select 个受信任的人员可以访问发布管道定义。
  2. 即使有人可以访问这些定义,您也看不到安全变量。即使你在变量选项卡上 "undo the padlock" - 你也看不到设置是什么。

然后我们的实际机密存储在我们的企业机密保险库中。

使用 Azure Key Vault 绝对是一个不错的方法。然而,我们已经有了一个集中的地方来存放我们的东西;我不想要它在 3 个位置。

如果不将变量组作为管道过程的一部分,我会失职。与构建/发布变量的概念相同——不同之处在于您现在可以在一处共享它们。

当然这些都是个人意见。这只是这样做的一种方式;我觉得这是安全性和灵活性的一个很好的平衡。