首页 > 解决方案 > 从我的本地计算机上读取 Azure Keyvault 的值

问题描述

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

那可能吗?

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

默认的告诉我: azure.core.exceptions.HttpResponseError: (Forbidden) The user, group or application '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,但我不记得曾经在我的本地机器上使用过它,所以我的本地应用程序如何具有与(我假设是自动生成的)相同的 APPID当我使用以下命令创建服务主体时得到: az ad sp create-for-rbac --name "MyApp"

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

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

标签: pythonazureazure-keyvaultpermission-denied

解决方案


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

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

要访问 keyvault 机密,您需要将与 AD 应用相关的服务主体添加到Access policies具有正确机密权限的 keyvault 中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


推荐阅读