在 Spark 配置属性或环境变量中使用密钥

本文提供了有关如何在 Spark 配置属性或环境变量中引用机密的详细信息。 检索到的机密信息会在笔记本输出以及 Spark 驱动程序和执行器日志中被编辑。

重要

此功能目前以公共预览版提供。

安全注意事项

如果群集环境变量中的机密不应被群集上的所有用户访问,Databricks 不建议将机密存储在群集环境变量中。 引用 Spark 配置属性或环境变量中的机密时,请牢记以下安全隐患:

  • 对群集具有“可附加到”权限或对笔记本具有“运行”权限的任何用户可以从笔记本内读取群集环境变量。

  • 如果在群集上未启用表访问控制,则任何对群集具有附加权限或对笔记本具有运行权限的用户都可以从笔记本内读取 Spark 配置属性。 这包括没有读取机密的直接权限的用户。

  • Spark 驱动程序日志 stdoutstderr 流中的机密信息不会被编修。 为了保护敏感数据,默认情况下,Spark 驱动程序日志只能由对作业具有 CAN MANAGE 权限的用户、专用访问模式和标准访问模式群集查看。

    在“无隔离共享”访问模式群集上,具有“CAN ATTACH TO”或“CAN MANAGE”权限的用户可以查看 Spark 驱动程序日志。 若要限制只有具有“CAN MANAGE”权限的用户才能读取日志,请将 spark.databricks.acl.needAdminPermissionToViewLogs 设置为 true

Warning

不要将敏感值(如凭据、令牌或密钥)直接放入 Spark 配置属性或环境变量中作为纯文本。 将敏感值存储在机密范围内,并按上文所述引用该值。 有权访问群集、附加到它的笔记本或群集的驱动程序日志的任何人都可以读取 Spark 配置属性和环境变量中的纯文本值。

要求

下面的要求适用于在 Spark 配置属性和环境变量中引用机密:

  • 群集所有者需要具有机密范围内的“可读取”权限。
  • 必须是群集所有者,才能在 Spark 配置属性或环境变量中添加或编辑机密。
  • 如果某机密已更新,则必须重启群集才能再次提取该机密。
  • 必须对群集具有“可管理”权限才能删除机密 Spark 配置属性或环境变量。

使用 Spark 配置属性引用秘密

按以下格式指定 Spark 配置属性中对机密的引用:

spark.<property-name> {{secrets/<scope-name>/<secret-name>}}

替换为:

  • <scope-name> 替换为机密范围的名称。
  • <secret-name> 替换为范围中的机密的唯一名称。
  • <property-name> 替换为 Spark 配置属性

每个 Spark 配置属性只能引用一个机密,但可以配置多个 Spark 属性来引用机密。

例如:

spark.password {{secrets/scope1/key1}}

获取并使用笔记本中的密钥,请运行以下命令:

Python

spark.conf.get("spark.password")

SQL

SELECT ${spark.password};

引用环境变量中的机密

按以下格式指定环境变量中的机密路径:

<variable-name>={{secrets/<scope-name>/<secret-name>}}

引用机密时,可以使用任何有效的变量名称。 对环境变量中引用的机密的访问权限由配置群集的用户的权限确定。 尽管所有群集用户都可以访问存储在环境变量中的机密,但这些机密与其他机密引用一样,会从明文显示中被隐藏。

可以从集群范围的初始化脚本访问引用机密的环境变量。 请参阅通过初始化脚本设置和使用环境变量

例如:

设置环境变量以引用一个秘密:

SPARKPASSWORD={{secrets/scope1/key1}}

若要提取 init 脚本中的机密,请使用以下模式访问 $SPARKPASSWORD

if [ -n "$SPARKPASSWORD" ]; then
  # code to use ${SPARKPASSWORD}
fi