[英]Python Azure sdk: How to retrieve secrets from 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 消息:对象 ID 为“x”的客户端“x”无权在范围“/subscriptions/x”上执行操作“Microsoft.Resources/subscriptions/resources/read”。
现在我可以使用 C# 代码/ POwershell 使用相同的凭据访问相同的密钥库,因此授权绝对没有问题。 不知道为什么它不能使用 SDK 工作。 请帮忙。
如果您希望通过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)
这假设您不想传递版本。 如果这样做,您可以用最后一个参数代替它。
我在上面运行您的代码示例,它能够毫无问题地列出密钥库,因此这不是代码问题。
我已将贡献者角色分配给我的 AD 应用程序,其中配置了密钥保管库,并设置了访问策略以允许对 AD 应用程序的密钥和秘密的 GET & LIST 权限。
我在Python 3.6.2运行时环境下运行的 Azure Python 包的版本:
我会建议您尝试已验证有效的 Python 运行时版本和 Azure Python 包版本。
附录:
如果上述 Python 运行时环境版本以及 Azure Python 包也不适用于您,您可能应该考虑在适用于 Python GitHub的Azure SDK 中创建一个新问题,因为它也使用与 Azure .NET SDK 相同的凭据作为 PowerShell。
您还可以通过密钥的名称而不是 ID 来获取密钥:
secret_bundle = client.get_secret(<VAULT URL>, "<NAME>", "")
可以使用 azure.identity 中的以下类,即ClientSecretCredential ,找到以下代码,例如:snippet
from azure.identity import ClientSecretCredential
from azure.keyvault.secrets import SecretClient
TENANT= <TenantId-in-string>
CLIENT_ID = <ClientId-in-string>
CLIENT_SECRET= <ClientSecret-in-string>
credential = ClientSecretCredential(TENANT,CLIENT_ID,CLIENT_SECRET)
VAULT_URL= <AzureVault-url-in-string>
client = SecretClient(vault_url=VAULT_URL, credential=credential)
print(client)
example_secret = client.get_secret(<secret_name_in_string>)
print(example_secret.value)
已经有一些很好的答案,但是 Azure SDK 已经发布了用于在 Python 中使用 Key Vault 的新包,以替换azure-keyvault
:
azure-identity也是应该与这些一起用于身份验证的包。
可以在azure-sdk-for-python GitHub 存储库中找到有关使用 secrets 库的文档,这里有一个示例,用于在您执行时检索机密:
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")
您可以通过设置与client_id
、 secret
和tenant
对应的环境变量来提供用于ServicePrincipalCredentials
的相同凭据:
export AZURE_CLIENT_ID="client_id"
export AZURE_CLIENT_SECRET="secret"
export AZURE_TENANT_ID="tenant"
(我使用 Python 开发 Azure SDK)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.