我正在使用.NET Core 2.0和ASP.NET Core 2.0进行应用程序开发。 “test”应用程序是.NET Core Console应用程序。我写的核心代码是一个类库。一旦正确测试。我选择这样做,因为我不会暂时使用它(它正在替换旧的ASPNET代码)。
无论如何,由于我必须使用大量API密钥来处理各种服务,所以我决定使用Microsoft Azure Key Vault来存储密钥。我有这个设置,并了解它是如何工作的。测试应用程序使用测试Azure帐户,因此它并不重要。由于这是替换遗留代码并且它处于起步阶段,我是唯一的开发人员。
基本上,我遇到了这个问题。从我所看到的Azure Key Vault上没有太多信息。很多示例都将客户端ID和密钥存储在纯文本 json文件中(例如:https://www.humankode.com/asp-net-core/how-to-store-secrets-in-azure-key-vault-using-net-core)。我真的不明白这是如何安全的。如果有人要获得这些密钥,他们可以轻松访问Azure存储的信息,对吗?
Microsoft MSDN有一个授予访问权限的powershell命令(我丢失了原始链接,这是我能找到的最近的链接:https://www.red-gate.com/simple-talk/cloud/platform-as-a-service/setting-up-and-configuring-an-azure-key-vault/)我的开发操作系统是Windows 10,我的主服务器操作系统是Debian。
我该如何处理?
答案 0 :(得分:6)
是的,您是对的,纯文本配置文件只能在开发期间使用,不能用于生产目的。通常,可用选项取决于您托管应用程序的位置和方式。
如果您有Azure Web App,则至少有下一个内置选项(from the documentation):
在Azure门户中为AppSettings添加ClientId和ClientSecret值。通过执行此操作,实际值将不在web.config中,而是通过具有单独访问控制功能的Portal进行保护。这些值将替换您在web.config中输入的值。确保名称相同。
通过使用客户端ID和证书而不是客户端ID和客户端密钥来验证Azure AD应用程序。以下是在Azure Web App中使用证书的步骤:
- 获取或创建证书
- 将证书与Azure AD应用程序相关联
- 将代码添加到Web App以使用证书
- 向您的网络应用添加证书
您还可以找到一种使用env变量来存储凭据的方法。只有当您可以保证无法在prod机器上执行env变量的快照时,这可能没问题。查看Environment Variables Considered Harmful for Your Secrets了解更多详情。
最后一件事:还有一种基于这个想法的技术,你需要存储/传递ClientSecret值,而ClientId应该根据托管App的机器/容器细节构建(例如docker)容器ID)。我找到了Hashicorp Vault和AWS上托管的应用程序的示例,但总体思路是一样的:Secret management with Vault
答案 1 :(得分:1)
除了第一个答案之外,在Azure VM上运行应用程序的上下文中,您可以使用客户端证书身份验证,而不是使用documentation: Authenticate with a Certificate instead of a Client Secret中所述的客户端证书身份验证,而不是使用client_secret
进行身份验证。
在上图中:
access_token
,然后使用它访问密钥保管库。开发人员无需知道证书的私钥值即可成功验证其应用。相反,他们只需要知道导入的pfx
(私钥及其证书的容器)在证书库中的位置。
至少在Windows上,您作为机密管理员可以将私钥和证书转换为密码保护的pfx
格式,然后将其部署到Windows证书存储区中。这样,除非他们知道pfx
文件的密码,否则没有人能够知道私钥。
Azure Compute的其他细节方法是使用Azure Managed Service Identity。使用Azure MSI,Azure将自动为您的资源(例如VM)分配身份/服务主体,并且您可以在特定端点上触发只能由您的资源访问的请求以获取access_token
。但要小心Azure MSI仍处于公开预览状态,因此请在使用前查看已知问题。
上图说明了Azure Resource Manager如何为VM分配服务主体身份。
access_token
。access_token
访问授权服务主体访问权限的密钥保管库等资源。