我需要从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。请帮忙。
答案 0 :(得分:2)
我运行上面的代码示例,它能够列出密钥保险库,没有任何问题,因此它不是代码问题。
我已在配置密钥保管库的订阅中将参与者角色分配给我的AD应用程序,并将访问策略设置为允许GET&对AD应用程序的密钥和密钥的LIST权限。
在 Python 3.6.2 运行时环境下运行的Azure Python软件包的版本:
我建议您尝试验证有效的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")
通过设置与ServicePrincipalCredentials
,client_id
和secret
对应的环境变量,可以提供与tenant
相同的凭据:
export AZURE_CLIENT_ID="client_id"
export AZURE_CLIENT_SECRET="secret"
export AZURE_TENANT_ID="tenant"
(我使用Python开发Azure SDK)