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
複製程式碼