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

Xeq*_*tor 5 c# appsettings azure azure-keyvault asp.net-core

也许我的问题已经有了答案,但经过长时间的搜索,我还是找不到。

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

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

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

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

只有我在开发应用程序,而且我不会将它存储在任何公共 GitHub 存储库或任何东西中。

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

谢谢。

编辑:这是一个教程,我发现它对如何在Azure 之外使用带有证书的 Azure Key Vault很有

kri*_*shg 2

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

建议的方法是在 Azure Keyvault 中存储机密。但是,要获得对 KeyVault 的授权访问权限,您将需要 ClientId 和 Secret 或证书等凭据。所以问题是在哪里存储这些秘密以访问 KeyVault 来获取实际的秘密!:)。现在,如果您位于 Azure 主机(例如 Azure Web App 或 VM)中,我可以直接推荐托管身份 ,您不必在应用程序中维护凭据,但既然您提到它是非Azure 主机,我建议您去通过证书身份验证,因为基于秘密的身份验证需要您将秘密存储在配置/环境变量中的某个位置,这不是一个好主意。另请确保只有您的应用程序有权访问主机中的该证书。

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