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

时间:2017-08-30 18:44:29

标签: python azure azure-keyvault azure-sdk-python

我需要从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)

但是我收到了这个错误:

  

msrestazure.azure_exceptions.CloudError:Azure错误:   AuthorizationFailed消息:客户端' x'对象id' x'不   没有授权执行操作   ' Microsoft.Resources /订阅/资源/读取'超范围   ' /订阅/ X'

现在我可以使用C#code / POwershell访问具有相同凭据的相同keyvault,因此授权绝对没有问题。不确定为什么它不能使用SDK。请帮忙。

4 个答案:

答案 0 :(得分:2)

我运行上面的代码示例,它能够列出密钥保险库,没有任何问题,因此它不是代码问题。

我已在配置密钥保管库的订阅中将参与者角色分配给我的AD应用程序,并将访问策略设置为允许GET&对AD应用程序的密钥和密钥的LIST权限。

Python 3.6.2 运行时环境下运行的Azure Python软件包的版本:

  • azure.common(1.1.8)
  • azure.mgmt.keyvault(0.40.0)
  • msrestazure(0.4.13)

我建议您尝试验证有效的Python运行时版本和Azure Python软件包版本。

<强>附录:

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

答案 1 :(得分:2)

如果您希望通过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)

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

答案 2 :(得分:2)

您还可以通过机密名称而不是ID来获得机密:

secret_bundle = client.get_secret(<VAULT URL>, "<NAME>", "")

答案 3 :(得分:0)

已经有一些不错的答案,但是Azure SDK自此发布了新的软件包,用于在Python中使用Key Vault来代替azure-keyvault

azure-identity也是用于身份验证的软件包。

可以在azure-sdk-for-python GitHub repository上找到有关使用机密库的文档,这是您在进行操作时用于检索机密的示例:

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

credential = DefaultAzureCredential()

secret_client = SecretClient(
    vault_url="https://my-key-vault.vault.azure.net/",
    credential=credential
)
secret = secret_client.get_secret("secret-name")

通过设置与ServicePrincipalCredentialsclient_idsecret对应的环境变量,可以提供与tenant相同的凭据:

export AZURE_CLIENT_ID="client_id"
export AZURE_CLIENT_SECRET="secret"
export AZURE_TENANT_ID="tenant"

(我使用Python开发Azure SDK)