从我的本地计算机读取 Azure Keyvault 中的值

Read a value from an Azure Keyvault from my local machine

我不确定如何从我的本地计算机针对 Azure keyvault 进行身份验证。 虽然我知道我可能永远不想在生产场景中这样做,但我确实想在生产前测试它的使用。

这可能吗?

虽然我确实看到了 several options,但我没有使用 DefaultAzureCredential 以及我后来尝试的 CertificateCredential、ClientSecretCredential,每个都有自己的错误,我没有完全理解。

默认的告诉我: azure.core.exceptions.HttpResponseError:(禁止)用户、组或应用程序 'appid=a79ae17f-90f7-4341-a2f7-b4ae4abad7d2;oid=cb8a8745-1567-4cd7-b8a0-5cecd6afe6c6;iss=https://sts.windows.net/98d1d263-cc4b-4d75-96a6-daf642242d3b/' 没有获得密钥保管库权限的机密 'AnotherKV2;location=eastus'

azure.core.exceptions.HttpResponseError:(禁止)用户、组或应用程序 'appid={MYAPPID};oid={SomeOID};iss=https://sts.windows.net/98d1d263-cc4b-4d75-96a6-daf642242d3b/' 没有获得密钥保管库 '{MyKVName};location=eastus' 的机密权限。如需解决此问题的帮助,请参阅 https://go.microsoft.com/fwlink/?linkid=2125287

这很奇怪,原因有二:

  1. 首先,虽然我确实在我的订阅中定义了一个带有 {MYAPPID} 的 SP,但我不记得曾经在我的本地机器上使用过它,所以我的本地应用程序如何具有与(我假设是自动生成的)我在使用以下命令创建服务主体时得到的那个: az ad sp create-for-rbac --name "MyApp"

  2. 其次,查看我的 keyvault 的访问策略,{MYAPPID} 似乎有权做所有事情

我错过了什么吗?应该以其他方式完成吗? (或者根本没有?)

当您 运行 在本地编写代码时,DefaultAzureCredential 会自动使用名为 AZURE_TENANT_IDAZURE_CLIENT_IDAZURE_CLIENT_SECRET 的环境变量描述的服务主体.

所以要使用它,请先在本地的高级设置中Set environmental variables,使用az ad sp create-for-rbac创建的AD App的值即可。

要访问 keyvault 机密,您需要将与 AD 应用相关的服务主体添加到具有正确机密权限的 keyvault Access policies Get, List

注意:请确保服务主体与您的keyvault在同一个Azure AD租户中,添加时请直接搜索APP ID/Client ID,因为两个不同的应用程序可以具有相同的名称。

然后使用下面的代码,它适用于我。

from azure.keyvault.secrets import SecretClient
from azure.identity import DefaultAzureCredential

credential = DefaultAzureCredential()

client = SecretClient(vault_url="https://keyvaultname.vault.azure.net/", credential=credential)

retrieved_secret = client.get_secret("sec789")
print(retrieved_secret.value)

有关详细信息,请参阅 https://docs.microsoft.com/en-us/azure/key-vault/secrets/quick-create-python