免責聲明:本博客中表達的所有觀點和意見僅屬於作者本人,並不一定代表作者的雇主或任何其他團體或個人。本文章並不是對任何雲端/數據管理平台的推廣。所有圖片和代碼片段均可在 Azure/Databricks 網站上公開獲得。
在我其他的 DZone 文章中,我討論了 Databricks Unity Catalog 是什麼,權限模型在 Unity Catalog 中如何運作,架構層級以及自動化管理目錄和架構層級權限的腳本。
在本文中,我旨在提供一個腳本,用於自動化 Unity Catalog 表層級的權限管理。
Unity Catalog 表層級的權限
在 Unity Catalog (Databricks) 中,當您想要控制對特定表或視圖的訪問,而不是對架構內的所有對象應用權限時,必須在 表層級 應用權限。表層級權限在以下情況下非常有用:
1. 細粒度訪問控制
當您需要授予或限制對特定表或視圖的訪問,而不影響整個架構時。
這對於包含敏感數據的架構尤為重要,當您希望允許訪問某些表格而限制對其他表格的訪問。
2. 保護敏感數據
如果架構中的某些表格包含機密或受限制的數據(例如個人可識別信息、財務數據),您可以應用表格級別的權限,以確保只有授權用戶能夠查看或查詢這些表格。
例如,您可能允許訪問某些摘要或匯總數據表,但限制訪問包含敏感信息的原始詳細表。
3. 對特定團隊/用戶委派訪問權限,如果架構包含供多個團隊使用的表格
當不同用戶或團隊需要訪問同一架構中的不同表格時。例如,銷售團隊可能需要訪問與客戶相關的表格,而財務團隊則需要訪問收入表格。
在表格級別應用權限可確保每個團隊僅能訪問與其工作相關的表格。
4. 符合數據治理要求
在實施嚴格的數據治理政策時,您可能需要在更細粒度的層次(甚至到個別表格)上控制訪問。表格級別的權限有助於確保通過僅授予用戶或角色授權處理的數據來確保合規性。
5. 處理架構內的混合訪問需求
在架構包含具有不同敏感性或機密性級別的表的情況下,將權限應用於架構級別可能過於廣泛。表級別權限允許您根據特定需求獨立管理每個表的訪問權限。
可應用於表級別的權限
- SELECT:授予對表的讀取訪問權限,允許用戶對其進行查詢。
- MODIFY:允許對對象添加、刪除和修改數據。
- APPLY TAG:允許對對象應用標籤的能力。
- ALL PRIVILEGES:授予所有權限。
自動化腳本
先決條件
- Unity 目錄已經設置。
- 主體已與 Databricks 工作區關聯。
- 運行權限腳本的用戶對表、架構和目錄具有適當的權限。
步驟1:創建一個筆記本並聲明變量
在 Databricks 工作區中創建一個筆記本。要在工作區中創建一個筆記本,請點擊側邊欄中的 “+” 新建,然後選擇筆記本。
工作區中打開一個空白筆記本。請確保Python被選為筆記本語言。
將以下程式碼片段複製並貼上到筆記本儲存格中,然後執行該儲存格。
catalog = 'main' # Specify your catalog name
schema = 'default' # Specify your schema name
tables_arr= 'test1,test2' # Specify the Comma(,) seperated values of table name
tables = tables_arr.split(',')
principals_arr = '' # Specify the Comma(,) seperated values for principals in the blank text section (e.g. groups, username)
principals = principals_arr.split(',')
privileges_arr = 'SELECT,APPLY TAG' # Specify the Comma(,) seperated values for priviledges in the blank text section (e.g. SELECT,APPLY TAG)
privileges = privileges_arr.split(',')
步驟 2:設置目錄和模式
將以下程式碼區塊複製、貼上到新的或現有儲存格中,然後執行該儲存格。
query = f"USE CATALOG `{catalog}`" #Sets the Catalog
spark.sql(query)
query = f"USE SCHEMA `{schema}`" #Sets the Schema
spark.sql(query)
步驟 3:遍歷主體和權限,並在目錄、模式和表格上應用授權
將以下程式碼區塊複製、貼上到新的或現有儲存格中,然後執行該儲存格以應用權限。
for principal in principals:
query = f"GRANT USE_CATALOG ON CATALOG `{catalog}` TO `{principal}`" # Use catalog permission at Catalog level
spark.sql(query)
query = f"GRANT USE_SCHEMA ON SCHEMA `{schema}` TO `{principal}`" # Use schema permission at Schema level
spark.sql(query)
for table in tables:
for privilege in privileges:
query = f"GRANT `{privilege}` ON `{table}` TO `{principal}`" # Grant priviledges on the tables to the pricipal
print(query)
spark.sql(query)
驗證
您可以通過打開 Databricks UI 並導航到資料總管中的「目錄」來驗證權限。一旦目錄顯示在資料部分中,點擊該目錄,然後展開模式並選擇應用了權限的模式內的表格,然後轉到「權限」選項卡。您現在可以看到應用於該表格的所有權限。以下是在主目錄和 information_schema
模式中的 out-of-box 目錄表格中應用的權限的螢幕截圖。
您還可以在筆記本中運行以下 SQL 腳本,以顯示表格的所有權限,作為驗證的一部分。
SHOW GRANTS ON TABLE table_name;
結論
在Databricks Unity Catalog中自動化特權管理可確保以一致和高效的方式在Unity Catalog中的最低層次應用權限。所提供的代碼演示了一種實用的方法,可以為單個目錄和架構中的多個主體和表分配多個表級特權。在一個存在數百個表並且不同主體需要提供不同權限的目錄中,上述自動化顯著減少了手動錯誤和工作量。
Source:
https://dzone.com/articles/automate-databricks-unity-catalog-permissions-at-table-level