何时使用 ABAC 与表级行筛选器和列掩码

Unity 目录支持两种行级别和列级安全性的方法: ABAC 策略表级行筛选器和列掩码。 这两种方法都不能自行授予对数据的访问权限, 这两种方法都增加了对现有对象级特权的限制。 必须通过对象级权限GRANT()单独授予基表访问权限。

核心区别在于定义限制的位置。 表级行筛选器和列掩码直接在各个表上使用ALTER TABLE应用敏感性控制。 表所有者无需使用受管理的标签系统即可管理自己的数据保护。 对于少量表而言,这非常简单,但必须单独配置每个表,表所有者可以修改或删除其自己的筛选器和掩码。

ABAC 策略 应用于目录、模式或表级别,并根据管理标签动态匹配表和列。 在目录级别定义的策略适用于该目录中的所有表,并且单个表所有者无法删除、修改或绕过该表。 该策略位于目录上,并在查询到达运行时之前由 Unity 目录进行评估。 这样,高级管理员就可以强制实施组织范围的规则,并确保较低级别的管理员和所有者无法规避这些规则。

详细比较摘要

下表总结了 ABAC 策略与表级行筛选器和列掩码之间的差异。

注意事项 ABAC 策略 表级行筛选器和列掩码
SQL 语法 CREATE POLICY ... ON CATALOG/SCHEMA/TABLE ALTER TABLE ... SET ROW FILTER / ALTER TABLE ... ALTER COLUMN ... SET MASK
Scope 策略范围(目录、架构或表)及其后代中的所有表。 新的标记表将被自动包含。 配置筛选器或掩码的单个表。 必须单独配置每个表。
动态匹配 表和列是根据受治理的标签使用has_tag()has_tag_value()进行动态匹配的。 无动态匹配。 筛选器和掩码绑定到特定的表和列。
目标主体 TO / EXCEPT 策略定义中的子句,除了 UDF 中的标识函数。 在 UDF 中,current_user() 如同标识函数。
策略治理 策略可由目录或架构所有者设置。 在较高级别设置后,表所有者无法重写、修改或删除它们。 由表所有者管理,他们可以在其自己的表上修改或删除筛选器和掩码。
不支持的功能 时间旅行、克隆和 OpenSharing 等操作可由子句中的 EXCEPT 主体运行。 请参阅 “失效关闭”设计 EXCEPT 子句,因此不支持的功能仍然对受保护的表不可用。
有效策略 SHOW EFFECTIVE POLICIES 查看应用于给定表和用户的策略。 在表定义中直接可见。
可审核性 DESCRIBE POLICYSHOW POLICIES 验证策略定义。 INFORMATION_SCHEMA.ROW_FILTERSINFORMATION_SCHEMA.COLUMN_MASKS

通常,在以下情况下使用 ABAC 策略

  • 需要跨多个表、架构或目录的一致访问规则。
  • 你的组织将职责分开。 例如,策略作者定义规则,数据专员使用标记对数据进行分类。
  • 您的数据资产正在增长,并且希望在标记新表时能够自动覆盖这些表。
  • 需要使用 EXCEPT 子句,才能允许针对特定主体执行时间旅行、OpenSharing 或完整查询优化等操作。

通常,在以下情况下使用 表级行筛选器和列掩码

  • 每个表都具有不通用到其他表的严格特定逻辑。
  • 表所有者应直接管理自己的筛选器和掩码,而无需集中标记系统。
  • 你有一组较小的稳定表,这些表不经常更改。

合并 ABAC 和表级行筛选器和列掩码

ABAC 和表级行筛选器和列掩码可以共存于同一表中。 在查询时,会根据以下规则对查询用户单独评估策略:

  • 只能应用一个特定的行筛选器。
  • 每列只能解析一个唯一的列掩码。

Azure Databricks通过比较应用的函数而不是数据输出来评估冲突。 如果 ABAC 策略和表级筛选器或掩码对同一用户应用相同的行筛选器或列掩码函数,Azure Databricks允许执行。 如果应用不同的函数,Azure Databricks会阻止访问并返回错误,即使这些函数生成相同的数据输出也是如此。

有关冲突解决和故障排除的详细信息,请参阅 多个筛选器和掩码的规则

通过动态视图实现行级和列级安全性

动态视图 还可以通过将标识函数(如 current_user() 直接 is_account_group_member() 嵌入视图定义)来实现行级和列级安全性。 动态视图、行筛选器和列掩码都会在查询时应用筛选或转换逻辑,但它们在管理、作用域和向用户公开的方式上有所不同。

Feature 适用对象 管理方式 最适合用于
动态视图 视图 视图定义中的 SQL 逻辑 跨多个源表的细粒度访问控制,或重构数据以便共享。
行筛选器和列掩码 表格和字段 ABAC 策略或表级分配 行级和列级访问控制,无需引入新对象

如果需要跨多个源表的精细访问控制或重塑数据进行共享,请使用动态视图。 如果要控制单个表的访问而不引入新对象,请使用行筛选器和列掩码。

例如,动态视图可以屏蔽非审核员的电子邮件列:

CREATE VIEW sales_redacted AS
SELECT
  user_id,
  CASE
    WHEN is_account_group_member('auditors') THEN email
    ELSE regexp_extract(email, '^.*@(.*)$', 1)
  END AS email,
  country,
  product,
  total
FROM sales_raw

动态视图完全支持查询优化和谓词下推,因此它们可提供比行筛选器和列掩码更好的查询性能。 他们还阻止用户修改基础表。

但是,动态视图对数据管理有两个缺点:

  • 有限的审核:动态视图缺少语义元数据,例如系统表中的标记或策略定义,这使得它们难以大规模审核。
  • 探测漏洞:由于它们缺乏SecureView屏障,因此无法抵御探测攻击,其中用户会设计一个具有副作用的谓词来推断有关被筛选行的信息。 请参阅 了解受保护表的谓词下推