数据对象权限

Databricks数据治理模型允许您通过编程方式授予、拒绝和撤销Spark SQL对数据的访问。该模型允许您控制对安全对象(如目录、模式(数据库)、表、视图和函数)的访问。它还允许通过对从任意查询创建的派生视图设置特权来实现细粒度的访问控制(例如,对表的特定子集)。Databricks SQL查询分析器在运行时对启用了表访问控制的Databricks集群和所有SQL仓库强制执行这些访问控制策略。

本文描述了组成Databricks Hive亚稳态数据治理模型的特权、对象和所有权规则。它还描述了如何授予、拒绝和撤销对象特权。

Unity Catalog使用不同的模型授予特权。看到Unity Catalog特权和安全对象

数据治理模型

介绍Databricks数据治理模型。对安全数据对象的访问由特权控制。

可获得的对象

可安全对象包括:

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

    • 模式:控制对模式的访问。

      • 表格:控制对托管表或外部表的访问。

      • 视图:控制对SQL视图的访问。

      • 函数:控制对指定函数的访问。

  • 匿名函数:控制访问匿名或临时函数

    请注意

    匿名函数Databricks SQL不支持对象。

  • 任何文件:控制对底层文件系统的访问。

    警告

    被授予访问权限的用户任何文件通过直接从文件系统读取,可以绕过对目录、模式、表和视图的限制。

特权

  • 选择:对对象进行读访问。

  • 创建:提供创建对象(例如,模式中的表)的能力。

  • 修改:提供向对象添加、删除和修改数据的能力。

  • 使用:不提供任何能力,而是对模式对象执行任何操作的附加要求。

  • READ_METADATA:提供查看对象及其元数据的能力。

  • CREATE_NAMED_FUNCTION:提供在现有目录或模式中创建命名UDF的能力。

  • MODIFY_CLASSPATH:提供将文件添加到Spark类路径的能力。

  • 所有特权:给出所有权限(转换为上述所有权限)。

请注意

MODIFY_CLASSPATH在Databricks SQL中不支持privilege。

使用特权

要对架构对象执行操作,用户必须具有使用除了执行该操作的特权外,还具有该模式上的特权。下列任意一个满足使用要求:

  • 成为管理员

  • 使用模式上的特权,或位于具有使用模式上的特权

  • 使用特权目录或者加入一个有使用特权

  • 成为模式的所有者或在拥有该模式的组中

模式中对象的所有者也必须具有使用特权是为了使用它。

例如,管理员可以定义金融组和会计供他们使用的模式。要设置一个只有财务团队可以使用和共享的模式,管理员将执行以下操作:

创建模式会计格兰特使用模式会计金融格兰特创建模式会计金融

有了这些特权,成员金融组中创建的表和视图会计模式,但不能与任何不具有这些表或视图的主体共享这些表或视图使用会计模式。

Databricks数据科学与工程和Databricks运行时版本行为
  • 运行Databricks Runtime 7.3 LTS及以上版本的集群强制使用特权。

  • 运行Databricks Runtime 7.2及以下版本的集群不强制使用特权。

  • 确保在以前使用表访问控制的工作空间中,现有的工作负载功能不变使用被介绍有过的使用上的特权目录授予用户组。如果你想利用使用特权,你必须跑撤销使用目录用户然后格兰特使用...根据需要。

特权等级

当在工作空间和所有集群上启用表访问控制时,Databricks中的SQL对象是分层的,特权向下继承。这意味着授予或拒绝上的特权目录自动向目录中的所有模式授予或拒绝特权。类似地,在模式对象上授予的特权将由该模式中的所有对象继承。这种模式适用于所有可安全的对象。

如果您拒绝用户对某个表的权限,则该用户将无法通过试图列出模式中的所有表来查看该表。如果您拒绝用户对某个模式的权限,则用户无法通过尝试列出编目中的所有模式来看到该模式的存在。

对象所有权

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

组可以拥有对象,在这种情况下,该组的所有成员都被认为是所有者。

所有权决定是否可以将派生对象上的特权授予其他用户。例如,假设用户A拥有表T,并授予用户B选择即使用户B可以从表T中选择,用户B也不能授予选择因为用户A仍然是底层表T的所有者。此外,用户B不能简单地通过在表T上创建视图V并授予表T上的特权来规避这一限制当Databricks检查用户C对视图V的访问权限时,它还会检查V和底层表T的所有者是否相同。如果所有者不相同,用户C也必须具有选择底层表T上的特权。

当在集群上禁用表访问控制时,创建模式、表、视图或函数时不会注册所有者。要测试对象是否有所有者,请运行显示奖助金<对象名称>.如果没有看到带有ActionType自己的,该对象没有所有者。

为对象分配所有者

对象的所有者或管理员都可以使用改变<对象>老板' <用户名> @ <用户域>。com”命令:

