如何在共享服务器上托管的 ASP.Net Core 3.1 应用程序中存储连接字符串等生产机密

How can I store production secrets like connection string in ASP.Net Core 3.1 application, hosted on a shared server

也许我的问题已经有了答案,但我找了半天没找到。

我的用例如下:我有一个 ASP.Net Core 3.1 Web 应用程序。它使用 MSSQL 数据库存储一些信息(仅供参考,我不存储任何用户的秘密,但这些信息对我来说仍然很有价值)。它还使用电子邮件客户端发送电子邮件。我需要存储数据库的连接字符串以及电子邮件客户端的凭据。到目前为止,我将它们存储在 appsettings.json 文件中,直到我意识到它们以纯文本形式存储,如果有人访问它们 he/she 将可以访问我的数据库和我的电子邮件客户端。

现在我正在寻找一种更安全地存储它们的方法。阅读 SO 中的问题后,我了解到存储此类信息的建议方法是使用 Azure Key Vault。我可以使用它并且我开始更新我的应用程序以使用它(我读到我可以在 Azure 之外访问它)。但我开始意识到我需要将 Vault URL、ClientID 和 ClientSecret 值存储在某个地方。

如何存储它们。在其中一个教程中,他们将它们放在 appsettings.json 文件中,但他们说这不是制作的好方法,这是可以理解的。建议的选项是将它们存储在环境变量中。但是我的问题来了 - 我在共享服务器上托管,我无法添加任何环境变量。所以环境变量的使用对我来说不是一个选项。

就我而言,当我无法添加任何环境变量时,存储任何生产机密(如数据库连接字符串)的最佳方法是什么? Azure Key Vault 仍然是一个有效且不错的选择吗?我是否应该考虑将它们保存在 appsetting.json 中并加密该文件?或者也许还有其他更好的方法?

只有我在开发该应用程序,而且我没有将其存储在任何 public GitHub 存储库或任何东西中。

PS:这是我正在查看的教程的 link:Using Azure Key Vault From A Non-Azure App

谢谢。

编辑: 这是一个教程,我发现它对如何 Use Azure Key Vault With Certificate Outside of Azure

很有用

两件事:

1-您应该将机密存储在 Azure Key Vault 中。正如您已经注意到的,它将提供一个 URL 用于从 Key Vault 检索机密。

2-只有允许的服务才能检索机密。您需要做的是为您的 Web 应用程序创建管理身份,然后将 Key Vault 中的 GET / LIST 机密访问权限授予此托管身份。

这是一步一步的:

https://docs.microsoft.com/en-us/azure/key-vault/general/tutorial-net-create-vault-azure-web-app

(总结讨论和解决方案作为答案)

在 Azure Keyvault 中存储机密是推荐的方法。但是,要获得对 KeyVault 的授权访问权限,您需要 ClientId 和 Secret 或 Certificate 等凭据。所以问题是在哪里存储这些机密以访问 KeyVault 以获取实际机密! :).现在,如果您在 Azure 主机中,例如 Azure Web App 或 VM,我可以直接推荐 Managed Identity where you would not have to maintain the credentials in App, but since you mentioned it's a non-Azure host, I would suggest to go via Certificate authentication,因为基于秘密的身份验证需要您将秘密存储在 config/environmental 变量中的某个位置,这不是一个好主意。还要确保只有您的应用可以访问主机中的该证书。

现在您已与托管供应商协调配置证书并且一切正常,希望对您有所帮助。谢谢