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

8
我正在使用.NET Core 2.0和ASP.NET Core 2.0进行应用程序开发。 "test" 应用程序是一个.NET Core控制台应用程序。我编写的核心代码是一个类库。经过适当的测试后,我选择这样做,因为我不会在一段时间内使用它(它正在替换旧的ASPNET代码)。
无论如何,由于我必须处理许多用于各种服务的API密钥,因此我决定使用Microsoft Azure Key Vault来存储这些密钥。我已经设置好了所有内容并理解了它的工作原理。测试应用程序使用测试Azure帐户,因此它并不重要。而且由于这是替换遗留代码并且处于初期阶段,所以我是唯一的开发人员。
基本上,我遇到了这个问题。从我所看到的信息来看,关于Azure Key Vault的信息不是很多。许多示例将Client ID和Secret以明文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个回答

7

是的,你说得对,纯文本配置文件只能在开发过程中使用,不能用于生产目的。一般来说,可用选项取决于您托管应用程序的位置和方式。

如果您有 Azure Web App,则至少有以下内置选项(从文档):

  • 在 Azure 门户中为 AppSettings 添加 ClientId 和 ClientSecret 值。通过这样做,实际值不会出现在 web.config 中,而是通过 Portal 保护,您可以在其中拥有单独的访问控制功能。这些值将替换为您在 web.config 中输入的值。请确保名称相同。

  • 通过使用客户端 ID 和证书而不是客户端 ID 和客户端密钥来验证 Azure AD 应用程序。以下是在 Azure Web App 中使用证书的步骤:

    • 获取或创建证书
    • 将证书与 Azure AD 应用程序关联
    • 向 Web App 添加代码以使用证书
    • 将证书添加到 Web App

您也可以使用环境变量来存储凭据。如果您能够保证在生产环境中无法对环境变量进行快照,则这可能是可以接受的。请查看环境变量被视为危险,会泄露您的机密以获取更多详细信息。


最后一件事:还有一种技术是基于这样的想法,即您只需要存储/传递ClientSecret值,而ClientId应该基于托管App的机器/容器详细信息构建(例如docker容器ID)。我找到了一个Hashicorp Vault和在AWS上托管的App的示例,但通用思想是相同的:使用Vault进行秘密管理


2
除了第一个答案之外,针对在 Azure VM 上运行应用程序的情况,您可以使用客户端证书认证来进行身份验证,而不是使用 client_secret。具体请参考这篇文档:文档:使用证书进行身份验证而非客户端密码

Key Vault Client Certificate Authentication Image

在上面的图片中:
  • 应用程序通过证明它拥有证书的私钥(如果您使用Windows,则基本上存储在CNG中)来对AAD进行身份验证。
  • 应用程序获取access_token,然后使用它来访问Key Vault。

开发人员不需要知道证书的私钥值,以使其应用程序成功进行身份验证。相反,他们只需要知道导入到证书存储中的pfx的位置(一个包含私钥及其证书的容器)。

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


另一种适用于 Azure Compute 的方法是使用 Azure 托管服务标识。使用 Azure MSI,Azure 将自动为您的资源(如 VM)分配身份/服务主体,并且您可以向特定的端点发送请求,这些端点仅由您的资源访问以获取 access_token。但要注意,Azure MSI 仍处于公共预览阶段,因此请在使用之前查看已知问题。

Azure Managed Service Identity Image

上图解释了Azure Resource Manager如何为您的虚拟机分配服务主体标识。
  • 当您在虚拟机中启用MSI时,Azure将在您的AAD中创建一个服务主体。
  • Azure将部署新的MSI VM扩展到您的虚拟机。这提供了一个端点http://localhost:50432/oauth2/token,用于获取服务主体的access_token
  • 然后,您可以使用access_token访问资源,例如Key Vault,以授权服务主体访问。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接