Hive用户权限管理
从remote部署hive和mysql元数据表字典看,已经明确hive是通过存储在元数据中的信息来管理用户权限。现在重点是Hive怎么管理用户权限。首先要回答的是用户是怎么来的,发现hive有创建角色的命令,但没有创建用户的命令,显然Hive的用户不是在mysql中创建的。在回答这个问题之前,先初步了解下Hive的权限管理机制。
Hive用户组和用户即Linux用户组和用户,和hadoop一样,本身不提供用户组和用户管理,只做权限控制。
一、hive-site.xml 中配置
hive.users.in.admin.role
root
定义超级管理员 启动的时候会自动创建Comma separated list of users who are in admin role for bootstrapping.
More users can be added in ADMIN role later.
hive.metastore.authorization.storage.checks
true
hive.metastore.execute.setugi
false
hive.security.authorization.enabled
true
开启权限 enable or disable thehive client authorization
hive.security.authorization.createtable.owner.grants
ALL
表的创建者对表拥有所有权限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
hive.security.authorization.task.factory
org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl
进行权限控制的配置。
hive.semantic.analyzer.hook
com.hive.HiveAdmin
使用钩子程序,识别超级管理员,进行授权控制。
hive.users.in.admin.role
root
指定的用户为admin角色,多个用户以逗号分隔
Comma separated list of users who are in admin role for bootstrapping.
More users can be added in ADMIN role later.
复制代码
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
hive.security.authorization.createtable.owner.grants
select,drop
复制代码
类似的,特定的用户可以被在表创建的时候自动授予其权限。
hive.security.authorization.createtable.user.grants
admin,hive:select;user1:create
复制代码
当表建立的时候,管理员admin1和用户edward授予读所有表的权限。
而user1只能创建表。
同样的配置也可以作用于组授权和角色授权
hive.security.authorization.createtable.group.grants
hive.security.authorization.createtable.role.grants
复制代码