說明:該文檔翻譯/整理於Hive官方文檔
https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorization#SQLStandardBasedHiveAuthorization-ObjectPrivilegeCommands。
Hive 0.13版本之前的授權現狀
Hive默認授權(Default Hive Authorization (Legacy Mode))
設計目的並不是為了防止惡意用戶訪問(操作)未經授權的數據;
幫助用戶避免一些意料之外的操作行為;
授權機制並不完善,在很多指令方面都沒有進行授權確認,比如授權指令Grant;
授權確認發生在Hive SQL語句的編譯階段;
允許用戶執行dfs指令、用戶自定義函數以及shell指令,這些特殊操作很有可能跳過客戶端的安全機制;
通過創建視圖,並為視圖進行授權(而不是為視圖所依賴的表授權),從而提供細粒度的訪問控制(僅可以訪問表中的某幾列)。
基於存儲的授權(Storage Based Authorization in the Metastore Server)
通常用於Metastore Server API的授權;
Hive 0.12.0版本之后開始支持;
雖然能夠保護Metastore中的元數據不被惡意用戶破壞,但是沒有提供細粒度的訪問控制(列級別、行級別)
基於SQL標准的Hive授權(SQL Standards Based Hive Authorization)
基於SQL標准的Hive授權為Hive授權提供了第三個選擇,它完全兼容SQL的授權模型,不會給現在的用戶帶來向后兼容的問題,因此被推薦使用。一旦用戶遷移到這種更加安全的授權機制后,默認的授權機制可以被遺棄掉。
基於SQL的授權模型可以和基於存儲的授權模型(Hive Metastore Server)結合使用。
和Hive的默認授權機制一樣,授權確認發生的SQL語句的編譯階段。
為了保證該授權模型起到安全作用,客戶端同樣需要安全保證,可以通過以下兩種方式做到:
(1)用戶訪問必須且僅可以通過HiveServer2;
(2)限制用戶代碼和非SQL指令被執行。
授權確認時是以提交SQL指令的用戶身份為依據的,但SQL指令是以Hive Server用戶身份(即Hive Server的進程用戶)被執行的,因此Hive Server用戶必須擁有相應目錄(文件)的權限(根據SQL指令的不同,所需權限也不同)。
盡可能與標准SQL保持一致,但具體實現時存在些許偏差。有一些是因為方便現有用戶進行遷移(授權相關),另一些是出於方便使用的目的。
在這種授權模型控制下,擁有權限使用Hive CLI、HDFS commands、Pig command line、'hadoop jar' 等工具(指令)的用戶被稱為特權用戶。在一個組織(團隊)內,僅僅一些需要執行ETL相關工作的團隊需要這些特殊權限,這些工具的訪問不經過HiveServer2,因此它們不受這種授權模型的控制。對於需要通過Hive CLI、Pig和MapReduce訪問Hive表的用戶,可以通過在Hive Metastore Server中啟用Storage Based Authorization來進行相應的權限控制;其它情況則可能需要結合Hadoop的安全機制進行。
大多數的用戶(使用SQL語句,並通過ODBC/JDBC訪問HiveServer2進行商業分析)是可以使用這種授權模型進行權限控制的。
Hive指令和語句的限制
當使用基於SQL標准的授權模型時,
dfs、add、delete、compile、reset被禁用;
transform clause被禁用。
改變Hive配置的指令集合被限制為僅某些用戶可以執行,可以通過hive.security.authorization.sqlstd.confwhitelist(hive-site.xml)進行配置。
添加或刪除函數、宏的權限被限制為僅具有admin角色的用戶可以執行。
為了用戶可以使用(自定義)函數,創建永久函數(create permanent functions)的功能被添加。擁有角色admin的用戶可以執行該指令添加函數,所有添加的函數可以被所有的用戶使用。
權限
SELECT:賦予讀取某個對象的權限;
INSERT:賦予添加數據至某個對象(表)的權限;
UPDATE:賦予在某個對象(表)上執行更新操作的權限;
DELETE:賦予在某個對象(表)上刪除數據的權限;
ALL:賦予在某個對象上的所有權限(被轉換成擁有上面四個權限)。
對象
權限被應用到表或者視圖上,上面所描述的權限不支持應用於數據庫上。
數據庫所有者被用來確認某些特殊操作的權限;
Hive允許用戶在SQL語句中使用URI,因此URI也是Hive的一種對象。上面所描述的權限不適用於URI對象。URI通常指向文件系統(HDFS)的一個文件或目錄,授權是基於用戶(提交SQL語句的用戶,SQL語句中包含URI對象)在文件或目錄上的權限進行的。
對象所有者
對於某些特殊操作,是否是該對象(表/視圖/數據庫)的對象所有者決定了是否有權限在該對象上執行這些特殊操作。
用戶創建表、視圖或者數據庫,該用戶即成為所創建表、視圖或者數據庫的所有者。對於表或者視圖來說,所有者擁有對它們進行操作的所有權限(SELECT、INSERT、UPDATE、DELETE)。
數據庫的所有者也可以是一個角色,可以通過“alter database”指令設置一個數據庫的所有者為一個角色。
用戶和角色
用戶和角色均可以被賦予權限。
用戶可以屬於一個或多個角色。
有兩個具有特殊意義的角色:public和admin。
所有用戶均屬於角色public,我們使用該角色並通過grant語句將權限賦予給其它用戶。
當用戶執行查詢或指令的時候,用戶被賦予的權限以及用戶的“當前角色(可以為多個)”的權限被確認。“當前角色”可以通過”show current roles”進行查看。默認情況下,“當前角色”即為用戶所屬的所有角色(角色admin除外),我們可以通過指令“set role”指定某個角色成為“當前角色”。
作為數據庫管理員的用戶通常被添加至角色admin。
具有角色admin的用戶可以執行額外的指令,如create role或者drop role。他們也有訪問對象的全部權限,即使他們並沒有被顯式授權。因為角色admin默認不屬於“當前角色”,一個屬於角色admin的用戶要想得到角色admin的權限,必須通過指令set role先將“當前角色”切換至角色admin。
用戶(角色)名稱
角色名稱大小寫不敏感。
用戶名稱大小寫敏感。
帶引號的標識符(Quoted Identifiers)
一般情況下不建議使用,忽略此小節。
角色管理指令
Create Role
CREATE ROLE role_name;
僅僅角色admin具有該權限。角色名稱ALL、DEFAULT和NONE被保留。
Drop Role
DROP ROLE role_name;
僅僅角色admin具有該權限。
Show Current Roles
SHOW CURRENT ROLES;
顯示用戶的“當前角色”列表。
判斷用戶權限時涉及兩個方面:
用戶是否被賦予相應權限;
用戶所屬角色(可能為多個)是否被賦予相應權限。
默認“當前角色”包含用戶所屬的所有角色,但角色admin除外,即使該用戶屬於角色admin。
所有用戶均可以執行該指令。
Set Role
SET ROLE (role_name|ALL);
如果role_name被指定,則角色role_name成為“當前角色”中的唯一角色。
如果指定role_name為ALL,則會刷新“當前角色”列表,用於用戶被賦予新的角色時使用。
如果用戶並不屬於role_name所代表的角色,則會導致一個錯誤。
Show Roles
SHOW ROLES;
列出當前存在的所有角色。
僅僅角色admin具有該權限。
Grant Role
GRANT role_name [, role_name] ...
TO principal_specification [, principal_specification] ...
[ WITH ADMIN OPTION ];
principal_specification
: USER user
| ROLE role
將一個或多個角色賦予給另一些角色或用戶。
如果指定“WITH ADMIN OPTION”,被賦予角色的用戶可以將相應的角色賦予給其它用戶或角色。
如果上面的Grant語句會導致角色循環,則執行會失敗。
Revoke Role
REVOKE [ADMIN OPTION FOR] role_name [, role_name] ...
FROM principal_specification [, principal_specification] ... ;
principal_specification
: USER user
| ROLE role
從指定的用戶或角色中回收指定的角色。
Show Role Grant
SHOW ROLE GRANT (USER|ROLE) principal_name;
principal_name為用戶或角色名稱。
列出指定用戶或角色被賦予的角色列表。
所有用戶均可以執行該指令。
Show Principals
SHOW PRINCIPALS role_name;
列出屬於指定角色的所有角色和用戶。
僅僅角色admin具有該權限。
管理對象權限
Grant
GRANT
priv_type [, priv_type ] ...
ON table_or_view_name
TO principal_specification [, principal_specification] ...
[WITH GRANT OPTION];
Revoke
REVOKE [GRANT OPTION FOR]
priv_type [, priv_type ] ...
ON table_or_view_name
FROM principal_specification [, principal_specification] ... ;
principal_specification
: USER user
| ROLE role
priv_type
: INSERT | SELECT | UPDATE | DELETE | ALL
如果一個用戶被賦予某表/視圖的權限時曾指定“WITH GRANT OPTION”,則該用戶可以將得到的某表/視圖的權限賦予/回收給其它用戶或角色。
注意:回收權限時,CASCADE在當前版本中是不被支持的,即僅能回收指定用戶或角色的權限,通過這些用戶或角色賦予出去的權限則沒有被回收。
Show Grant
SHOW GRANT [principal_name] ON (ALL| ([TABLE] table_or_view_name)
principal_name為用戶或角色名稱。
附:Hive操作權限列表
Codes
Y: Privilege required.
Y + G: Privilege "WITH GRANT OPTION" required.
Action | Select | Insert | Update | Delete | Ownership | Admin | URI Privilege (RWX Permission + Ownership) |
---|---|---|---|---|---|---|---|
CREATE TABLE | Y (of database) | Y (for create external table – the location) | |||||
DROP TABLE | Y | ||||||
DESCRIBE TABLE | Y | ||||||
SHOW PARTITIONS | Y | ||||||
ALTER TABLE LOCATION | Y | Y (for new location) | |||||
ALTER PARTITION LOCATION | Y | Y (for new partition location) | |||||
ALTER TABLE ADD PARTITION | Y | Y (for partition location) | |||||
ALTER TABLE DROP PARTITION | Y | ||||||
ALTER TABLE (all of them except the ones above) | Y | ||||||
TRUNCATE TABLE | Y | ||||||
CREATE VIEW | Y + G | ||||||
ALTER VIEW PROPERTIES | Y | ||||||
ALTER VIEW RENAME | Y | ||||||
DROP VIEW PROPERTIES | Y | ||||||
DROP VIEW | Y | ||||||
ANALYZE TABLE | Y | Y | |||||
SHOW COLUMNS | Y | ||||||
SHOW TABLE STATUS | Y | ||||||
SHOW TABLE PROPERTIES | Y | ||||||
CREATE TABLE AS SELECT | Y (of input) | Y (of database) | |||||
CREATE INDEX | Y (of table) | ||||||
DROP INDEX | Y | ||||||
ALTER INDEX REBUILD | Y | ||||||
ALTER INDEX PROPERTIES | Y | ||||||
SELECT | Y | ||||||
INSERT | Y | Y (for OVERWRITE) | |||||
UPDATE | Y | ||||||
DELETE | Y | ||||||
LOAD | Y (output) | Y (output) | Y (input location) | ||||
SHOW CREATE TABLE | Y+G | ||||||
CREATE FUNCTION | Y | ||||||
DROP FUNCTION | Y | ||||||
CREATE MACRO | Y | ||||||
DROP MACRO | Y | ||||||
MSCK (metastore check) | Y | ||||||
ALTER DATABASE | Y | ||||||
CREATE DATABASE | Y (if custom location specified) | ||||||
EXPLAIN | Y | ||||||
DROP DATABASE | Y |