Python Azure sdk:如何从 keyvault 检索机密?

90a*_*yss 5 python azure azure-keyvault azure-sdk-python azure-sdk

我需要从 keyvault 中检索秘密。到目前为止,这是我的代码:

from azure.mgmt.keyvault import KeyVaultManagementClient
from azure.common.credentials import ServicePrincipalCredentials


subscription_id = 'x'
# See above for details on creating different types of AAD credentials
credentials = ServicePrincipalCredentials(
    client_id = 'x',
    secret = 'x',
    tenant = 'x'
)

kv_client = KeyVaultManagementClient(credentials, subscription_id)

for vault in kv_client.vaults.list():
    print(vault)
Run Code Online (Sandbox Code Playgroud)

但我收到此错误:

msrestazure.azure_exceptions.CloudError:Azure 错误:AuthorizationFailed 消息:对象 ID 为“x”的客户端“x”无权在范围“/subscriptions/x”上执行操作“Microsoft.Resources/subscriptions/resources/read”。

现在我可以使用 C# 代码/ POwershell 使用相同的凭据访问相同的 keyvault,因此授权肯定没有问题。不知道为什么它不能使用 SDK 工作。请帮忙。

Den*_*sky 6

如果您想通过ServicePrincipalCredentials实例访问,您可以使用:

from azure.keyvault import KeyVaultClient, KeyVaultAuthentication
from azure.common.credentials import ServicePrincipalCredentials

credentials = None

def auth_callback(server, resource, scope):
    credentials = ServicePrincipalCredentials(
        client_id = '',
        secret = '',
        tenant = '',
        resource = "https://vault.azure.net"
    )
    token = credentials.token
    return token['token_type'], token['access_token']

client = KeyVaultClient(KeyVaultAuthentication(auth_callback))

secret_bundle = client.get_secret("https://vault_url", "secret_id", "")

print(secret_bundle.value)
Run Code Online (Sandbox Code Playgroud)

这假设您不想传递版本。如果这样做,您可以用最后一个参数替换它。


juv*_*han 4

我运行上面的代码示例,它能够毫无问题地列出密钥保管库,因此这不是代码问题。

我已将贡献者角色分配给配置了密钥保管库的订阅上的 AD 应用程序,并设置访问策略以允许对 AD 应用程序的密钥和秘密的 GET 和 LIST 权限。

我在Python 3.6.2运行时环境下运行的Azure Python包的版本:

  • azure.common (1.1.8)
  • azure.mgmt.keyvault (0.40.0)
  • 女士餐厅(0.4.13)

我建议您尝试经过验证可以正常工作的 Python 运行时版本和 Azure Python 包版本。

附录:

如果上述 Python 运行时环境版本以及 Azure Python 包也不适合您,您可能应该考虑在Azure SDK for Python GitHub中创建一个新问题,因为它也与 Azure .NET SDK 使用相同的凭据作为 PowerShell。