问题描述
我的用例如下:我有一个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
谢谢。
编辑: 这是我对如何Use Azure Key Vault With Certificate Outside of Azure
有用的教程解决方法
两件事:
1-您应该将机密存储在Azure Key Vault中。您已经注意到,它将提供一个URL,该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,在这里您不必维护App中的凭据,但是由于您提到它是非Azure主机,我建议您通过Certificate authentication进行操作,因为基于秘密的身份验证需要将秘密存储在config / environmental变量中的某个位置,这不是一个好主意。另外,请确保只有您的应用可以访问主机中的该证书。
由于您现在与托管供应商进行了协调以配置证书,并且一切正常,所以希望对您有所帮助。谢谢。