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

Databricks非管理员服务主体无法获取密钥,寻求无明文凭据的Azure连接方案

解决方案

方案1:为服务主体分配密钥范围的读取权限

你误以为dbutils.secrets.get需要Databricks全局管理员权限,实际上只需要密钥范围的权限。密钥范围的管理员(无需是Databricks管理员)可给你的服务主体(SP)分配读取权限:

  • 登录Databricks,进入「工作区」->「机密」->「密钥范围」,找到关联Azure Key Vault的目标范围
  • 点击该范围的「权限」选项卡,添加你的SP,分配READ权限
  • 之后即可在Notebook/Job中正常调用:
secret_value = dbutils.secrets.get(scope="你的密钥范围名称", key="密钥名")

方案2:启用Databricks托管身份认证

若不想依赖密钥范围,可通过托管身份直接访问Key Vault:

1. 配置集群/作业的托管身份

  • 集群场景:编辑目标集群,进入「高级选项」->「身份」,勾选「启用托管身份」,选择已创建的托管标识(无则先在Azure Portal创建)
  • 作业场景:创建/编辑作业时,在「运行身份」下拉框选择托管身份

2. 给托管身份分配Key Vault权限

在Azure Portal找到目标Key Vault,进入「访问控制(IAM)」,添加角色分配:

  • 角色选择「密钥保管库机密读取者」
  • 成员选择你配置的Databricks托管标识

3. 修改认证代码

使用托管身份直接认证,无需明文凭证:

from azure.keyvault.secrets import SecretClient
from azure.identity import ManagedIdentityCredential

key_vault_name = "my_keyvault_name"
managed_identity_client_id = "你的托管标识客户端ID"  # 仅当存在多个托管标识时需指定

client = SecretClient(
    vault_url=f"https://{key_vault_name}.vault.azure.net",
    credential=ManagedIdentityCredential(client_id=managed_identity_client_id)
)
my_secret_value = client.get_secret("my_secret").value

方案3:通过集群初始化脚本配置SP环境变量

若必须使用服务主体,可将SP凭证通过集群初始化脚本注入环境变量,无需在Notebook明文写入:

  1. 先给SP分配密钥范围的READ权限(参考方案1),在密钥范围中存储SP的客户端ID、客户端密钥、租户ID
  2. 创建集群初始化脚本(.sh文件):
#!/bin/bash
export AZURE_CLIENT_ID=$(databricks secrets get --scope <你的密钥范围> --key sp-client-id)
export AZURE_CLIENT_SECRET=$(databricks secrets get --scope <你的密钥范围> --key sp-client-secret)
export AZURE_TENANT_ID=$(databricks secrets get --scope <你的密钥范围> --key sp-tenant-id)
  1. 将脚本上传到DBFS,编辑集群时在「高级选项」->「初始化脚本」中添加该脚本路径
  2. 此时DefaultAzureCredential会自动读取环境变量完成认证,你原有的代码可直接使用

内容的提问来源于stack exchange,提问作者BeGreen

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 02:31:07