【问题标题】:Storing Azure Vault Client ID and Client Secret存储 Azure Vault 客户端 ID 和客户端密码
【发布时间】:2018-04-25 00:11:31
【问题描述】:

我正在使用 .NET Core 2.0 和 ASP.NET Core 2.0 进行应用程序开发。 “测试”应用程序是一个 .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。

我该如何处理?

【问题讨论】:

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


    【解决方案1】:

    是的,你是对的,纯文本配置文件只能在开发期间使用,不能用于生产目的。通常,可用选项取决于您托管应用的位置和方式。

    如果您有 Azure Web 应用程序,则至少有下一个内置选项 (from the documentation):

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

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

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

    您还可以找到一种使用环境变量来存储凭据的方法。仅当您可以保证无法在 prod 机器上创建 env 变量的快照时,这可能是可以的。查看Environment Variables Considered Harmful for Your Secrets了解更多详情。


    最后一件事:还有一种技术基于这个想法,您只需要存储/传递一个 ClientSecret 值,而 ClientId 应该根据托管应用程序的机器/容器详细信息(例如 docker容器标识)。我找到了 Hashicorp Vault 和托管在 AWS 上的应用程序的示例,但总体思路是相同的:Secret management with Vault

    【讨论】:

      【解决方案2】:

      除了第一个答案之外,在 Azure VM 上运行应用程序的上下文中,您可以使用客户端证书身份验证,而不是使用 client_secret 进行身份验证,如 documentation: Authenticate with a Certificate instead of a Client Secret 中所述。

      上图中:

      • 应用程序通过证明它具有证书的私钥(如果您使用的是 Windows,则基本上存储在 CNG)来向 AAD 进行身份验证。
      • 应用程序取回 access_token,然后使用它访问 Key Vault。

      开发者不需要知道证书的私钥值就可以成功验证他们的应用程序。相反,他们只需要知道导入的pfx(私钥及其证书的容器)在证书存储中的位置。

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


      Azure Compute 的另一种方法细节是使用Azure Managed Service Identity。使用 Azure MSI,Azure 将自动为您的资源(例如 VM)分配一个标识/服务主体,并且您可以在特定端点上触发请求,这些请求只能由您的资源访问以获取 access_token。但请注意 Azure MSI 仍处于公共预览阶段,因此请在使用前查看已知问题。

      上图说明了 Azure 资源管理器如何将服务主体身份分配给您的 VM。

      • 当您在 VM 中启用 MSI 时,Azure 将在您的 AAD 中创建一个服务主体。
      • 然后,Azure 将向您的 VM 部署一个新的 MSI VM 扩展。这提供了一个位于 http://localhost:50432/oauth2/token 的端点,用于获取服务主体的 access_token
      • 然后您可以使用access_token 访问授权服务主体访问权限的资源,例如 Key Vault。

      【讨论】:

        猜你喜欢
        • 2017-05-09
        • 1970-01-01
        • 2019-05-29
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-09-24
        相关资源
        最近更新 更多