从我的本地计算机读取 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
这很奇怪,原因有二:
首先,虽然我确实在我的订阅中定义了一个带有 {MYAPPID} 的 SP,但我不记得曾经在我的本地机器上使用过它,所以我的本地应用程序如何具有与(我假设是自动生成的)我在使用以下命令创建服务主体时得到的那个:
az ad sp create-for-rbac --name "MyApp"
其次,查看我的 keyvault 的访问策略,{MYAPPID} 似乎有权做所有事情
我错过了什么吗?应该以其他方式完成吗? (或者根本没有?)
当您 运行 在本地编写代码时,DefaultAzureCredential
会自动使用名为 AZURE_TENANT_ID
、AZURE_CLIENT_ID
和 AZURE_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
我不确定如何从我的本地计算机针对 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
这很奇怪,原因有二:
首先,虽然我确实在我的订阅中定义了一个带有 {MYAPPID} 的 SP,但我不记得曾经在我的本地机器上使用过它,所以我的本地应用程序如何具有与(我假设是自动生成的)我在使用以下命令创建服务主体时得到的那个: az ad sp create-for-rbac --name "MyApp"
其次,查看我的 keyvault 的访问策略,{MYAPPID} 似乎有权做所有事情
我错过了什么吗?应该以其他方式完成吗? (或者根本没有?)
当您 运行 在本地编写代码时,DefaultAzureCredential
会自动使用名为 AZURE_TENANT_ID
、AZURE_CLIENT_ID
和 AZURE_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