Hive 元存储特权和安全对象(旧版)

本文介绍内置于每个 Azure Databricks 工作区中的旧版 Azure Databricks Hive 元存储的特权模型。 本文还将介绍如何授予、拒绝和撤销对内置 Hive 元存储中对象的特权。 Unity Catalog 使用不同的模型来授予权限。 请参阅 Unity Catalog 特权和安全对象

注意

Hive 元存储管理的数据的表访问控制是一种旧数据治理模型。 Databricks 建议你将 Hive 元存储管理的表升级到 Unity Catalog 元存储。 Unity Catalog 提供一个集中位置来管理和审核帐户中多个工作区的数据访问,从而简化了数据的安全性和治理。 若要详细了解旧版特权模型与 Unity Catalog 特权模型的不同之处,请参阅使用 Unity Catalog 和旧版 Hive 元存储

要求

注意

  • 即使工作区未启用表访问控制,Databricks SQL 中的数据访问控制也始终处于启用状态。
  • 如果为工作区启用了表访问控制,并且已在工作区中指定了 ACL(授予和拒绝特权),则 Databricks SQL 中将遵循这些 ACL。

管理对 Hive 元存储中对象的特权

对 Hive 元存储管理的数据对象的特权可以由工作区管理员或对象所有者授予。 可以使用 SQL 命令管理对 Hive 元存储对象的特权。

若要管理 SQL 中的特权,可以在笔记本或 Databricks SQL 查询编辑器中使用 GRANTREVOKEDENYMSCKSHOW GRANTS 语句,语法如下:

GRANT privilege_type ON securable_object TO principal

其中:

若要向工作区中的所有用户授予权限,请向 users 组授予权限。 例如:

GRANT SELECT ON TABLE <schema-name>.<table-name> TO users

有关使用 SQL 命令管理对 Hive 元存储中对象的特权的详细信息,请参阅 Hive 元存储中的特权和安全对象

你也可以使用 Databricks Terraform 提供程序databricks_sql_permissions 在全自动设置中管理表访问控制。

对象所有权

在群集或 SQL 仓库上启用表访问控制后,创建架构、表、视图或函数的用户将成为其所有者。 所有者被授予所有权限,并且可以向其他用户授予权限。

组可能拥有对象,在这种情况下,该组的所有成员都会被视为所有者。

对象所有者或工作区管理员可以使用以下命令转移对象的所有权:

ALTER <object> OWNER TO `<user-name>@<user-domain>.com`

注意

如果在群集或 SQL 仓库上禁用了表访问控制,则在创建架构、表或视图时不会注册所有者。 工作区管理员必须使用 ALTER <object> OWNER TO 命令为对象分配所有者。

Hive 元存储中的安全对象

安全对象包括:

  • CATALOG:控制对整个数据目录的访问。

    • SCHEMA:控制对架构的访问。
      • TABLE:控制对托管表或外部表的访问。
      • VIEW:控制对 SQL 视图的访问。
      • FUNCTION:控制对命名函数的访问。
  • ANONYMOUS FUNCTION:控制对ANONYMOUS FUNCTION的访问。

    注意

    Databricks SQL 不支持 ANONYMOUS FUNCTION 对象。

  • ANY FILE:控制对基础文件系统的访问。

    警告

    获得了对 ANY FILE 的访问权限的用户可以绕过在目录、架构、表和视图上施加的限制,直接从文件系统读取内容。

注意

不支持对全局和本地临时视图的权限。 本地临时视图仅在同一会话中可见,在 global_temp 架构中创建的视图对共享某个群集或 SQL 仓库的所有用户可见。 但是,会强制执行对任何临时视图所引用的基础表和视图的权限。

可以授予的对 Hive 元存储对象的特权

  • SELECT:授予对对象的只读访问权限。
  • CREATE:提供创建对象(例如架构中的表)的功能。
  • MODIFY:提供在对象中添加、删除和修改数据的功能。
  • USAGE:不提供任何功能,只是对在架构对象上执行任何操作的一个附加要求。
  • READ_METADATA:提供查看对象及其元数据的功能。
  • CREATE_NAMED_FUNCTION:提供在现有目录或架构中创建命名 UDF 的功能。
  • MODIFY_CLASSPATH:提供将文件添加到 Spark 类路径的功能。
  • ALL PRIVILEGES:提供所有权限(转换为上述所有权限)。

注意

Databricks SQL 不支持 MODIFY_CLASSPATH 权限。

USAGE 权限

若要对 Hive 元存储中的架构对象执行某个操作,用户除了需要有权执行该操作之外,还必须对该架构拥有 USAGE 特权。 以下任何一项都满足 USAGE 要求:

  • 是工作区管理员
  • 对架构具有 USAGE 权限,或者是对架构具有 USAGE 权限的组的成员
  • CATALOG 具有 USAGE 权限,或者是具有 USAGE 权限的组的成员
  • 是架构的所有者,或者是拥有该架构的组的成员

即使是架构中某个对象的所有者,也必须具有 USAGE 权限才能使用该对象。

权限层次结构

在工作区和所有群集上启用表访问控制时,Azure Databricks 中的 SQL对象是分层的,权限会被向下继承。 这意味着授予或拒绝对 CATALOG 的某个权限时,会自动授予或拒绝对目录中的所有架构的该权限。 同样,在架构对象上授予的权限会被该架构中的所有对象继承。 此模式适用于所有安全对象。

如果拒绝用户对表的权限,则用户无法通过尝试列出架构中的所有表来查看表。 如果拒绝用户对架构的权限,则用户无法通过尝试列出目录中的所有架构来查看架构是否存在。

动态视图函数

Azure Databricks 包含两个用户函数,让你可以在 Hive 元存储管理的视图定义的正文中动态表示列级和行级权限。

  • current_user():返回当前用户名。
  • is_member():确定当前用户是否为工作区级别上特定 Azure Databricks 的成员。

以下示例结合使用这两个函数来确定用户是否具有适当的组成员身份:

-- Return: true if the user is a member and false if they are not
SELECT
  current_user as user,
-- Check to see if the current user is a member of the "Managers" group.
  is_member("Managers") as admin

列级权限

可以使用动态视图来限制特定组或用户可以看到的列。 请考虑以下示例,其中只有属于 auditors 组的用户才能查看 sales_raw 表中的电子邮件地址。 在分析时,Spark 会将 CASE 语句替换为文本 'REDACTED'email 列。 此行为允许 Spark 提供的所有常见性能优化。

-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
  user_id,
  CASE WHEN
    is_group_member('auditors') THEN email
    ELSE 'REDACTED'
  END AS email,
  country,
  product,
  total
FROM sales_raw

行级权限

使用动态视图,你可以指定低至行级或字段级的权限。 请考虑以下示例,其中只有属于 managers 组的用户才能查看大于 $1,000,000.00 的交易金额(total 列):

CREATE VIEW sales_redacted AS
SELECT
  user_id,
  country,
  product,
  total
FROM sales_raw
WHERE
  CASE
    WHEN is_group_member('managers') THEN TRUE
    ELSE total <= 1000000
  END;

数据屏蔽

如前面的示例所示,你可以实施列级屏蔽,以防止用户查看特定的列数据,除非用户在正确的组中。 因为这些视图是标准 Spark SQL,所以你可以通过更复杂的 SQL 表达式执行更高级类型的屏蔽。 以下示例允许所有用户对电子邮件域执行分析,但允许 auditors 组的成员查看用户的完整电子邮件地址。

-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name

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