Hive 中繼存放區權限和安全性實體物件 (舊版)
本文說明舊版 Azure Databricks Hive 中繼存放區的許可權模型,該中繼存放區內建於每個 Azure Databricks 工作區中。 它也描述如何在內建Hive中繼存放區中授與、拒絕和撤銷對象的許可權。 Unity 目錄會使用不同的模型來授與許可權。 請參閱 Unity 目錄許可權和安全性實體物件。
注意
Hive 中繼存放區所管理數據的數據表訪問控制是舊版數據控管模型。 Databricks 建議您 將 Hive 中繼存放區所管理的數據表升級至 Unity 目錄中繼存放區。 Unity 目錄藉由提供集中位置來管理和稽核帳戶中多個工作區的資料存取,藉此簡化資料的安全性和控管。 若要深入瞭解舊版許可權模型與 Unity 目錄許可權模型有何不同,請參閱 使用 Unity 目錄和舊版 Hive 中繼存放區。
需求
- 系統管理員必須 啟用並強制執行工作區的數據表訪問控制 。
- 叢集必須啟用 數據表訪問控制。
注意
- 數據訪問控制 一律會在 Databricks SQL 中啟用,即使未針對工作區啟用數據表訪問控制 也一 樣。
- 如果已啟用工作區的數據表訪問控制,而且您已經在工作區中指定 ACL(已授與和拒絕的許可權),則 Databricks SQL 中會遵守這些 ACL。
管理Hive中繼存放區中物件的許可權
Hive 中繼存放區所管理之數據對象的許可權可由工作區管理員或對象的擁有者授與。 您可以使用 SQL 命令來管理 Hive 中繼存放區物件的許可權。
若要在 SQL 中管理許可權,您可以使用 語法在筆記本或 Databricks SQL 查詢編輯器中使用 GRANT、 REVOKE、 DENY、 MSCK 和 SHOW GRANT 語句:
GRANT privilege_type ON securable_object TO principal
其中:
privilege_type
是Hive中繼存放區許可權類型securable_object
是Hive中繼存放區中的安全性實體物件principal
是使用者、服務主體 (由其 applicationId 值表示) 或群組。 您必須在反引號中` `
以特殊字元括住用戶、服務主體和組名。 請參閱 主體。
若要將許可權授與工作區中的所有使用者,請將許可權授與 users
群組。 例如:
GRANT SELECT ON TABLE <schema-name>.<table-name> TO users
如需使用 SQL 命令在 Hive 中繼存放區中管理物件許可權的詳細資訊,請參閱 Hive 中繼存放區中的許可權和安全性實體物件。
您也可以使用 Databricks Terraform 提供者和 databricks_sql_permissions,在完全自動化的設定中管理數據表訪問控制。
對象擁有權
在叢集或 SQL 倉儲上啟用資料表訪問控制時,建立架構、數據表、檢視或函式的用戶會變成其擁有者。 擁有者獲授與所有許可權,並可將許可權授與其他使用者。
群組可以擁有 物件,在此情況下,該群組的所有成員都會被視為擁有者。
物件的擁有者或工作區管理員可以使用下列命令來轉移物件的擁有權:
ALTER <object> OWNER TO `<user-name>@<user-domain>.com`
注意
在叢集或 SQL 倉儲上停用數據表訪問控制時,建立架構、數據表或檢視表時,不會註冊擁有者。 工作區管理員必須使用 命令,將擁有者指派給物件 ALTER <object> OWNER TO
。
Hive 中繼存放區中的安全性實體物件
安全性實體物件包括:
CATALOG
:控制整個資料目錄的存取。SCHEMA
:控制架構的存取。TABLE
:控制受控或外部數據表的存取。VIEW
:控制對 SQL 檢視的存取。FUNCTION
:控制具名函式的存取。
ANONYMOUS FUNCTION
:控制匿名或暫存函式的存取。注意
ANONYMOUS FUNCTION
Databricks SQL 中不支持 物件。ANY FILE
:控制基礎文件系統的存取。警告
授與存取
ANY FILE
權的使用者可以直接從文件系統讀取,以略過目錄、架構、數據表和檢視上所設定的限制。
注意
不支援全域和本機暫存檢視的許可權。 本機暫存檢視只會在相同的會話內顯示,而架構中建立的 global_temp
檢視則可供共用叢集或 SQL 倉儲的所有用戶看見。 不過,會強制執行任何暫存檢視所參考之基礎表和檢視的許可權。
您可以在 Hive 中繼存放區物件上授與的許可權
SELECT
:提供對象的讀取許可權。CREATE
:可讓您建立物件(例如架構中的數據表)。MODIFY
:可讓您在 物件中加入、刪除及修改數據。USAGE
:不會提供任何功能,而是對架構對象執行任何動作的額外需求。READ_METADATA
:可讓您檢視物件及其元數據。CREATE_NAMED_FUNCTION
:可讓您在現有的目錄或架構中建立具名 UDF。MODIFY_CLASSPATH
:能夠將檔案新增至Spark類別路徑。ALL PRIVILEGES
:授與所有許可權(會轉譯為上述所有許可權)。
注意
Databricks SQL 不支持許可權 MODIFY_CLASSPATH
。
USAGE
特權
若要在Hive中繼存放區中的架構物件上執行動作,除了執行該動作的許可權之外,用戶還必須擁有 USAGE
該架構的許可權。 下列任一項都 USAGE
符合需求:
- 成為工作區管理員
- 具有
USAGE
架構的許可權,或位於具有USAGE
架構許可權的群組中 - 在
USAGE
具有許可權的CATALOG
群組中,或 具有許可權的USAGE
群組中具有許可權 - 成為架構的擁有者,或位於擁有架構的群組中
即使是架構內對象的擁有者也必須具有 USAGE
許可權才能使用它。
許可權階層
在工作區和所有叢集上啟用數據表訪問控制時,Azure Databricks 中的 SQL 對像是階層式,許可權會向下繼承。 這表示授與或拒絕目錄 CATALOG
內所有架構的許可權會自動授與或拒絕許可權。 同樣地,在架構物件上授與的許可權是由該架構中的所有物件繼承。 此模式適用於所有安全性實體物件。
如果您拒絕數據表上的用戶許可權,則使用者無法藉由嘗試列出架構中的所有數據表來查看數據表。 如果您拒絕架構上的用戶許可權,則使用者無法藉由嘗試列出目錄中的所有架構,來查看架構是否存在。
動態檢視函式
Azure Databricks 包含兩個使用者函式,可讓您在 Hive 中繼存放區所管理的檢視定義主體中動態表達數據行和數據列層級許可權。
current_user()
:傳回目前的用戶名稱。is_member()
:判斷目前使用者是否為工作區層級特定 Azure Databricks 群組 的成員。
下列範例會結合這兩個函式來判斷使用者是否有適當的群組成員資格:
-- Return: true if the user is a member and false if they are not
SELECT
current_user as user,
-- Check to see if the current user is a member of the "Managers" group.
is_member("Managers") as admin
數據行層級許可權
您可以使用動態檢視來限制特定群組或使用者可以看到的數據行。 請考慮下列範例,其中只有屬於 auditors
群組的用戶能夠從數據表查看電子郵件位址 sales_raw
。 在分析時間,Spark 會將 CASE
語句取代為常值 'REDACTED'
或資料行 email
。 此行為允許Spark提供的所有一般效能優化。
-- Alias the field 'email' to itself (as 'email') to prevent the
-- permission logic from showing up directly in the column name results.
CREATE VIEW sales_redacted AS
SELECT
user_id,
CASE WHEN
is_group_member('auditors') THEN email
ELSE 'REDACTED'
END AS email,
country,
product,
total
FROM sales_raw
數據列層級許可權
您可以使用動態檢視來指定資料列或欄位層級的許可權。 請考慮下列範例,其中只有屬於 managers
群組的用戶能夠看到大於 $1,000,000.000 的交易金額(total
數據行) :
CREATE VIEW sales_redacted AS
SELECT
user_id,
country,
product,
total
FROM sales_raw
WHERE
CASE
WHEN is_group_member('managers') THEN TRUE
ELSE total <= 1000000
END;
資料遮罩
如上述範例所示,您可以實作數據行層級遮罩,以防止使用者看到特定的數據行數據,除非他們位於正確的群組中。 由於這些檢視是標準 Spark SQL,因此您可以使用更複雜的 SQL 運算式來執行更進階的遮罩類型。 下列範例可讓所有使用者在電子郵件網域上執行分析,但可讓群組成員 auditors
查看使用者的完整電子郵件位址。
-- The regexp_extract function takes an email address such as
-- user.x.lastname@example.com and extracts 'example', allowing
-- analysts to query the domain name
CREATE VIEW sales_redacted AS
SELECT
user_id,
region,
CASE
WHEN is_group_member('auditors') THEN email
ELSE regexp_extract(email, '^.*@(.*)$', 1)
END
FROM sales_raw