Hive 權(quán)限控制

說明

  • 認證(authentication):驗證用戶所用的身份是否是對的
  • 授權(quán)(authorization):驗證用戶所用身份操作是否有權(quán)限

目前hive(版本0.12.0)支持簡單的權(quán)限管理,默認情況下是不開啟,這樣所有的用戶都具有相同的權(quán)限,同時也是超級管理員,也就對hive中的所有表都有查看和改動的權(quán)利,這樣是不符合一般數(shù)據(jù)倉庫的安全原則的。Hive可以是基于元數(shù)據(jù)的權(quán)限管理,也可以基于文件存儲級別的權(quán)限管理,此次以介紹MetaData權(quán)限管理為主。通過以下配置開啟Hive身份認證功能進行權(quán)限檢查:

配置

1.開啟啟身份認證后,任何用戶必須被grant privilege才能對實體進行操作。
hive.security.authorization.enabled = true

2.表示創(chuàng)建表時自動賦予一些用戶或角色相應(yīng)的權(quán)限
hive.security.authorization.createtable.owner.grants = ALL
hive.security.authorization.createtable.role.grants = admin_role:ALL
hive.security.authorization.createtable.user.grants = user1,user2:select;user3:create

3.<!-- 假如出現(xiàn)以下錯誤: Error while compiling statement: FAILED: SemanticException The current builtin authorization in Hive is incomplete and disabled. 需要配置下面的屬性 -->
hive.security.authorization.task.factory = org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl

角色管理

--創(chuàng)建和刪除角色  
create role role_name;  
drop role role_name;  
--展示所有roles  
show roles  
--賦予角色權(quán)限  
grant select on database db_name to role role_name;    
grant select on [table] t_name to role role_name;    
--查看角色權(quán)限  
show grant role role_name on database db_name;   
show grant role role_name on [table] t_name;   
--角色賦予用戶  
grant role role_name to user user_name  
--回收角色權(quán)限  
revoke select on database db_name from role role_name;  
revoke select on [table] t_name from role role_name;  
--查看某個用戶所有角色  
show role grant user user_name;  

超級權(quán)限

Hive的權(quán)限功能還有一個需要完善的地方,那就是“超級管理員”。
Hive中沒有超級管理員,任何用戶都可以進行Grant/Revoke操作,為了完善“超級管理員”,必須添加hive.semantic.analyzer.hook配置,并實現(xiàn)自己的權(quán)限控制類。

hive.semantic.analyzer.hook = com.mycompany.AuthHook

  1. 編譯下面代碼(需要導(dǎo)入依賴antlr-runtime-3.4.jar,hive-exec-0.12.0-cdh5.1.2.jar)
  2. 打包成jar放置在hive的classpath下(客戶端hive shell所在主機的hive-env.sh 中的環(huán)境變量:HIVE_AUX_JARS_PATH指向的路徑,此配置僅對hive shell生效)
  3. hive-site.xml中添加參數(shù)hive.aux.jars.path(目前僅支持本地路徑) = file:///usr/lib/hive/lib/HiveAuthHook.jar(此配置僅對hive server有效),最后重啟hiveserver。
package com.newland;

import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
import org.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 AuthHook extends AbstractSemanticAnalyzerHook {
    private static String[] admin = { "root", "hadoop" };

    @Override
    public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
            ASTNode ast) throws SemanticException {
        switch (ast.getToken().getType()) {
        case HiveParser.TOK_CREATEDATABASE:
        case HiveParser.TOK_DROPDATABASE:
        case HiveParser.TOK_CREATEROLE:
        case HiveParser.TOK_DROPROLE:
        case HiveParser.TOK_GRANT:
        case HiveParser.TOK_REVOKE:
        case HiveParser.TOK_GRANT_ROLE:
        case HiveParser.TOK_REVOKE_ROLE:
            String userName = null;
            if (SessionState.get() != null
                    && SessionState.get().getAuthenticator() != null) {
                userName = SessionState.get().getAuthenticator().getUserName();
            }
            if (!admin[0].equalsIgnoreCase(userName)
                    && !admin[1].equalsIgnoreCase(userName)) {
                throw new SemanticException(userName
                        + " can't use ADMIN options, except " + admin[0] + ","
                        + admin[1] + ".");
            }
            break;
        default:
            break;
        }
        return ast;
    }

//  public static void main(String[] args) throws SemanticException {
//      String[] admin = { "admin", "root" };
//      String userName = "root";
//      for (String tmp : admin) {
//          System.out.println(tmp);
//          if (!tmp.equalsIgnoreCase(userName)) {
//              throw new SemanticException(userName
//                      + " can't use ADMIN options, except " + admin[0] + ","
//                      + admin[1] + ".");
//          }
//      }
//  }
}

權(quán)限管理

--賦予用戶權(quán)限
grant [SELECT|...] on [database|table] [db_name|tbl_name ] to user [username];
grant select(tab_col) on table [tbl_name] to user [username];
--回收用戶權(quán)限
revoke [ALL|...] on [database|table] [db_name|tbl_name ] from user [username];
--查看用戶權(quán)限
show grant user [username] on [database|table] [db_name|tbl_name];  

HIVE支持以下權(quán)限:
權(quán)限名稱 含義
ALL 所有權(quán)限
ALTER 允許修改元數(shù)據(jù)(modify metadata data of object)---表信息數(shù)據(jù)
UPDATE 允許修改物理數(shù)據(jù)(modify physical data of object)---實際數(shù)據(jù)
CREATE 允許進行Create操作
DROP 允許進行DROP操作
INDEX 允許建索引(目前還沒有實現(xiàn))
LOCK 當出現(xiàn)并發(fā)的使用允許用戶進行LOCK和UNLOCK操作
SELECT 允許用戶進行SELECT操作
SHOW_DATABASE 允許用戶查看可用的數(shù)據(jù)庫

附:

登錄hive元數(shù)據(jù)庫,可以發(fā)現(xiàn)以下表:
Db_privs:記錄了User/Role在DB上的權(quán)限
Tbl_privs:記錄了User/Role在table上的權(quán)限
Tbl_col_privs:記錄了User/Role在table column上的權(quán)限
Roles:記錄了所有創(chuàng)建的role
Role_map:記錄了User與Role的對應(yīng)關(guān)系

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容