改变模式<模式-的名字>老板' <用户-的名字> @ <用户->com改变表格<表格-的名字>老板group_name改变视图<视图-的名字>老板' <用户-的名字> @ <用户->com改变函数<函数-的名字>老板' <用户-的名字> @ <用户->com

用户和组

管理员和所有者可以向用户和组.每个用户都由Databricks中的用户名唯一标识(通常映射到他们的电子邮件地址)。所有用户都隐式地属于“所有用户”组,表示为用户在SQL。

请注意

必须将用户规格说明以反引号括起来(),而不是单引号().

操作和权限

在Databricks中,管理员用户可以管理所有对象特权,有效地拥有所有安全对象上授予的所有特权,并可以更改任何对象的所有者。对象的所有者可以对该对象执行任何操作,可以将该对象的特权授予其他主体,也可以将对象的所有权转移给另一个主体。对所有者权限的唯一限制是针对模式中的对象;要与模式中的对象交互,用户也必须拥有使用在这个图式上。

下表将SQL操作映射到执行该操作所需的特权。

请注意

  • 任何需要表、视图或函数上的特权的地方,使用在它所在的模式上也是必需的。

  • 在命令中引用表的任何地方,也可以引用路径。在这些情况下选择修改是必需的任何文件而不是使用模式和表上的另一个特权。

  • 对象所有权在这里表示为自己的特权。

操作

需要的特权

克隆

能力选择从表被克隆,创建在模式上,和修改如果正在更换a表。

复制到

选择任何文件如果从路径复制,修改在被复制到的表上。

创建bloomfilter索引

自己的在被索引的表上。

创建模式

创建目录

创建表

要么自己的或两个使用而且创建在模式上。

创建视图

要么自己的或两个使用而且创建在模式上。

创建函数(外部)

要么自己的使用而且CREATE_NAMED_FUNCTION在模式上。如果指定了资源,则MODIFY_CLASSPATH目录也是必需的。

创建函数(sql)

要么自己的使用在模式上。

创建模式

创建目录

改变模式

自己的在模式上。

ALTER TABLE

通常修改在桌子上。自己的如果授予表上的权限,更改其所有者或位置,或重命名。

改变观点

自己的在视图上。

下降bloomfilter指数

自己的在桌子上。

删除模式

自己的在模式上。

删除表

自己的在桌子上。

删除视图

自己的在视图上。

删除函数

自己的关于函数。

解释

READ_METADATA在表和视图上。

描述表

READ_METADATA在桌子上。

描述历史

自己的在桌子上。

选择

选择在桌子上。

插入

修改在桌子上。

恢复表

修改在桌子上。

更新

修改在桌子上。

合并成

修改在桌子上。

删除从

修改在桌子上。

截断表

修改在桌子上。

优化

修改在桌子上。

真空

修改在桌子上。

FSCK修复表

修改在桌子上。

MSCK

自己的在桌子上。

格兰特

自己的在物体上。

秀奖助金

自己的对客体,或对使用者主体的授予。

否认

自己的在物体上。

撤销

自己的在物体上。

重要的

当您使用表访问控制时,下降表格语句区分大小写。如果表名为小写,则下降表格的混合或大写引用表名下降表格语句将失败。

管理对象权限

你可以使用格兰特否认撤销MSCK,显示奖助金管理对象权限的操作。

请注意

  • 对象的所有者或管理员可以执行格兰特否认撤销,显示奖助金操作。但是,管理员不能拒绝或撤销所有者的特权。

  • 非所有者或管理员的主体只有在已授予所需权限时才能执行操作。

  • 授予、否认或撤销…的特权所有用户,指定关键字用户.例如,

    格兰特选择任何文件用户

例子

格兰特选择模式<模式-的名字>' <用户> @ <-的名字>”格兰特选择匿名函数' <用户> @ <-的名字>”格兰特选择任何文件' <用户> @ <-的名字>”显示奖助金' <用户> @ <-的名字>”模式<模式-的名字>否认选择<表格-的名字>' <用户> @ <-的名字>”撤销所有特权模式默认的' <用户> @ <-的名字>”撤销选择<表格-的名字>' <用户> @ <-的名字>”格兰特选择任何文件用户

动态视图函数

Databricks包含两个用户函数,允许您在视图定义的主体中动态地表示列级和行级权限。

  • current_user ():返回当前用户名。

  • is_member ():确定当前用户是否是特定Databricks的成员集团

请注意

在Databricks Runtime 7.3 LTS及以上版本中可用。但是,在Databricks Runtime 7.3 LTS中使用这些函数时,必须先设置火花配置spark.databricks.userInfoFunctions.enabled真正的

考虑下面的例子,它结合了这两个函数来确定用户是否具有适当的组成员关系:

——返回:如果用户是成员则为true,如果不是则为false选择current_user作为用户检查当前用户是否是“Managers”组的成员。is_member“经理”作为管理

