You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过Azure CLI动态获取服务主体密钥实现Python脚本登录认证

使用服务主体认证Azure并避免硬编码密钥的方案

一、将服务主体密钥安全存储至Azure Key Vault

Azure Key Vault是官方推荐的敏感信息存储方案,能确保密钥的加密存储与细粒度权限控制:

  1. 若未创建Key Vault,先执行命令创建:
    az keyvault create --name <你的Vault名称> --resource-group <资源组名> --location <目标区域>
    
  2. 将服务主体密钥存入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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 22:50:39