使用Azure Key Vault和Active Directory检索机密

时间:2019-04-11 14:41:33

标签: python azure azure-active-directory azure-keyvault

对于Python代码库,我希望开发人员可以使用Azure Key Vault访问应用程序秘密,以为我们在部署时也应该能够连接应用程序。因此,我正在考虑Active Directory。

但是,我在Interweb上找不到任何使用Python SDK进行显示的示例。最初,我会考虑检索CLI用户:

from azure.common.credentials import get_azure_cli_credentials

credentials, subscription_id, tenant_id = get_azure_cli_credentials(with_tenant=True)

,然后使用检索到的一组凭据来访问密钥库:

from azure.keyvault import KeyVaultClient

vault_url = "https://########.vault.azure.net/"
secret_name = "########"
secret_version = "########"

client = KeyVaultClient(credentials)
secret = client.get_secret(vault_url, secret_name, secret_version)

print(secret)

但是,我检索到一个错误:

azure.keyvault.v7_0.models.key_vault_error_py3.KeyVaultErrorException: Operation returned an invalid status code 'Unauthorized'

我可以确认credentialssubscription_idtenant_id是正确的,并且可以使用CLI成功检索机密内容。因此,一定是某些特定于Python SDK的东西。

有什么想法吗?

5 个答案:

答案 0 :(得分:0)

this代码段如何处理?将您的代码与示例进行比较,我看不到您在哪里设置client_id或承租人。

答案 1 :(得分:0)

您将要设置密钥库的访问策略,以允许经过身份验证的用户访问机密。这可以在门户网站中完成。请注意,密钥库的上限是16个访问权限定义,因此您可能要授予对该组的访问权限,并将用户添加到该组中。

答案 2 :(得分:0)

这似乎是Python SDK中的错误。

https://github.com/Azure/azure-sdk-for-python/issues/5096

您可以将自己的AD用户名和密码用于UserPassCredentials类。它不是已登录的用户,但可能与您现在所获得的距离非常近。

EG:

from azure.common.credentials import UserPassCredentials
credentials = UserPassCredentials('username','password')

client = KeyVaultClient(credentials)
secret = client.get_secret(vault_url, secret_name, secret_version)

print(secret)

答案 3 :(得分:0)

在尝试更改添加资源参数的第一个函数调用之前,我尝试了相同的操作,并且遇到了不同的错误(“ ...受众群体无效...”)

credentials, subscription_id, tenant_id = 
     get_azure_cli_credentials(resource='https://vault.azure.net', with_tenant=True)

通过此更改,我能够使用您显示的相同代码访问机密。

答案 4 :(得分:0)

正如@8forty 所指出的,向您的 resource='https://vault.azure.net' 调用添加一个 get_azure_cli_credentials 参数将解决该问题。

但是,在 Python 中使用 Key Vault 的新包替代了 azure-keyvault

azure-identity 也是应该与这些一起用于身份验证的包。

如果要使用已登录 CLI 用户的凭据对 Key Vault 客户端进行身份验证,可以使用 AzureCliCredential class

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

credential = AzureCliCredential()

vault_url = "https://{vault-name}.vault.azure.net"
secret_name = "secret-name"

client = SecretClient(vault_url, credential)
secret = client.get_secret(secret_name)

print(secret.value)

(我使用 Python 开发 Azure SDK)