Hive權限機制:
Hive從0.10可以通過元數據控制權限。但是Hive的權限控制並不是完全安全的。基本的授權方案的目的是防止用戶不小心做了不合適的事情。
先決條件:
爲了使用Hive的授權機制,有兩個參數必須在hive-site.xml中設置:
<property> <name>hive.security.authorization.enabled</name> <value>true</value> <description>enable or disable the hive client authorization</description> </property> <property> <name>hive.security.authorization.createtable.owner.grants</name> <value>ALL</value> <description>the privileges automatically granted to the owner whenever a table gets created. An example like "select,drop" will grant select and drop privilege to the owner of the table</description> </property> |
含義分別是開啓權限驗證;表的創建者對錶擁有所有權限
hive.security.authorization.createtable.owner.grants默認值爲NULL,所以表的創建者無法訪問該表,這明顯是不合理的。
用戶,組,角色:
Hive授權的核心就是用戶、組、角色。
Hive中的角色和平常我們認知的角色是有區別的。Hive中的角色可以理解爲一部分有一些相同“屬性”的用戶或組或角色的集合。這裏有個遞歸的概念,就是一個角色可以是一些角色的集合。
用戶 組
張三 G_db1
李四 G_db2
王五 G_bothdb
如上有三個用戶分別屬於G_db1、G_db2、G_alldb。G_db1、G_db2、G_ bothdb分別表示該組用戶可以訪問數據庫1、數據庫2和可以訪問1、2兩個數據庫。現在可以創建role_db1和role_db2,分別並授予訪問數據庫1和數據庫2的權限。這樣只要將role_eb 1賦給G_db1(或者該組的所偶用戶),將role_eb2賦給G_db2,就可以是實現指定用戶訪問指定數據庫。最後創建role_bothdb指向role_db1、role_db2(role_bothdb不需要指定訪問那個數據庫),然後role_bothdb授予G_bothdb,則G_bothdb中的用戶可以訪問兩個數據庫。
使用和組使用的是Linux機器上的用戶和組,而角色必須自己創建。
注意:如果有一個屬於組bar的用戶foo,他通過cli連接到遠程的Server上執行操作,而遠程的Server上有一個用戶foo屬於baz組,則在權限控制中foo是對應的baz組的。
角色的創建、刪除、使用:
創建和刪除:
CREATE ROLE ROLE_NAME
DROP ROLE ROLE_NAME
grant/revoke:
GRANT ROLE role_name [, role_name] ... TO principal_specification [, principal_specification] ...
REVOKE ROLE role_name [, role_name] ... FROM principal_specification [, principal_specification] ...
principal_specification :
USER user | GROUP group | ROLE role
查看用戶\組\角色的角色: SHOW ROLE GRANT principal_specification
示例:
create role testrole;
grant role testrole to user yinxiu;
SHOW ROLE GRANT user yinxiu;
OK
role name:testrole
role name:testrole
Time taken: 0.01 seconds
revoke role testrole from user yinxiu;
權限:
HIVE支持以下權限:
權限名稱 | 含義 |
ALL | 所有權限 |
ALTER | 允許修改元數據(modify metadata data of object)---表信息數據 |
UPDATE | 允許修改物理數據(modify physical data of object)---實際數據 |
CREATE | 允許進行Create操作 |
DROP | 允許進行DROP操作 |
INDEX | 允許建索引(目前還沒有實現) |
LOCK | 當出現併發的使用允許用戶進行LOCK和UNLOCK操作 |
SELECT | 允許用戶進行SELECT操作 |
SHOW_DATABASE | 允許用戶查看可用的數據庫 |
常用的:ALL、CREATE、SELECT(目前qihe2061上只使這三種)
GRANT\REVOKE:
GRANT priv_type [(column_list)] [, priv_type [(column_list)]] ... [ON object_type] TO principal_specification [, principal_specification] ... [WITH GRANT OPTION]
REVOKE priv_type [(column_list)] [, priv_type [(column_list)]] ... [ON object_type priv_level] FROM principal_specification [, principal_specification] ...
REVOKE ALL PRIVILEGES, GRANT OPTION FROM user [, user] ...
object_type:
TABLE | DATABASE
priv_level:
db_name | tbl_name
示例:
grant select on database default to user xiaohai;
revoke all on database default from user yinxiu;
show grant user xiaohai on database default;
注意:[WITH GRANT OPTION]選項在試驗的時候並沒有生效
查看權限:
SHOW GRANT principal_specification [ON object_type priv_level [(column_list)]]
HIVE操作和權限之間的關係
As of the release of Hive 0.7, only these operations require permissions, according to org.apache.hadoop.hive.ql.plan.HiveOperation:
Operation | ALTER | UPDATE | CREATE | DROP | INDEX | LOCK | SELECT | SHOW_DATABASE |
LOAD | √ | |||||||
EXPORT | √ | |||||||
IMPORT | √ | √ | ||||||
CREATE TABLE | √ | |||||||
CREATE TABLE AS SELECT | √ | √ | ||||||
DROP TABLE | √ | |||||||
SELECT | √ | |||||||
ALTER TABLE ADD COLUMN | √ | |||||||
ALTER TABLE REPLACE COLUMN | √ | |||||||
ALTER TABLE RENAME | √ | |||||||
ALTER TABLE ADD PARTITION | √ | |||||||
ALTER TABLE DROP PARTITION | √ | |||||||
ALTER TABLE ARCHIVE | √ | |||||||
ALTER TABLE UNARCHIVE | √ | |||||||
ALTER TABLE SET PROPERTIES | √ | |||||||
ALTER TABLE SET SERDE | √ | |||||||
ALTER TABLE SET SERDEPROPERTIES | √ | |||||||
ALTER TABLE CLUSTER BY | √ | |||||||
ALTER TABLE PROTECT MODE | √ | |||||||
ALTER PARTITION PROTECT MODE | √ | |||||||
ALTER TABLE SET FILEFORMAT | √ | |||||||
ALTER TABLE SET LOCATION | √ | |||||||
ALTER PARTITION SET LOCATION | √ | |||||||
ALTER TABLE CONCATENATE | √ | |||||||
ALTER PARTITION CONCATENATE | √ | |||||||
SHOW DATABASE | √ | |||||||
LOCK TABLE | √ | |||||||
UNLOCK TABLE | √ |
HIVE本身有權限管理功能,需要通過配置開啓。
<property>
<name>hive.metastore.authorization.storage.checks</name>
<value>true</value>
</property>
<property>
<name>hive.metastore.execute.setugi</name>
<value>false</value>
</property>
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.security.authorization.createtable.owner.grants</name>
<value>ALL</value>
</property>
其中hive.security.authorization.createtable.owner.grants設置成ALL表示用戶對自己創建的表是有所有權限的(這樣是比較合理地)。
開啓權限控制有Hive的權限功能還有一個需要完善的地方,那就是“超級管理員”。
Hive中沒有超級管理員,任何用戶都可以進行Grant/Revoke操作,爲了完善“超級管理員”,必須添加hive.semantic.analyzer.hook配置,並實現自己的權限控制類。
1 /* 2 * Copyright (c) 2010-2013 All Rights Reserved. 3 * 4 * Author : 5 * Version :1.0 6 * Create Date:2013-6-13 7 */ 8 package com.xxx.hive; 9 10 import org.apache.hadoop.hive.ql.parse.ASTNode; 11 import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook; 12 import org.apache.hadoop.hive.ql.parse.HiveParser; 13 import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext; 14 import org.apache.hadoop.hive.ql.parse.SemanticException; 15 import org.apache.hadoop.hive.ql.session.SessionState; 16 17 /** 18 * 設置Hive超級管理員 19 * 20 * @author 21 * @version $Id: AuthHook.java,v 0.1 2013-6-13 下午3:32:12 yinxiu Exp $ 22 */ 23 public class AuthHook extends AbstractSemanticAnalyzerHook { 24 private static String admin = "xxxxxx"; 25 26 @Override 27 public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context, 28 ASTNode ast) throws SemanticException { 29 switch (ast.getToken().getType()) { 30 case HiveParser.TOK_CREATEDATABASE: 31 case HiveParser.TOK_DROPDATABASE: 32 case HiveParser.TOK_CREATEROLE: 33 case HiveParser.TOK_DROPROLE: 34 case HiveParser.TOK_GRANT: 35 case HiveParser.TOK_REVOKE: 36 case HiveParser.TOK_GRANT_ROLE: 37 case HiveParser.TOK_REVOKE_ROLE: 38 String userName = null; 39 if (SessionState.get() != null 40 && SessionState.get().getAuthenticator() != null) { 41 userName = SessionState.get().getAuthenticator().getUserName(); 42 } 43 if (!admin.equalsIgnoreCase(userName)) { 44 throw new SemanticException(userName 45 + " can't use ADMIN options, except " + admin + "."); 46 } 47 break; 48 default: 49 break; 50 } 51 return ast; 52 } 53 }
添加了控制類之後還必須添加下面的配置:
<property>
<name>hive.semantic.analyzer.hook</name>
<value>com.xxx.AuthHook</value>
</property>
(若有使用hiveserver,hiveserver必須重啓)
至此,只有xxxxxx用戶可以進行Grant/Revoke操作。
權限操作示例:
grant select on database default to user xiaohai;
revoke all on database default from user yinxiu;
show grant user xiaohai on database default;