存储Azure Vault客户端ID和客户端密钥

时间:2017-11-12 03:44:33

标签: .net-core asp.net-core-2.0 azure-keyvault .net-core-2.0

我正在使用.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。

我该如何处理?

2 个答案:

答案 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进行身份验证。

Key Vault Client Certificate Authentication Image

在上图中:

  • 应用程序通过证明它具有证书的私钥(如果您使用Windows,它基本上存储在CNG中)来对AAD进行身份验证。
  • 应用程序返回access_token,然后使用它访问密钥保管库。

开发人员无需知道证书的私钥值即可成功验证其应用。相反,他们只需要知道导入的pfx(私钥及其证书的容器)在证书库中的位置。

至少在Windows上,您作为机密管理员可以将私钥和证书转换为密码保护的pfx格式,然后将其部署到Windows证书存储区中。这样,除非他们知道pfx文件的密码,否则没有人能够知道私钥。

Azure Compute的其他细节方法是使用Azure Managed Service Identity。使用Azure MSI,Azure将自动为您的资源(例如VM)分配身份/服务主体,并且您可以在特定端点上触发只能由您的资源访问的请求以获取access_token。但要小心Azure MSI仍处于公开预览状态,因此请在使用前查看已知问题。

Azure Managed Service Identity Image

上图说明了Azure Resource Manager如何为VM分配服务主体身份。

  • 在VM中启用MSI时,Azure将在您的AAD中创建服务主体。
  • 然后,Azure将为您的VM部署新的MSI VM扩展。这提供了http://localhost:50432/oauth2/token的端点,用于获取服务主体的access_token
  • 然后,您可以使用access_token访问授权服务主体访问权限的密钥保管库等资源。