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明文写入:
- 先给SP分配密钥范围的READ权限(参考方案1),在密钥范围中存储SP的客户端ID、客户端密钥、租户ID
- 创建集群初始化脚本(
.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)
- 将脚本上传到DBFS,编辑集群时在「高级选项」->「初始化脚本」中添加该脚本路径
- 此时
DefaultAzureCredential会自动读取环境变量完成认证,你原有的代码可直接使用
内容的提问来源于stack exchange,提问作者BeGreen
相关产品推荐
相关产品推荐

