Spring 启动 - Azure Key Vault 管理 Vault 访问机密

Spring Boot - Azure Key Vault Managing Vault Access secrets

我正在为我的前端服务开发 spring 引导应用程序(微服务)后端。 我想开始使用 Azure 作为这些服务的 运行 基础设施。 我还想使用 Azure Key Vault,因为如果我的理解是正确的,它会给我带来以下好处:

我不明白如何在我的 spring 启动应用程序中处理保管库访问。 当我使用 azure-key-vault spring 引导启动程序时,我必须像本教程中那样在 applications.properties 中设置访问权限:How to use the Spring Boot Starter for Azure Key Vault

但在我看来,我只是用 id/password 的另一个图层来保护我的秘密,它再次以纯文本形式出现在我的 .propertes 文件中,并最终出现在版本控制系统中。

有什么方法可以处理这个问题?Vault 应该在哪些方面提供额外的安全性? 我错过了什么?

如果这对问题很重要,我想将我的 spring 启动后端作为 jar 部署在 azure web 应用程序资源中。

提前致谢

我是 Azure SDK for Key Vault 的开发人员。 Azure Key Vault 提供了一个集中且安全的存储库,可以使用不同的权限集对多个人、服务主体(应用程序)或托管身份(稍后详细介绍)进行身份验证。就像维护者可能能够列出、获取和设置机密、密钥和证书一样,而应用程序和托管身份可能只能获取和列出(如果您出于某种原因需要枚举所有机密,例如某些应用程序配置启动例程来填充所有匹配某种模式的秘密)。这提供了一种控制谁可以访问什么以及访问到什么程度的方法。

理想情况下 - 并且按照建议 - 尽可能使用托管身份。 Managed identities allow you to run your app with a particular ID that is managed by Azure. No password is supplied. The app runs as that identity, which you can grant access to in a Key Vault 具有满足您需要的任何权限。

示例 like the one you referenced 倾向于使用简单的示例来解释概念,但我们已经意识到并正在尝试更新这样的文档以推荐托管身份。

但是,仍然可以相当安全地使用应用程序机密。一种典型的方法是只有少数人知道这些秘密(它们本身可以存储在 Key Vault 中,并且只有少数人可以访问该密钥保管库以列出和获取值 - 因为无论如何您都需要访问权限才能添加它们),然后将它们作为环境变量添加到您的应用程序中。 Azure 和其他服务(GitHub、AppVeyor 等)通常有保护机密的方法。

例如,您的应用程序可以使用您在安全性之前设置的环境变量,如下所示:

AZURE_TENANT_ID="some GUID - doesn't really have to be secret, but doesn't hurt"
AZURE_CLIENT_ID="secret GUID for service principal ID"
AZURE_CLIENT_SECRET="secret value for service principal ID"

然后,使用我们的 Azure.* 包,您可以让您的代码执行如下操作:

SecretAsyncClient secretAsyncClient = new SecretClientBuilder()
  .vaultUrl("https://myvault.vault.azure.net/")
  .credential(new DefaultAzureCredentialBuilder().build())
  .buildAsyncClient();

String secret;
secretAsyncClient.getSecret("secretName")
  .subscribe(secretWithVersion ->
    secret = secretWithVersion.getValue());

您可以使用那个或 - 更好 - 不同的服务主体进行开发。在开发 Azure Key Vault SDK 时,我设置了自己的 SP,仅用于开发目的,而我们的测试运行器使用 Azure DevOps pulled from an authenticated Key Vault connection.

中的变量使用不同的 SP

您可以进一步将其扩展到不同的开发、测试和生产环境,每个环境都可以有一个单独的服务主体来访问不同的保险库(也许可以通过更少的授权 applications/people 使生产保险库更安全)。

希望这对您有所帮助。如果您还有其他问题,请告诉我。