Ubuntu本地用DefaultAzureCredential访问Azure Key Vault认证失败求助
解决Azure Key Vault Python SDK本地认证问题
一、Azure CLI登录后能否实现认证?
当然可以!DefaultAzureCredential的认证链本身就包含AzureCliCredential,理论上你完成az login后,SDK应该能自动拾取CLI的令牌。你遇到报错大概率是以下几个细节问题导致的:
- SDK版本兼容性:旧版本的
azure-identity在Linux环境下对CLI令牌的读取支持可能有缺陷,建议先把相关包更新到最新版:pip install --upgrade azure-identity azure-keyvault-secrets - CLI令牌文件权限:在Ubuntu环境中,Azure CLI的令牌默认存在
~/.azure/accessTokens.json,如果你的Python进程没有读取这个文件的权限,就会失败。可以检查并调整权限:# 查看文件权限 ls -l ~/.azure/accessTokens.json # 调整为当前用户可读取(保证安全的前提下) chmod 600 ~/.azure/accessTokens.json - 直接指定CLI认证:如果自动认证链还是不生效,你可以跳过
DefaultAzureCredential,直接使用AzureCliCredential来强制走CLI认证路径,代码修改如下:from azure.keyvault.secrets import SecretClient from azure.identity import AzureCliCredential client = SecretClient(vault_url="https://<<vaultname>>.vault.azure.com", credential=AzureCliCredential()) secret = client.get_secret("<<mysecret>>")
二、手动设置EnvironmentCredential的环境变量,AZURE_CLIENT_ID和AZURE_CLIENT_SECRET填什么?
这两个变量对应的是Azure AD服务主体的身份信息,需要先创建服务主体并配置Key Vault的访问权限,步骤如下:
创建Azure AD服务主体:
用Azure CLI执行命令(替换<服务主体名称>为你自定义的名称):az ad sp create-for-rbac --name <服务主体名称> --skip-assignment执行后会返回一段JSON结果,里面的字段对应环境变量:
{ "appId": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "password": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx", "tenant": "xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" }AZURE_CLIENT_ID= 上述结果中的appIdAZURE_CLIENT_SECRET= 上述结果中的password- 还需要额外设置
AZURE_TENANT_ID= 上述结果中的tenant
给服务主体分配Key Vault权限:
让这个服务主体拥有读取Key Vault机密的权限,执行命令(替换<密钥库名称>和<服务主体appId>):az keyvault set-policy --name <密钥库名称> --spn <服务主体appId> --secret-permissions get list设置环境变量:
在Ubuntu终端中执行以下命令(替换为你的实际值):export AZURE_CLIENT_ID="xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" export AZURE_CLIENT_SECRET="xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx" export AZURE_TENANT_ID="xxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx"之后再运行你的Python代码,
DefaultAzureCredential就会自动读取这些环境变量完成认证。
内容的提问来源于stack exchange,提问作者Andrew Keller
相关产品推荐
相关产品推荐

