HIVE的許可權控制和超級管理員的實現

CoderSunYu發表於2018-09-17

Hive使用者許可權管理

從remote部署hive和mysql後設資料表字典看,已經明確hive是通過儲存在後設資料中的資訊來管理使用者許可權。現在重點是Hive怎麼管理使用者許可權。首先要回答的是使用者是怎麼來的,發現hive有建立角色的命令,但沒有建立使用者的命令,顯然Hive的使用者不是在mysql中建立的。在回答這個問題之前,先初步瞭解下Hive的許可權管理機制。

Hive使用者組和使用者即Linux使用者組和使用者,和hadoop一樣,本身不提供使用者組和使用者管理,只做許可權控制。

一、hive-site.xml 中配置

<property>
<name>hive.users.in.admin.role</name>
<value>root</value>
<description>定義超級管理員 啟動的時候會自動建立Comma separated list of users who are in admin role for bootstrapping.
More users can be added in ADMIN role later.</description>
</property>
<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>
<description>開啟許可權 enable or disable thehive client authorization</description>
</property>
<property>
<name>hive.security.authorization.createtable.owner.grants</name>
<value>ALL</value>
<description>表的建立者對錶擁有所有許可權the privileges automaticallygranted to the owner whenever a table gets created. An example like"select,drop" will grant select and drop privilege to the owner ofthe table</description>
</property>
<property>
<name>hive.security.authorization.task.factory</name>
<value>org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl</value>
<description>進行許可權控制的配置。</description>
</property>
<property>
<name>hive.semantic.analyzer.hook</name>
<value>com.hive.HiveAdmin</value>
<description>使用鉤子程式,識別超級管理員,進行授權控制。</description>
</property>
<property>
<name>hive.users.in.admin.role</name>
<value>root</value>
<description>指定的使用者為admin角色,多個使用者以逗號分隔
Comma separated list of users who are in admin role for bootstrapping.
More users can be added in ADMIN role later.</description>
</property>
複製程式碼

1、自定義Hive許可權管理

在程式碼中指定了Hive的管理員必須為:root、admin、hive 三者(可做成配置檔案或者資料庫)

package com.hive;

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;
import org.apache.hadoop.hive.ql.security;

/**
 *  * Created by Ganymede on 2016/10/4.
 *  * 限制了超級管理員許可權,普通使用者不能授權、建庫、建表等操作
 *   */
public class HiveAdmin extends AbstractSemanticAnalyzerHook {
    private static String[] admin = {"root", "hadoop", "hive"};  //配置Hive管理員

    @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:
            case HiveParser.TOK_CREATETABLE:
                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) && !admin[2].equalsIgnoreCase(userName)) {
                    throw new SemanticException(userName
                            + " can't use ADMIN options, except " + admin[0] + "," + admin[1] + ","
                            + admin[2] + ".");
                }
                break;
            default:
                break;
        }
        return ast;
    }


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

2、打包上傳jar配置相關hive檔案

打包前需將環境配好,我是直接在伺服器打包

先將上述程式碼中依賴的jar包放到$HADOOP_HOME/lib資料夾下

cp /home/hadoop/hadoop3.1/share/hadoop/common/hadoop-common-3.0.2.jar /home/hive/hive3.1/lib
複製程式碼

開始打包

javac -Djava.ext.dirs="/home/hive/hive3.1/lib" HiveAdmin.java -d .
jar cf hive-admin.jar com
# 打包完成後,將hive-admin.jar包拷貝到lib下
cp hive-admin.jar /home/hive/hive3.1/lib
複製程式碼

3、配置完後重啟hive相關的服務

hive --service metastore > metastore.log 2>&1 &
hive --service hiveserver2 > hiveserver2.log 2>&1 &
複製程式碼

二、下面是賦值許可權的一些命令操作:

--設定使用者組,一個使用者可以有多個使用者組,SET ROLE命令會把當前使用者切換到指定的角色組。
set role ADMIN;
--建立和刪除角色  
create role role_name;  
drop role role_name;  
--展示所有roles  
show roles  
--賦予角色許可權  
grant select on database zfs_test to role zfs_role;    
grant select on [table] employee to role user1_1;    
--檢視角色許可權  
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  
--回收角色許可權  
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; 
--檢視使用者被賦予的角色 
show role grant user user1_1;
--檢視所有許可權的分配情況
show grant
--檢視單個角色的許可權分配情況
show grant role zfs_role;

建立和刪除角色 CREATE ROLE ROLE_NAME
刪除角色: DROP ROLE ROLE_NAME
把role_test1角色授權給jayliu使用者,命令如下 grant role role_test1 to user jayliu;
檢視jayliu使用者被授權的角色,命令如下: SHOW ROLE GRANT user jayliu;
取消jayliu使用者的role_test1角色,操作命令如下: revoke role role_test1 from user jayliu;
把某個庫的所有許可權給一個角色,角色給使用者!
grant all on database user_lisi to role role_lisi;
grant role role_lisi to user lisi;
把某個庫的許可權直接給使用者!grant ALL ON DATABASE USER_LISI TO USER lisi;
收回 revoke ALLondatabase default from user lisi;
檢視使用者對資料看的許可權 show grant user lisi on database user_lisi;

複製程式碼

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 允許使用者檢視可用的資料庫

檢視許可權:

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.security.authorization.createtable.owner.grants決定了

建表者對錶擁有的許可權,一版情況下,有select和drop

<property>  
  <name>hive.security.authorization.createtable.owner.grants</name>  
  <value>select,drop</value>  
</property>  
複製程式碼

類似的,特定的使用者可以被在表建立的時候自動授予其許可權。

<property>  
  <name>hive.security.authorization.createtable.user.grants</name>  
  <value>admin,hive:select;user1:create</value>  
</property> 
複製程式碼

當表建立的時候,管理員admin1和使用者edward授予讀所有表的許可權。

而user1只能建立表。

同樣的配置也可以作用於組授權和角色授權

hive.security.authorization.createtable.group.grants
hive.security.authorization.createtable.role.grants
複製程式碼

相關文章