Unity Catalog 的权限模型概念

本页介绍 Unity 目录权限模型的核心概念,包括对象模型、特权、所有权和继承。

有关所有 Unity 目录权限的常规参考,请参阅 Unity 目录特权参考。 有关授予和撤消权限的说明,请参阅 “显示”、“授予”和“撤销权限”。

安全对象

在 Unity 目录中,数据和元数据位于称为元存储的顶级容器中。 在此元存储中,数据表示为三级命名空间中的对象: catalog.schema.table。此分层结构还为 Unity 目录中的访问控制提供了基础。

Unity 目录对象模型层次结构

此层次结构中的每个对象都是一个 安全对象。 在 Unity Catalog 中,访问控制通过对这些安全对象授予SELECTMODIFYUSE SCHEMA等权限来实现。 此模型可精细控制谁可以访问和管理组织中的数据。

完整的可被保护对象列表以及应用于每个对象的权限信息,请参阅 Unity Catalog privileges reference

容器对象

Unity 目录中的一些安全对象是 容器对象,这意味着它们包含层次结构中的子对象。 容器对象在权限模型中具有特殊角色,因为授予它们的权限可以通过继承影响其子对象。

以下是 Unity 目录中的容器对象:

  • 目录:三级命名空间的顶层。 目录包含作为直接子项的架构。
  • 架构:三级命名空间的中间级别。 架构包含表、视图、卷和函数作为直接子级。

容器对象具有几个重要特征:

特性 说明
特权继承 向容器对象授予权限时,该权限将自动应用于所有当前和将来的子对象。 例如,授予 SELECT 目录的权限可以允许用户读取该目录中所有的表(前提是拥有适当的使用权限)。 请参阅 权限继承
使用权限 访问子对象需要对父容器对象具有适当的 USE CATALOGUSE SCHEMA 特权。 请参阅 使用权限
能够管理子对象 拥有容器对象时,即使不直接拥有这些子对象,也可以自动管理所有子对象。 请参阅 所有权
创建权限 容器对象支持特权,允许用户在其中创建子对象,例如 CREATE SCHEMA 目录和 CREATE TABLE 架构上的子对象。

非容器对象(如表、视图、卷和函数)不包含子对象。

特权

特权确定了用户或组可以对安全对象执行的动作。 常见特权包括:

  • SELECT:从表或视图中读取数据
  • MODIFY:将数据写入表或视图
  • USE CATALOG:访问目录(需要其他权限才能使用子对象)
  • USE SCHEMA:访问架构(需要其他权限才能使用子对象)
  • CREATE TABLE:在架构中创建表

必须明确授予用户或组执行某个操作的权限。

以下各节介绍Azure Databricks中的重要特殊特权。 有关所有权限的完整参考,请参阅 Unity Catalog 权限参考

使用权限

USE CATALOGUSE SCHEMA 是使用权限。 通常,使用特权是与层次结构中的对象及其子对象交互的先决条件。

要处理目录中的任何对象,你需要 USE CATALOG 对目录拥有权限;而要处理模式中的任何对象,也需要对 USE SCHEMA 模式拥有权限。 以 MANAGE 权限管理对象属于例外情况,对使用权限的要求较低。 请参阅 MANAGE 的使用权限要求

