如何通过Azure CLI动态获取服务主体密钥实现Python脚本登录认证
使用服务主体认证Azure并避免硬编码密钥的方案
一、将服务主体密钥安全存储至Azure Key Vault
Azure Key Vault是官方推荐的敏感信息存储方案,能确保密钥的加密存储与细粒度权限控制:
- 若未创建Key Vault,先执行命令创建:
az keyvault create --name <你的Vault名称> --resource-group <资源组名> --location <目标区域> - 将服务主体密钥存入Key Vault机密:
az keyvault secret set --vault-name <你的Vault名称> --name sp-secret --value <你的服务主体密钥>
二、授予读取密钥的权限
确保运行脚本的身份(本地用户/托管身份)拥有Key Vault的机密读取权限:
- 给本地Azure账户授权:
az keyvault set-policy --name <你的Vault名称> --upn <你的Azure账户邮箱> --secret-permissions get - 若在Azure托管资源(如VM、函数应用)上运行,用托管身份的对象ID授权:
az keyvault set-policy --name <你的Vault名称> --object-id <托管身份对象ID> --secret-permissions get
三、Python脚本动态获取密钥并完成AZ CLI登录
通过环境变量存储非敏感配置(服务主体ID、租户ID、Vault名称等),脚本中调用AZ CLI动态拉取密钥并登录:
1. 设置环境变量(避免硬编码)
# Linux/macOS export AZURE_SP_CLIENT_ID="<你的服务主体客户端ID>" export AZURE_TENANT_ID="<你的Azure租户ID>" export AZURE_KEYVAULT_NAME="<你的Vault名称>" export AZURE_SP_SECRET_NAME="sp-secret" # Windows(PowerShell) $env:AZURE_SP_CLIENT_ID="<你的服务主体客户端ID>" $env:AZURE_TENANT_ID="<你的Azure租户ID>" $env:AZURE_KEYVAULT_NAME="<你的Vault名称>" $env:AZURE_SP_SECRET_NAME="sp-secret"
2. Python脚本实现
import subprocess import os # 从环境变量读取配置 client_id = os.getenv("AZURE_SP_CLIENT_ID") tenant_id = os.getenv("AZURE_TENANT_ID") vault_name = os.getenv("AZURE_KEYVAULT_NAME") secret_name = os.getenv("AZURE_SP_SECRET_NAME") # 从Key Vault获取服务主体密钥 get_secret_cmd = [ "az", "keyvault", "secret", "show", "--vault-name", vault_name, "--name", secret_name, "--query", "value", "-o", "tsv" ] try: secret_result = subprocess.run(get_secret_cmd, capture_output=True, text=True, check=True) sp_secret = secret_result.stdout.strip() except subprocess.CalledProcessError as e: print(f"获取密钥失败: {e.stderr}") exit(1) # 使用服务主体完成AZ CLI登录 login_cmd = [ "az", "login", "--service-principal", "-u", client_id, "-p", sp_secret, "--tenant", tenant_id ] try: subprocess.run(login_cmd, check=True) print("服务主体登录成功") except subprocess.CalledProcessError as e: print(f"登录失败: {e.stderr}") exit(1) # 后续可执行其他Azure操作,比如调用AZ CLI命令或Azure SDK # 示例:获取当前订阅信息 subprocess.run(["az", "account", "show"], check=True)
关键注意事项
- 永远不要将敏感信息(密钥)硬编码到脚本或提交至版本控制系统
- 若在CI/CD环境(如Azure DevOps、GitHub Actions),可直接使用托管身份访问Key Vault,无需手动处理密钥
- 确保AZ CLI已安装并完成初始化(首次运行
az login验证环境)
内容的提问来源于stack exchange,提问作者Sadhna Pandey
相关产品推荐
相关产品推荐

