数据对象权限
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。
使用
特权
要对架构对象执行操作,用户必须具有使用
除了执行该操作的特权外,还具有该模式上的特权。下列任意一个满足使用
要求:
成为管理员
有
使用
模式上的特权,或位于具有使用
模式上的特权有
使用
特权目录
或者加入一个有使用
特权成为模式的所有者或在拥有该模式的组中
模式中对象的所有者也必须具有使用
特权是为了使用它。
例如,管理员可以定义金融
组和会计
供他们使用的模式。要设置一个只有财务团队可以使用和共享的模式,管理员将执行以下操作:
创建模式会计;格兰特使用在模式会计来金融;格兰特创建在模式会计来金融;
有了这些特权,成员金融
组中创建的表和视图会计
模式,但不能与任何不具有这些表或视图的主体共享这些表或视图使用
在会计
模式。
对象所有权
当在集群或SQL仓库上启用表访问控制时,创建模式、表、视图或函数的用户将成为其所有者。所有者被授予所有权限,并可以将权限授予其他用户。
组可以拥有对象,在这种情况下,该组的所有成员都被认为是所有者。
所有权决定是否可以将派生对象上的特权授予其他用户。例如,假设用户A拥有表T,并授予用户B选择
即使用户B可以从表T中选择,用户B也不能授予选择
因为用户A仍然是底层表T的所有者。此外,用户B不能简单地通过在表T上创建视图V并授予表T上的特权来规避这一限制那当Databricks检查用户C对视图V的访问权限时,它还会检查V和底层表T的所有者是否相同。如果所有者不相同,用户C也必须具有选择
底层表T上的特权。
当在集群上禁用表访问控制时,创建模式、表、视图或函数时不会注册所有者。要测试对象是否有所有者,请运行显示奖助金在<对象名称>
.如果没有看到带有ActionType自己的
,该对象没有所有者。
用户和组
管理员和所有者可以向用户和组.每个用户都由Databricks中的用户名唯一标识(通常映射到他们的电子邮件地址)。所有用户都隐式地属于“所有用户”组,表示为用户
在SQL。
请注意
必须将用户规格说明以反引号括起来(``
),而不是单引号(''
).
操作和权限
在Databricks中,管理员用户可以管理所有对象特权,有效地拥有所有安全对象上授予的所有特权,并可以更改任何对象的所有者。对象的所有者可以对该对象执行任何操作,可以将该对象的特权授予其他主体,也可以将对象的所有权转移给另一个主体。对所有者权限的唯一限制是针对模式中的对象;要与模式中的对象交互,用户也必须拥有使用
在这个图式上。
下表将SQL操作映射到执行该操作所需的特权。
请注意
任何需要表、视图或函数上的特权的地方,
使用
在它所在的模式上也是必需的。在命令中引用表的任何地方,也可以引用路径。在这些情况下
选择
或修改
是必需的任何文件
而不是使用
模式和表上的另一个特权。对象所有权在这里表示为
自己的
特权。
操作 |
需要的特权 |
---|---|
能力 |
|
|
|
|
|
|
|
要么 |
|
要么 |
|
要么 |
|
要么 |
|
|
|
|
|
通常 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
重要的
当您使用表访问控制时,下降表格
语句区分大小写。如果表名为小写,则下降表格
的混合或大写引用表名下降表格
语句将失败。
管理对象权限
你可以使用格兰特
,否认
,撤销
,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来' <用户> @ <域-的名字>”否认选择在表格D.T来' <用户> @ <域-的名字>”
校长<用户> @ <域名>
可以从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"]}}