例如,若要对表、视图、卷或函数执行大多数操作,需要:

  1. USE CATALOG 于父目录中
  2. USE SCHEMA 父架构上的
  3. 操作的特定特权(例如 SELECTMODIFYEXECUTE

这三个都是必需的。 仅拥有SELECT权限不足以读取表,如果缺少其父对象上的USE CATALOGUSE SCHEMA权限。

使用特权为高级管理员提供重要的访问控制机制。 例如,即使表所有者想要与其他用户共享其表,这些用户在没有父对象上的USE CATALOGUSE SCHEMA 权限时,也无法访问该表。 由于只有具有该权限的 MANAGE 目录和架构所有者或用户才能授予这些使用权限,因此这可以防止表所有者在批准的边界之外授予访问权限。

MANAGE 的使用权限要求

MANAGE 特权对使用特权的要求较低。 要行使 MANAGE,你不需要在授予 MANAGE 的层级拥有 usage 权限:对目录授予 MANAGE 不需要对该目录授予 USE CATALOG,对架构授予 MANAGE 不需要对该架构授予 USE SCHEMA。 你只需要在严格高于你持有 MANAGE 的层级之上的容器层级中拥有使用权限,而不需要在该层级或更低层级拥有该权限。 在每个更高层级中,你都可以通过 USE CATALOGUSE SCHEMA,或者通过所有权或 MANAGE 来满足该要求。 因为容器上的 MANAGE 会被其所有子对象继承,所以只要在较高层级拥有 MANAGE,就不需要在其下层再具有使用权限。 例如:

  • 对目录执行 MANAGE 无需使用权限。 你可以管理目录及其中的任何模式、表或其他对象,无需 USE CATALOGUSE SCHEMA
  • MANAGE 在模式上要求在父目录上具有 USE CATALOG 权限(或者拥有该目录的所有权,或在该目录上具有 MANAGE 权限),但不要求在该模式上具有 USE SCHEMA 权限。
  • 对非容器对象(如表、视图、卷或函数)执行 MANAGE,需要对父目录具有 USE CATALOG 权限,并对父架构具有 USE SCHEMA 权限(或者拥有任一父级对象的所有权,或其上的 MANAGE 权限)。

这种缩减仅适用于由 MANAGE 以及 MANAGE 的任何子权限(如 READ METADATA)所提供的元数据功能。 SELECTMODIFY 等数据访问权限仍然需要 USE CATALOGUSE SCHEMA,即使对于具有 MANAGE 的用户也是如此。 有关 MANAGE 允许执行哪些操作的详细信息,请参阅MANAGE 特权

下表显示了常见操作及其所需权限:

运算 所需权限
从表或视图中读取数据 USE CATALOG 在目录上、USE SCHEMA 在架构上、SELECT 在表或视图上
将数据写入表 USE CATALOG 在目录上, USE SCHEMA 在架构上, MODIFY 在表上
在目录中创建架构 USE CATALOG 在目录中,CREATE SCHEMA 在目录中
在架构中创建表 USE CATALOG 在目录上、 USE SCHEMA 架构上、 CREATE TABLE 架构上(或目录上,如果授予目录级别)
执行函数 USE CATALOG 在目录上,USE SCHEMA 在模式上,EXECUTE 在函数上
从卷读取文件 USE CATALOG 有目录访问权限、USE SCHEMA 有架构访问权限、READ VOLUME 有卷访问权限
管理目录(授予权限、转让所有权、取消) MANAGE 在目录上(无需使用权限)
管理架构(授予权限、转移所有权、丢弃) USE CATALOG 在目录上,MANAGE 在架构上
管理表、视图、卷或函数(授予权限、转让所有权、删除) USE CATALOG 在目录上,USE SCHEMA 在架构上,MANAGE 在对象上

ALL PRIVILEGES 行为

ALL PRIVILEGES 表示 特定对象类型的所有适用权限,而无需 Azure Databricks 显式授予每个单独权限。 例如:

  • ALL PRIVILEGES 表上意味着能够执行 SELECTMODIFY以及 APPLY TAG
  • ALL PRIVILEGES 在卷上意味着能够执行 READ VOLUMEWRITE VOLUMEAPPLY TAG
  • ALL PRIVILEGES 表示架构上的所有架构级特权。
  • ALL PRIVILEGES 在目录上意味着所有目录级权限。

ALL PRIVILEGES 不包括 EXTERNAL USE SCHEMAEXTERNAL USE LOCATIONMANAGEREAD METADATA 权限。

有关如何评估和撤销的更多详细信息 ALL PRIVILEGES ,请参阅 “所有特权”。

特权MANAGE

MANAGE 权限允许用户管理权限、转移所有权和删除对象,而无需所有者。 拥有 MANAGE 类似于所有权,但存在一些重要的差异。 请参阅 所有权与 MANAGE 特权

要行使 MANAGE,用户需要在被 MANAGE 授予的对象之上方的父容器上获得适当的使用权限,但对该对象本身则不行使。 例如, MANAGE 在目录中完全不需要使用权限。 完整详情请参见 MANAGE使用权限要求

如果授予 MANAGE 权限到一个容器对象,用户也会获得对所有子对象的 MANAGE 权限。

有关完整详细信息,请参阅 “管理”。

特权BROWSE

BROWSE 允许用户在不授予对基础数据的访问权限的情况下发现对象并查看其元数据。 用户BROWSE可以看到某个对象存在、查看其名称、描述和标记,并请求访问该对象,而无需USE CATALOGUSE SCHEMA

BROWSE 在目录级别授予,并应用于该目录中的所有对象。 Databricks 建议向 BROWSE 组授予 All account users 目录,以便在整个组织中使数据可被发现。

有关完整详细信息,请参阅 BROWSE

组合权限和子权限

有些特权通过复合子女关系相互关联。 复合特权赋予广泛的能力,子特权则赋予其中一部分能力。 子权限允许你委托部分复合权限的访问权限,而无需授予完整的复合权限。

MANAGE 是一个复合特权,且 READ METADATA 是其子:

  • MANAGE 授予对对象的完全控制权,包括修改对象、转移所有权、管理授权以及查看其所有元数据的能力。
  • READ METADATA 它允许对相同的元数据进行只读可见,如权限、行筛选、列掩码和ABAC策略,而无需修改对象或读取其数据。

MANAGEREAD METADATA都不包含在ALL PRIVILEGES中。 每一项都必须明确授予。 参见 ALL PRIVILEGES 行为

综合和儿童特权的授予和撤销是独立的。 撤销复合权限不会撤销任何被显式授予的子权限。 例如,如果某个主体在一个对象上同时被授予 MANAGEREAD METADATA 权限,撤销 MANAGE 不会撤销 READ METADATA,并且该主体仍保留对该对象元数据的只读访问权限。

有关 READ METADATA 的完整详细信息,包括其适用的角色及其继承行为,请参阅 读取元数据

所有权

Unity Catalog 中的每个安全对象都有一个所有者。 所有者可以是用户、服务主体或组。 创建对象的主体将成为其初始所有者。

所有权在 Unity 目录中具有特殊表示。 对象所有者可以自动对其拥有的对象执行所有功能。 但是,Azure Databricks不会向所有者显式授予 ALL PRIVILEGES 权限。 这意味着在使用 Databricks API 或使用ALL PRIVILEGES列出权限时,不会返回SHOW GRANTS

所有权不会在 Unity 目录中向下继承。 但是,对象所有者自动能够管理所有子对象。 例如,如果你拥有目录,则不会自动拥有目录中的子架构,但你可以管理所有子架构。 与所有者在其对象上具有所有功能而不显式拥有 ALL PRIVILEGES 类似,在这种情况下,Azure Databricks也不会显式授予 MANAGE 特权。

对象所有者可以对对象执行其他重要作,包括授予和撤消权限、转让所有权和删除对象。

注释

为了避免意外数据外泄,架构所有者默认不具有 EXTERNAL USE SCHEMA 权限,外部位置所有者默认不具有 EXTERNAL USE LOCATION 该权限。 请参阅启用对 Unity Catalog 数据的外部访问

总之,对象的所有者可以执行以下作:

能力 说明
所有对象功能 所有者自动拥有其拥有的对象上的所有功能。 这在功能上与具有 ALL PRIVILEGES 相同,但Azure Databricks不会向所有者显式分配 ALL PRIVILEGES
管理子对象 所有者会自动获得管理所有子对象的能力。 这在功能上与对所有子对象具有 MANAGE 特权相同,但Azure Databricks不会向所有者显式分配 MANAGE 特权。
授予和撤销权限 所有者可以向用户和组授予和撤销对对象的权限
转让所有权 所有者可以将其对象的所有权转让给另一主体
删除对象 所有者可以删除他们拥有的对象

有关如何查看和转移所有权的信息,请参阅 “管理对象所有权”。

所有权与 MANAGE 特权

MANAGE 权限授予用户授予对对象授予和撤销权限的能力。 它不会向用户授予对对象的所有权限。 但是,拥有 MANAGE 的用户可以显式授予自己的数据访问权限,例如 SELECT

相比之下,默认情况下,对象所有者在其对象上具有所有功能。 由于所有权不会向下继承到子对象,因此所有者仍需要对这些子对象进行显式授予。

使用权限要求对两者相同:拥有者和拥有 MANAGE 者的用户需要对对象的父容器拥有适当的使用权限,而不需要对对象本身拥有相应的使用权限。 请参阅 MANAGE 的使用权限要求

下表总结了所有权和 MANAGE 特权之间的主要差异:

能力 Owner MANAGE 权限
对象上的所有功能 是的,所有功能都 隐含。 这与显式拥有 ALL PRIVILEGES不同。 请参阅 所有权 否,必须单独授予特权。 拥有权限 MANAGE 的用户可以授予自己这些权限。
授予和撤销对象的权限 是的 是的
转让所有权 是的 是的
删除对象 是的 是的
能够管理子对象 是的,子对象的管理功能是隐含的。 请参阅 所有权 是的,对 MANAGE 子对象显式授予特权。
需要使用权限 需要对对象上方 MANAGE 的父容器赋予适当的使用权限,但对对象本身则不要求。 对目录执行 MANAGE 无需使用权限。
主体数 只有一个主体(用户、服务主体或组) 可向多个主体授予

为了避免意外提升权限,特权 ALL PRIVILEGES 不包括 MANAGE 特权。

特权继承

注释

如果在公共预览期间(2022 年 8 月 25 日之前)创建了 Unity Catalog 元存储,则可能使用的是不支持当前继承模型的更早版本特权模型。 可以升级到权限模型版本 1.0 来获得权限继承。 请参阅 “升级到特权继承”。

特权继承是 Unity 目录权限模型的关键功能。 向父对象授予权限时,该权限将自动应用于所有当前和将来的子对象。 这通过减少您需要授予的权限数量,使访问管理变得更加简化。

特权通过对象模型层次结构向下继承:

  • 对目录授予的特权适用于该目录中的所有架构,以及这些架构中的所有表、视图、卷和函数
  • 对架构授予的特权适用于该架构中的所有表、视图、卷和函数

例如,如果向用户授予 SELECT 对目录的权限,则该用户可以读取该目录中的所有表和视图(具有适当的 USE CATALOG 和使用 USE SCHEMA 权限)。

重要

在元存储上授予的权限不会自动继承到子对象。 元存储级别的授权控制诸如CREATE CATALOGCREATE EXTERNAL LOCATION等元存储范围内的操作,但不包括访问元存储中的数据。

READ METADATA 特权是一个例外。 在元存储中获得后, READ METADATA 会继承到元存储中的所有对象,且行使该权限无需使用权限(USE CATALOGUSE SCHEMA)。 参见 READ METADATA

所有权不会在 Unity 目录中向下继承。 作为对象的所有者,你会自动获得该对象的所有权限。 你不会自动假定在对象下创建的子对象的所有权。 但是,你会自动获得新建和已有的所有子对象的 MANAGE 特权。

继承示例

假设你在目录级别向SELECT组授予USE CATALOGUSE SCHEMAfinance_team

GRANT USE CATALOG, USE SCHEMA, SELECT ON CATALOG sales TO finance_team;

授予此权限,以允许 finance_team 组:

  • 访问sales目录
  • 访问目录中的所有架构
  • 从目录中所有当前和将来的表和视图读取数据

假设你在目录级别向CREATE TABLE组授予USE CATALOGUSE SCHEMAdata_engineers

GRANT USE CATALOG, USE SCHEMA, CREATE TABLE ON CATALOG analytics TO data_engineers;

授予此权限,以允许 data_engineers 组:

  • 访问analytics目录
  • 访问目录中的所有架构
  • 在目录中的任何当前架构或将来架构中创建表

有关如何授予和撤销权限的说明,请参阅 “显示”、“授予”和“撤销权限”。