允许管理员在一个视图中为多个用户和组设置细粒度的特权,这既富有表现力又功能强大,同时节省了管理开销。

列级权限

通过动态视图,可以很容易地限制特定组或用户可以查看的列。考虑下面的示例,其中只有属于审计人员组都可以看到电子邮件地址sales_raw表格在分析时,Spark替换情况下语句“修订”或者这一列电子邮件.此行为允许Spark提供的所有常规性能优化。

—将字段“email”别名为自身(如“email”),以防止——权限逻辑不直接显示在列名结果中。创建视图sales_redacted作为选择user_id情况下is_member“审计师”然后电子邮件其他的“修订”结束作为电子邮件国家产品总计sales_raw

行级权限

使用动态视图,您可以将权限指定到行或字段级别。考虑下面的示例,其中只有属于经理组可以查看交易金额(总计列)大于1,000,000.00美元:

创建视图sales_redacted作为选择user_id国家产品总计sales_raw在哪里情况下is_member“经理”然后真正的其他的总计< =1000000结束

数据屏蔽

如前面的示例所示,您可以实现列级屏蔽,以防止用户看到特定的列数据,除非他们属于正确的组。因为这些视图是标准的Spark SQL,所以您可以使用更复杂的SQL表达式执行更高级的屏蔽类型。下面的示例允许所有用户对电子邮件域执行分析,但允许审计人员组查看用户的完整电子邮件地址。

regexp_extract函数接受一个电子邮件地址,例如——user.x.lastname@example.com并摘录“示例”,允许——分析人员查询域名创建视图sales_redacted作为选择user_id地区情况下is_member“审计师”然后电子邮件其他的regexp_extract电子邮件'^.*@(.*)$'1结束sales_raw

常见问题(FAQ)

如何授予、拒绝或撤销所有用户的特权?

指定关键字用户.例如:

格兰特选择表格<模式-的名字><表格-的名字>用户

我创建了一个对象,但现在不能查询、删除或修改它。

发生此错误是因为您在未启用表访问控制的集群或SQL仓库上创建了该对象。当在集群或SQL仓库上禁用表访问控制时,创建模式、表或视图时不会注册所有者。管理员必须使用以下命令为对象分配所有者:

改变模式|表格|视图<对象-的名字>老板' <用户-的名字> @ <用户->com

如何在全局和本地临时视图上授予特权?

不支持全局和本地临时视图上的特权。本地临时视图仅在同一会话中可见,而在global_temp模式对于共享集群或SQL仓库的所有用户都是可见的。但是,任何临时视图引用的底层表和视图上的特权都是强制的。

如何在多个表上同时授予用户或组权限?

grant、deny或revoke语句一次只能应用于一个对象。组织多个表并向主体授予特权的推荐方法是通过模式。授予本金选择模式上的特权隐式授予该主体选择该模式中所有表和视图的特权。例如,如果模式D有表t1和t2,管理员发出以下命令格兰特命令:

格兰特使用选择模式D' <用户> @ <-的名字>”

校长<用户> @ <域名>可以选择表t1和t2,以及将来在模式D中创建的任何表和视图。

如何向用户授予除一个表以外的所有表的权限?

你批准选择模式的特权,然后拒绝选择要限制访问的特定表的权限。

格兰特使用选择模式D' <用户> @ <-的名字>”否认选择表格DT' <用户> @ <-的名字>”

校长<用户> @ <域名>可以从D中除D.T.之外的所有表中选择

用户有选择表T视图上的特权,但是当用户试图选择从这个视图中,他们得到了错误用户特权选择表格

出现这种常见错误的原因有以下几种:

  • 表T没有注册所有者,因为它是使用禁用了表访问控制的集群或SQL仓库创建的。

  • 的授予人选择表T视图上的特权不是表T的所有者,或者用户没有select权限选择表T上的特权。

假设a拥有一个表T, a拥有T上的视图V1, B拥有T上的视图V2。

  • 当A授予权限时,用户可以在V1上进行选择选择视图V1的权限。

  • 当A授予权限时,用户可以在V2上进行选择选择表T和表B上的特权已经被授予选择V2上的特权。

如在对象所有权节中,这些条件确保只有对象的所有者才能授予其他用户对该对象的访问权。

我试着逃跑sc.parallelize在启用了表访问控制的集群上,失败。

在启用了表访问控制的集群上,您只能使用Spark SQL和Python DataFrame api。由于安全原因,RDD API是不允许的,因为Databricks没有检查和授权RDD内代码的能力。

我想从基础设施即代码管理权限

您可以在完全自动化的设置中使用Databricks Terraform提供商而且databricks_sql_permissions

resource databricks_sql_permissions" foo_table" {table = "foo" privilege_assignments {principal = "serge@example.com" privileges = ["SELECT", "MODIFY"]} privilege_assignments {principal = "特殊组" privileges = ["SELECT"]}}