如何使用 MSI 从 Spring Boot 应用程序连接到 Azure Key Vault 进行本地开发

How to connect to Azure keyvault from SpringBoot application for local development using MSI

我正在尝试从本地 运行ning Spring 引导应用程序连接到 Azure KeyVault。我无法在开发期间将这些机密保存在不同属性或 yaml 中的 keyvault 中,因为我的应用程序将在 运行 时间内生成和删除如此多的机密和令牌以保存在 keyvault 中。

我知道我们可以根据您的应用程序注册创建 Azure 服务主体的过程。并使用

azure.keyvault.client-id azure.keyvault.client-键

在 application.properties 中连接。

但在我们的案例中可能不允许创建 Azure 服务主体。那么有什么方法可以使用本地 运行ning Spring 启动应用程序中的 MSI 连接到密钥库。

使用MSI_ENDPOINT 和 MSI_SECRET

So is there any way to connect to key vault using MSI from locally running SpringBoot application. using MSI_ENDPOINT and MSI_SECRET

我认为您不能使用 MSI_ENDPOINTMSI_SECRET 在本地获取令牌,只有在云端发布 Web 应用程序时才有效。

But it may not be allowed to be created Azure service principal in our case.

如您所知,您可以使用服务主体 client idsecret(key) 访问密钥库。实际上,当启用 Web 应用程序的 MSI 时,它会自动在你的 Azure AD 租户中创建一个服务主体。所以你可以只使用它的客户端ID和密码。

导航到门户 -> Azure Active Directory -> Enterprise applications -> 搜索您的网络应用程序名称(select Application TypeAll Applications) , 然后你得到 client id(application id).

注意:请记住检查服务主体的对象 ID 与您的 Web 应用程序中的对象 ID -> Identity,确保您使用正确的对象 ID。

对于服务主体机密,您可以通过如下所示的 powershell 创建它(您的帐户需要在您的 AAD 租户中具有管理员角色 Application administratorGlobal administrator)。

New-AzureADServicePrincipalPasswordCredential -ObjectId <service principal object id>

然后您将能够使用客户端 ID 和密码访问密钥库。 java中的详细内容可以参考这个link.

您无法使用这些变量获取它,因为本地计算机上没有注册 Azure AD 身份,因此 Microsoft 没有构建任何 MSI 模拟器,因此不会设置任何变量。

我可以推荐 Microsoft 在其 .NET 库中所做的工作

  1. 运行 Azure CLI 并登录
  2. 在代码中检查变量,如果它们不存在则 运行 CLI 命令

    az account get-access-token --resource 'https://vault.azure.net'
    

在 CLI 中,只需登录主体或您的帐户即可。确保将此 account/your 帐户添加到 KeyVault 策略。

我知道这很奇怪,但我什至可以检查一下 HERE on their GitHub

如果您需要更多详细信息,我可能会有一篇文章对您有所帮助

https://marczak.io/posts/2019/07/securing-websites-with-msi/