Hive權限控制和超級管理員的實現

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中的超級管理員

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;  

發佈了34 篇原創文章 · 獲贊 57 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章