对 OneLake 安全性的 Spark 支持(RLS 和 CLS)

Fabric Spark 与 OneLake 安全性集成,以便当用户从 Spark 笔记本和 Spark 作业定义读取 Lakehouse Delta 表时,在 OneLake 中定义的一次行级安全性(RLS)和列级安全性(CLS)策略始终强制实施。 用户继续编写标准 Spark SQL 或 DataFrame 查询;Spark 以透明方式筛选结果,以便每个用户只看到他们有权访问的行和列。

本文介绍 Spark 如何 与 OneLake 安全性配合使用,包括强制体系结构、数据准备流、用户体验和支持的方案和限制。

注释

有关策略创作和跨引擎模型,请参阅 OneLake 中的行级别安全性 以及 OneLake 中的列级安全性

概念一目了然

  • 单一事实来源。 RLS 规则和 CLS 列列表通过 OneLake 安全角色在 Lakehouse 中一次性定义。 Spark 不存储或复制策略。
  • 与引擎无关的有效访问。 OneLake 返回请求用户的预计算 有效访问权限 ,包括允许的列和 RLS 行筛选器元数据。 Spark 在查询时使用该有效访问。
  • 增量过滤器。 OneLake 和 Fabric 平台层仅将 RLS 和 CLS 应用于 Delta parquet 表。 有规则应用的非Delta对象是由平台阻止的,而不是由Spark进行过滤。
  • 特权角色绕过。 作为 OneLake 和Fabric平台行为,工作区 AdminMemberContributor 角色不受 RLS 或 CLS 的限制。 筛选适用于 查看器 和通过 OneLake 安全角色授予访问权限的用户。

Spark 如何实施 OneLake 安全性

当用户提交涉及安全 Lakehouse 表的查询时,Spark 将准备一个执行计划,该计划将用户的查询与该用户的 OneLake 安全有效访问相结合。 约束在执行期间进行,而不是在用户代码中的筛选后步骤中进行,因此不能被替代 API 或基于路径的读取绕过。

双上下文执行模型

Fabric Spark 使用两个执行上下文来使策略评估与用户代码隔离:

  • 用户上下文。 使用用户的标识运行用户的笔记本或 Spark 作业定义。 此上下文计划查询并使用筛选的输出,但它从未直接、未经筛选地访问受保护的表。
  • 系统(安全)上下文。 一个特权的、由 Microsoft 管理的上下文,用于解决用户对 OneLake 的有效访问权限,读取底层 Delta 文件,应用 RLS 行筛选与 CLS 投影,并仅返回用户被允许查看的行和列。

系统上下文在监控中心中显示为与用户笔记本会话同时运行的作业。 作业名称和监控经验Fabric平台的行为。 这些作业是预期的并且表明 OneLake 安全措施正在发挥作用。

安全表的查询流

  1. 例如, SELECT * FROM lakehouse.sales用户在 Spark 笔记本中运行查询。
  2. Spark 通过 Lakehouse 目录解析表,并检测已启用 OneLake 安全性。
  3. Spark 向 OneLake 请求当前用户的有效访问。 响应包括允许的列列表(CLS)和 RLS 行筛选器元数据。
  4. 系统安全上下文读取 Delta 文件、仅投影允许的列,并在执行过程中使用位图样式或删除向量样式行筛选应用 RLS。
  5. 筛选的结果传递给用户上下文环境,该环境完成用户查询的其他部分操作(例如,在已筛选数据上执行联接、聚合,并写入到非安全目标等)。

每个策略类型会发生什么情况

Policy Spark 返回的内容 备注
仅限 RLS 所有列,但仅限于 RLS 规则允许的行。 使用位图模式或删除向量模式筛选在安全上下文中强制实施行筛选, 用户无法观察筛选器逻辑。
仅限 CLS 仅允许的列,显示所有行。 SELECT * 当至少有一列被允许时,将成功并返回允许的列。 如果不允许任何列,Spark 会导致查询失败。
同一角色中的 RLS 与 CLS 允许行投影到允许列。 只要这两个规则属于 同一 角色,就受支持。
角色 A 中的 RLS、角色 B 中的 CLS(同一用户) 查询失败。 OneLake 和 Fabric 平台层不支持用户是两个角色的成员,其中一个角色定义 RLS,另一个角色定义 CLS。 请参阅行级别安全性和列级安全性
非 Delta 对象 访问被阻止。 OneLake 和 Fabric 平台层仅将 RLS 和 CLS 应用于 Delta parquet 表;安全角色中的其他对象将被限制。

有关规范创作规则和 RLS 表达式语法,请参阅行级安全性和列级安全文章。

Spark 如何为用户准备数据

