hive權限控制介紹

Hive從0.10版本(包含0.10版本)以後可以通過元數據來控制權限,Hive-0.10之前的版本對權限的控制主要是通過Linux的用戶和用戶組來控制,不能對Hive表的CREATE、SELECT、DROP等操作進行控制,當然Hive基於元數據來控制權限也不是完全安全的,目的就是爲了防止用戶不小心做了不該做的操作。

在使用Hive的元數據配置權限之前必須現在hive-site.xml中配置兩個參數,配置參數如下:

<property> 
    <name>hive.security.authorization.enabled</name> 
    <value>true</value> 
    <description>enable or disable the hive clientauthorization</description>
</property>
<property> 
    <name>hive.security.authorization.createtable.owner.grants</name> 
    <value>ALL</value> 
    <description>the privileges automatically granted to the ownerwhenever a table gets created. An example like "select,drop" willgrant select and drop privilege to the owner of the table</description>
    </property>
  • hive.security.authorization.enabled參數是開啓權限驗證,默認爲false。
  • hive.security.authorization.createtable.owner.grants參數是指表的創建者對錶擁有所有權限,例如創建一個表table1,這個用戶對錶table1擁有SELECT、DROP等操作。還有個值是NULL,表示表的創建者無法訪問該表,這個肯定是不合理的。

Hive授權的核心就是用戶(User)、組(Group)、角色(Role),Hive中的角色和平常認知的角色是有區別的。Hive中的角色可以理解爲一部分有一些相同“屬性”的用戶或組或角色的集合。這裏有個遞歸的概念,就是一個角色可以是一些角色的集合。

舉個例子:

用戶     組
張三   group_db1
李四   group_db2
王五  group_bothdb

有三個用戶分別屬於group_db1group_db2group _bothdbgroup _db1group _db2group _bothdb分別表示該組用戶可以訪問數據庫1、數據庫2和可以訪問1、2兩個數據庫。現在可以創建role_db1role_db2,分別並授予訪問數據庫1和數據庫2的權限。這樣只要將role_db1賦給group_db1(或者該組的所有用戶),將role_db2賦給group_db2,就可以是實現指定用戶訪問指定數據庫。最後創建role_bothdb指向role_db1role_db2role_bothdb不需要指定訪問那個數據庫),然後role_bothdb授予group_bothdb,則group_bothdb中的用戶可以訪問兩個數據庫。

用戶和組使用的是Linux機器上的用戶和組,而角色必須自己創建。

注意:如果有一個屬於組group1的用戶jayliu,他通過cli連接到遠程的Server上執行操作,而遠程的Server上有一個用戶jayliu屬於group2組,則在權限控制中jayliu是對應的group2組的。

1、創建和刪除角色

Hive中的角色定義與關係型數據庫中角色的定義類似,它是一種機制,給予那些沒有適當權限的所有用戶分配一定的權限。下面介紹一下Hive中角色的應用。

1)角色的創建。語法:

CREATE ROLE ROLE_NAME

創建一個role_test1角色,命令如下:

hive> create rolerole_test1;
OK
Time taken: 0.106 seconds

2)刪除角色。語法:

DROP ROLE ROLE_NAME

刪除role_test1角色,命令如下:

hive> DROP ROLErole_test1;
OK
Time taken: 6.483 seconds

2、角色的授權和撤銷

角色的授權(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

看下面的實例。

1)把role_test1角色授權給jayliu用戶,命令如下:

hive> grant rolerole_test1 to user jayliu;
OK
Time taken: 0.102 seconds

2)查看jayliu用戶被授權的角色,命令如下:

hive> SHOW ROLE GRANTuser jayliu;
OK
role name:role_test1
role name:role_test1
Time taken: 7.913 seconds,Fetched: 2 row(s)

3)取消jayliu用戶的role_test1角色,操作命令如下:

hive> revoke rolerole_test1 from user jayliu;
OK
Time taken: 0.189 seconds

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 允許用戶查看可用的數據庫

看下面的實例:

1)把select權限授權給jayliu用戶,命令如下:

hive> grant select ondatabase default to user jayliu;   
OK
Time taken: 0.188 seconds

2)查看jayliu被授予那些操作權限,命令如下:

hive> show grant userjayliu on database default;
OK
database       default        
principalName        jayliu  
principalType USER         
privilege         Select         
grantTime      Thu Jul 11 18:17:39 CST 2013        
grantor root   
Time taken: 7.615 seconds,Fetched: 7 row(s)

3)收回jayliu的select權限,操作如下:

hive> revoke select ondatabase default from user jayliu;
OK
Time taken: 0.147 seconds

4)查看jayliu用戶擁有那些權限:

hive> show grant userjayliu on database default;        
OK
Time taken: 0.032 seconds

3、超級管理員權限

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)編寫編寫權限控制類,代碼清單hive\udaf\ AvgUDAF.java

package com.autoNavi.hive;

importorg.apache.hadoop.hive.ql.parse.ASTNode;
importorg.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
importorg.apache.hadoop.hive.ql.parse.HiveParser;
import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.session.SessionState;

public class  HiveAdmin extends AbstractSemanticAnalyzerHook {
private static String admin = "admin";
   @Override
public ASTNodepreAnalyze(HiveSemanticAnalyzerHookContextcontext,
ASTNodeast) throws SemanticException {
switch (ast.getToken().getType()) {
caseHiveParser.TOK_CREATEDATABASE:
caseHiveParser.TOK_DROPDATABASE:
caseHiveParser.TOK_CREATEROLE:
caseHiveParser.TOK_DROPROLE:
caseHiveParser.TOK_GRANT:
caseHiveParser.TOK_REVOKE:
caseHiveParser.TOK_GRANT_ROLE:
caseHiveParser.TOK_REVOKE_ROLE:
             StringuserName = null;
if (SessionState.get() != null
&&SessionState.get().getAuthenticator() != null){
userName=SessionState.get().getAuthenticator().getUserName();
            }
if (!admin.equalsIgnoreCase(userName)) {
thrownewSemanticException(userName
                        + " can't use ADMIN options, except " + admin +".");
            }
break;
default:
break;
        }
returnast;
    }
}

2)添加控制類HiveAdmin到Hive的配置文件(hive-site.xml)中,代碼如下所示:

<property> 
    <name>hive.semantic.analyzer.hook</name> 
    <value>com.autonavi.hive.HiveAdmin</value> 
</property>

添加了配置文件以後,如果啓動了Hive Server,必須關閉重啓功能才能生效。

至此,只有admin用戶可以進行Grant/Revoke操作。例如,jayliu用戶啓動Hive的Shell命令,把default數據庫中的所有表的查詢(SELECT)授權給用戶hadoop,命令如下:

hive> GRANT SELECT ON DATABASEdefault TO USER hadoop;
FAILED:SemanticExceptionjayliu can't use ADMIN options, except admin.

Hive的權限控制在Hive的生產環境中使用的非常多,在0.10版本之前Hive是沒有提供這個功能的。讀者使用這個功能的時候一定要確保Hive的版本在0.10以後。


轉自:http://www.aboutyun.com/thread-12549-1-1.html

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