數據對象的權限
Databricks數據治理模型允許您通過編程方式授予、拒絕和撤銷對Spark SQL數據的訪問。該模型允許您控製對安全對象(如目錄、模式(數據庫)、表、視圖和函數)的訪問。它還允許對從任意查詢創建的派生視圖設置特權,從而實現細粒度的訪問控製(例如,針對表的特定子集)。Databricks SQL查詢分析器在運行時對啟用表訪問控製的Databricks集群和所有SQL倉庫強製執行這些訪問控製策略。
本文描述了構成Databricks Hive metastore數據治理模型的特權、對象和所有權規則。它還描述了如何授予、拒絕和撤銷對象特權。
Unity Catalog使用不同的模型來授予特權。看到Unity Catalog特權和安全對象.
數據治理模型
本節介紹Databricks數據治理模型。對安全數據對象的訪問由特權控製。
可獲得的對象
安全對象是:
目錄
:控製對整個數據目錄的訪問。模式
:控製對模式的訪問。表格
:控製對托管表或外部表的訪問。視圖
:控製對SQL視圖的訪問。函數
:控製對命名函數的訪問。
匿名函數
:控製訪問匿名或臨時函數.請注意
匿名函數
對象在Databricks SQL中不支持。任何文件
:控製對底層文件係統的訪問。警告
獲得訪問權限的用戶
任何文件
可以通過直接從文件係統讀取來繞過對目錄、模式、表和視圖的限製。
特權
選擇
:提供對對象的讀訪問權限。創建
:提供創建對象的能力(例如,模式中的表)。修改
:提供向對象添加、刪除和修改數據的能力。使用
:沒有提供任何功能,但是對模式對象執行任何操作的附加要求。READ_METADATA
:提供查看對象及其元數據的能力。CREATE_NAMED_FUNCTION
:提供在現有目錄或模式中創建命名UDF的能力。MODIFY_CLASSPATH
:提供向Spark類路徑添加文件的能力。所有特權
:給出所有權限(轉換為上述所有權限)。
請注意
的MODIFY_CLASSPATH
在Databricks SQL中不支持特權。
使用
特權
要在模式對象上執行操作,用戶必須具有使用
除了執行該操作的權限之外,還需要該模式上的特權。下列任何一項滿足使用
要求:
是一個管理
有
使用
模式上的特權,或位於具有使用
模式上的特權有
使用
上的特權目錄
或者加入一個有使用
特權成為模式的所有者或屬於擁有該模式的組
模式中對象的所有者也必須具有使用
特權才能使用它。
例如,管理員可以定義一個金融
組和一個會計
Schema供他們使用。要建立一個隻有財務團隊可以使用和共享的模式,管理員需要執行以下操作:
創建模式會計;格蘭特使用在模式會計來金融;格蘭特創建在模式會計來金融;
有了這些特權金融
組中可以創建表和視圖會計
模式,但不能與任何不具有該模式的主體共享這些表或視圖使用
在會計
模式。
對象所有權
當在集群或SQL倉庫上啟用表訪問控製時,創建模式、表、視圖或函數的用戶將成為其所有者。所有者被授予所有權限,並可以將權限授予其他用戶。
組可以擁有對象,在這種情況下,組的所有成員都被認為是所有者。
所有權決定是否可以將派生對象上的特權授予其他用戶。例如,假設用戶A擁有表T並授予用戶B選擇
盡管用戶B可以從表T中進行選擇,但用戶B不能進行授予選擇
因為用戶A仍然是底層表T的所有者。此外,用戶B不能簡單地通過在表T上創建視圖V並授予對的特權來繞過這個限製那當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並提取'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來' <用戶> @ <域-的名字>”否認選擇在表格D.T來' <用戶> @ <域-的名字>”
校長<用戶> @ <域名>
可以從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"]}}