OneLake 安全性旨在对数据使用者透明。 用户继续使用他们已经知道的 API,Spark 代表他们处理策略解析和筛选。

Spark SQL

-- Returns only rows and columns the current user is authorized to see.
SELECT product_category, SUM(amount) AS total
FROM sales.transactions
GROUP BY product_category;

PySpark 数据帧

df = spark.read.table("sales.transactions")
df.filter("region = 'EMEA'").groupBy("product_category").sum("amount").show()

在这两个示例中, transactions 加载到 DataFrame 中的表格数据已按 OneLake 安全性进行筛选。 后续转换仅对已筛选的数据进行操作。

直接文件访问被阻止

直接路径访问绕过 Lakehouse 目录策略解析。 当在表上启用 OneLake 安全性时,OneLake 和 Fabric 平台层会阻止非特权用户的以下访问模式:

  • spark.read.format("delta").load("abfss://...")
  • DeltaTable.forPath(spark, "abfss://...")
  • OneLake REST/SDK 访问 Tables/<table> 目录中的安全表。

用户必须通过 Lakehouse 表名称(例如 spark.read.table("lakehouse.table") Spark SQL)访问受保护的表,以便 Spark 能够解析并应用有效的访问。

用户体验

  • 透明筛选。 不需要查询重写或特殊语法。 同一笔记本适用于具有不同角色的用户,并返回特定于角色的数据。
  • 跨引擎的结果一致。 在 Spark 中应用的同一 RLS 规则和 CLS 投影也会应用于 SQL 分析终结点、基于 Direct Lake 构建的语义模型以及授权的第三方引擎。 请参阅 OneLake 安全集成概述
  • 特权角色可查看所有内容。 作为 OneLake 和 Fabric 平台的行为表现,工作区 AdminMemberContributor 用户可以继续查看未筛选的数据,这对于管道开发、表维护(OPTIMIZEVACUUM)和故障排除非常有用。
  • 监测。 显示在 SparkSecurityControl 监控中心的任务对应于执行策略强制的系统环境。 作业名称和监视中心条目是Fabric平台操作的一部分。

屏幕截图占位符:监视中心,其中显示了 SparkSecurityControl 作业以及用户的笔记本会话。

性能注意事项

  • RLS 行筛选。 RLS 通过在接近 Delta 扫描的地方,使用位图样式或删除向量样式的筛选方法,以及(在支持的情况下)本机执行引擎来实现。 此设计最大程度地减少了在用户上下文中显现的行。
  • 列修剪。 CLS 列列表与用户的投影相结合。 仅从 Delta 存储读取交集。
  • 有效的访问缓存。 Spark 缓存每个查询的策略和有效访问元数据,并在查询执行停止时对其进行清理。
  • 分区和统计信息的使用。 标准 Delta 分区修剪和数据跳过继续应用于 RLS 行筛选,因此针对已分区表的查询效率仍然较高。

支持的场景

  • 通过 Lakehouse 目录读取 Spark 笔记本中的 Lakehouse Delta 表和 Spark 作业定义(<lakehouse>.<table>)。
  • 针对安全表的 Spark SQL 和 PySpark/Scala DataFrame API。
  • 在安全表上进行连接、聚合和下游转换。
  • 从安全的源写入到非安全输出。 在安全的数据湖屋之外写入的输出表只包含写入用户有权限读取的已过滤数据。
  • 跨工作区 Lakehouse 通过快捷方式进行访问,其中源 Lakehouse 启用了 OneLake 安全性。

限制

Spark 中的 OneLake 安全 RLS 和 CLS 继承 了整体 OneLake 安全限制。 值得注意的行为和限制包括:

  • Spark RLS/CLS 实现不支持服务主体;仅针对行和列级安全策略评估用户标识。 运行具有工作区标识的笔记本不会为工作区标识本身强制实施 RLS/CLS,而仅适用于在笔记本上下文中执行查询的单个用户。
  • OneLake 和 Fabric 平台层中的 RLS 和 CLS 仅适用于 Delta parquet 表。 安全角色中的非 Delta 对象将被阻止。
  • OneLake 和 Fabric 平台层阻止针对非特权用户的安全表的直接路径读取(abfss://DeltaTable.forPath)。
  • OneLake 和 Fabric 平台层不支持用户同时是两个角色的成员,并且这两个角色中,一个为受影响的表定义了 RLS,另一个定义了 CLS。
  • 在 OneLake 和 Fabric 平台的机制中,工作区 AdminMemberContributor 角色会绕过 RLS 和 CLS。
  • 支持对来自受保护源的非安全输出进行写入,并针对已筛选的数据进行操作。 对于受 RLS 或 CLS 约束的用户,可能无法将插入、更新、删除、合并操作写入安全目标,应使用特权标识将 ETL 操作写入安全表。