Databricks中如何安全授权用户执行含Secret的函数且不暴露Secret
解决方案与最佳实践
1. 使用所有者权限模式的函数(SECURITY DEFINER)
这是Databricks中解决这类问题的核心方案:创建函数时指定以函数所有者的权限执行,而非调用者权限,这样函数访问Secret时用的是创建者的权限,调用者无需拥有Secret访问权。
操作步骤
- 创建函数时添加
SECURITY DEFINER关键字(默认是SECURITY INVOKER,会使用调用者权限) - 示例代码(Python UDF):
CREATE OR REPLACE FUNCTION anonymize_pii(pii_col STRING) RETURNS STRING SECURITY DEFINER AS $$ from pyspark.sql.functions import sha2 # 以函数所有者权限读取Secret secret_key = dbutils.secrets.get(scope="pii_secret_scope", key="anonymization_key") # PII匿名化逻辑(示例:加盐哈希) return sha2(pii_col + secret_key, 256) $$ LANGUAGE PYTHON;
- 权限配置:仅需给目标用户授予该函数的
USAGE权限,无需分配任何Secret范围的访问权限。 - 安全提示:严格控制
SECURITY DEFINER函数的逻辑范围,避免包含危险操作;同时给函数所有者分配最小化的Secret权限(仅必要的READ权限即可),降低权限滥用风险。
2. 用Databricks作业做代理执行(批量场景)
如果是批量处理PII数据的场景,可以把匿名化逻辑封装为Databricks作业,让用户触发作业而非直接调用函数:
- 用拥有Secret访问权限的服务主体创建作业,作业内部执行匿名化逻辑
- 给用户授予作业的
RUN权限,允许他们触发作业、查看执行结果,但无法接触到Secret - 作业接收输入数据路径,处理后输出到用户可访问的路径,全程隔离Secret访问
3. 封装为受控API服务(实时场景)
如果需要实时调用匿名化能力,可以把逻辑封装为Databricks托管的API服务:
- 用拥有Secret权限的服务主体部署API(比如通过MLflow模型服务或自定义REST API)
- 给用户分配API调用的身份凭证(如Databricks个人访问令牌),让他们通过API提交PII数据、获取处理结果
- API内部完成Secret读取和匿名化操作,用户全程无法接触Secret
关键安全原则
- 最小权限:给函数所有者、服务主体分配的Secret权限仅保留必要的
READ权限,避免过度授权 - 审计监控:开启Databricks审计日志,监控函数、作业、API的调用记录,及时发现异常访问
- 禁止硬编码:所有Secret必须通过
dbutils.secrets.get读取,绝对不能硬编码在代码中
内容的提问来源于stack exchange,提问作者NRLV
相关产品推荐
相关产品推荐

