基于属性的跨引擎访问控制 (ABAC)

Important

跨引擎 ABAC 处于 Beta 阶段

外部引擎可以使用强制实施的 基于属性的访问控制(ABAC) 策略读取 Unity 目录表。 这允许应用动态强制实施的 ABAC 行筛选器和列掩码,即使从外部Azure Databricks进行查询也是如此。

当外部引擎查询应用了 ABAC 策略的表时,Azure Databricks 会使用专用的无服务器计算层对数据进行筛选,并将净化后的数据返回给外部引擎。

Requirements

若要对从外部引擎查询的表强制实施精细访问控制,必须完成以下操作:

创建包含目录提交的托管 Delta 表

若要使用目录提交功能创建新的托管 Delta 表(需要 Databricks Runtime 16.4 及以上版本):

CREATE TABLE <catalog>.<schema>.<table> (id INT, name STRING)
TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported') USING delta;

若要升级现有托管表(需要 Databricks Runtime 18.0 及更高版本):

ALTER TABLE <catalog>.<schema>.<table>
SET TBLPROPERTIES ('delta.feature.catalogManaged' = 'supported');

创建表后,可以应用 ABAC 策略、行筛选器或列掩码。

请参阅 “创建策略 ”或 “手动应用行筛选器”和“列掩码”。

使用 Apache Spark(Delta)读取表数据

使用 Delta-Spark 4.1 或更高版本Unity 目录 Spark 连接器 0.4 或更高版本配置 Apache Spark。

"spark.sql.extensions": "io.delta.sql.DeltaSparkSessionExtension",
"spark.sql.catalog.spark_catalog": "io.unitycatalog.spark.UCSingleCatalog",
"spark.sql.catalog.<uc-catalog-name>": "io.unitycatalog.spark.UCSingleCatalog",
"spark.sql.catalog.<uc-catalog-name>.uri": "<workspace-url>",
"spark.sql.catalog.<uc-catalog-name>.auth.type": "oauth",
"spark.sql.catalog.<uc-catalog-name>.auth.oauth.uri": "<oauth-token-endpoint>",
"spark.sql.catalog.<uc-catalog-name>.auth.oauth.clientId": "<oauth-client-id>",
"spark.sql.catalog.<uc-catalog-name>.auth.oauth.clientSecret": "<oauth-client-secret>",
"spark.sql.catalog.<uc-catalog-name>.ServerSidePlanning.enabled": "true",
"spark.sql.defaultCatalog": "<uc-catalog-name>",
"spark.jars.packages": "io.delta:delta-spark_4.0_2.13:4.1.0,io.delta:delta-iceberg_2.13:4.1.0,io.unitycatalog:unitycatalog-spark_2.13:0.4.0,org.apache.hadoop:hadoop-azure:3.4.2"

注释

ServerSidePlanning.enabled 设置为 true,以启用由外部引擎执行的细粒度访问控制。

替换以下变量:

  • <uc-catalog-name>:Unity Catalog 中包含你的表的目录名称。
  • <workspace-url>:Azure Databricks 工作区 URL,包括工作区 ID。
  • <oauth-token-endpoint>:OAuth 令牌终结点 URL。 请参阅 使用 OAuth 授权服务主体访问 Azure Databricks
  • <oauth-client-id>:身份验证主体的 OAuth 客户端 ID。
  • <oauth-client-secret>:身份验证主体的 OAuth 客户端密码。

使用 Apache Spark(Iceberg)读取表

使用 Iceberg-Spark 1.11 或更高版本 和 Apache Spark 4.0 或更高版本配置 Apache Spark。

"spark.sql.extensions": "org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions",
"spark.sql.catalog.<uc-catalog-name>": "org.apache.iceberg.spark.SparkCatalog",
"spark.sql.catalog.<uc-catalog-name>.type": "rest",
"spark.sql.catalog.<uc-catalog-name>.uri": "<workspace-url>/api/2.1/unity-catalog/iceberg-rest/",
"spark.sql.catalog.<uc-catalog-name>.credential": "<oauth-client-id>:<oauth-client-secret>",
"spark.sql.catalog.<uc-catalog-name>.oauth2-server-uri": "<oauth-token-endpoint>",
"spark.sql.catalog.<uc-catalog-name>.warehouse": "<uc-catalog-name>",
"spark.sql.catalog.<uc-catalog-name>.cache-enabled": "false",
"spark.sql.defaultCatalog": "<uc-catalog-name>"

替换以下变量:

  • <uc-catalog-name>:Unity Catalog 中包含你的表的目录名称。
  • <workspace-url>:Azure Databricks 工作区 URL,包括工作区 ID。
  • <oauth-token-endpoint>:OAuth 令牌终结点 URL。 请参阅 使用 OAuth 授权服务主体访问 Azure Databricks
  • <oauth-client-id>:身份验证主体的 OAuth 客户端 ID。
  • <oauth-client-secret>:身份验证主体的 OAuth 客户端密码。

查询数据

可以使用 Apache Spark SQL 或 DataFrame API 查询表。 Azure Databricks在后台强制实施精细访问策略。

SELECT * FROM <uc-catalog-name>.<schema>.<table>;

Warning

在查询规划期间,并发写入可能导致在自连接查询和多次扫描查询中,同一张表从不同的表快照中被读取,从而可能导致结果不正确。

无服务器计算成本

跨引擎 ABAC 使用无服务器计算资源在服务器端执行细粒度访问策略。 客户需要为这些资源付费。 有关定价信息,请参阅 Beta 产品定价

有权访问计费系统表的用户可以查询 system.billing.usage 以查看已收取的费用。 例如,以下查询按用户细分计算成本:

SELECT usage_date,
sku_name,
 identity_metadata.run_as,
SUM(usage_quantity) AS `DBUs consumed by cross-engine ABAC`
FROM system.billing.usage
WHERE usage_date BETWEEN '2026-06-01' AND '2026-07-01'
 AND billing_origin_product = 'EXTERNAL_COMPATIBILITY'
GROUP BY 1, 2, 3 ORDER BY 1;

局限性

  • 仅当强制实施精细访问控制(FGAC)时,外部引擎才支持读取。 若要进行写入,必须将写入主体排除在 ABAC 策略之外。
  • 不支持动态视图。
  • 不支持对 VARIANT 列进行投影。
  • 不支持对 BINARY 列进行筛选。
  • 不支持其返回类型不同于原始列类型的列掩码函数。
  • 大型聚合可能会遇到性能下降的情况。