數據對象的權限

Databricks數據治理模型允許您通過編程方式授予、拒絕和撤銷對Spark SQL數據的訪問。該模型允許您控製對安全對象(如目錄、模式(數據庫)、表、視圖和函數)的訪問。它還允許對從任意查詢創建的派生視圖設置特權,從而實現細粒度的訪問控製(例如,針對表的特定子集)。Databricks SQL查詢分析器在運行時對啟用表訪問控製的Databricks集群和所有SQL倉庫強製執行這些訪問控製策略。

本文描述了構成Databricks Hive metastore數據治理模型的特權、對象和所有權規則。它還描述了如何授予、拒絕和撤銷對象特權。

Unity Catalog使用不同的模型來授予特權。看到Unity Catalog特權和安全對象

需求

管理對象權限的要求取決於您的環境:

Databricks數據科學與工程與機器學習

數據治理模型

本節介紹Databricks數據治理模型。對安全數據對象的訪問由特權控製。

可獲得的對象

安全對象是:

  • 目錄:控製對整個數據目錄的訪問。

    • 模式:控製對模式的訪問。

      • 表格:控製對托管表或外部表的訪問。

      • 視圖:控製對SQL視圖的訪問。

      • 函數:控製對命名函數的訪問。

  • 匿名函數:控製訪問匿名或臨時函數

    請注意

    匿名函數對象在Databricks SQL中不支持。

  • 任何文件:控製對底層文件係統的訪問。

    警告

    獲得訪問權限的用戶任何文件可以通過直接從文件係統讀取來繞過對目錄、模式、表和視圖的限製。

特權

  • 選擇:提供對對象的讀訪問權限。

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

  • 修改:提供向對象添加、刪除和修改數據的能力。

  • 使用:沒有提供任何功能,但是對模式對象執行任何操作的附加要求。

  • READ_METADATA:提供查看對象及其元數據的能力。

  • CREATE_NAMED_FUNCTION:提供在現有目錄或模式中創建命名UDF的能力。

  • MODIFY_CLASSPATH:提供向Spark類路徑添加文件的能力。

  • 所有特權:給出所有權限(轉換為上述所有權限)。

請注意

MODIFY_CLASSPATH在Databricks SQL中不支持特權。

使用特權

要在模式對象上執行操作,用戶必須具有使用除了執行該操作的權限之外,還需要該模式上的特權。下列任何一項滿足使用要求:

  • 是一個管理

  • 使用模式上的特權,或位於具有使用模式上的特權

  • 使用上的特權目錄或者加入一個有使用特權

  • 成為模式的所有者或屬於擁有該模式的組

模式中對象的所有者也必須具有使用特權才能使用它。

例如,管理員可以定義一個金融組和一個會計Schema供他們使用。要建立一個隻有財務團隊可以使用和共享的模式,管理員需要執行以下操作:

創建模式會計格蘭特使用模式會計金融格蘭特創建模式會計金融

有了這些特權金融組中可以創建表和視圖會計模式,但不能與任何不具有該模式的主體共享這些表或視圖使用會計模式。

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並授予對的特權來繞過這個限製當Databricks檢查用戶C訪問視圖V的特權時,它還檢查V和底層表T的所有者是否相同。如果所有者不相同,用戶C也必須相同選擇底層表T上的特權。

當在集群上禁用表訪問控製時,創建模式、表、視圖或函數時不會注冊所有者。要測試對象是否有所有者,請運行顯示獎助金<對象名稱>.如果您沒有看到與ActionType自己的,該對象沒有所有者。

為對象分配所有者

對象的所有者或管理員都可以使用改變<對象>老板' <用戶名> @ <用戶域>。com”命令:

改變模式<模式-的名字>老板' <用戶-的名字> @ <用戶->com改變表格<表格-的名字>老板group_name改變視圖<視圖-的名字>老板' <用戶-的名字> @ <用戶->com改變函數<函數-的名字>老板' <用戶-的名字> @ <用戶->com

用戶和組

管理員和所有者可以向用戶和組.每個用戶在Databricks中都由用戶名唯一標識(通常映射到他們的電子郵件地址)。所有用戶都隱含地屬於“所有用戶”組的一部分,表示為用戶在SQL。

請注意

必須在反引號(),而不是單引號().

操作和特權

在Databricks中,管理員用戶可以管理所有對象權限,有效地擁有在所有可安全對象上授予的所有權限,並可以更改任何對象的所有者。對象的所有者可以對該對象執行任何操作,可以將該對象上的特權授予其他主體,並可以將對象的所有權轉移到另一個主體。對所有者特權的唯一限製是針對模式中的對象;要與模式中的對象交互,用戶也必須具有使用在這個模式。

下表將SQL操作映射到執行該操作所需的權限。

請注意

  • 在任何需要表、視圖或函數上的特權的地方,使用在它所在的模式上也是必需的。

  • 在命令中引用表的任何地方,也可以引用路徑。在這些情況下選擇修改上都需要任何文件而不是使用模式和表上的另一個特權。

  • 對象所有權在這裏表示為自己的特權。

操作

需要的特權

克隆

能力選擇從被克隆的表中,創建在圖式上,和修改如果表正在被更換。

複製到

選擇任何文件如果從路徑複製,修改在被複製到的桌子上。

創建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並提取'example',允許——解析者查詢域名創建視圖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倉庫創建的。

  • 授予人選擇privilege不是表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_sql_permissions

資源"databricks_sql_permissions" "foo_table" {table = "foo" privilege_assignments {principal = "serge@example.com" privileges = ["SELECT", "MODIFY"]} privilege_assignments {principal = "special group" privileges = ["SELECT"]}}