Hive权限之改进
不足
即使开启hive权限认证的情况下,不论什么用户仍然是超级用户。能够通过grant给不论什么人赋予不论什么权限,这样权限认证基本没有意义。因此必须在开启权限认证的同一时候。对运行grant/revoke的实体进行限制,比方仅仅有admin才干 grant privilege on database,仅仅有table owner才干grant privilege on table。BIP中hive眼下是没有开启权限认证的。
改进
针对hive权限的不足以及bip对hive的使用场景。改进后的hive权限认证有一个拥有超级权限的角色admin_role, 即admin_role拥有没有开启权限认证时候一样的全部权限。拥有admin_role的用户就是admin,而普通用户仅仅有是某个实体的owner或者被grant相应的权限时才干在这个实体上进行相应的操作。详细体如今一下几点:
1、 DB上的权限:BIP的hive_warehouse中仅仅有一个DB,也即默认的DB default,仅仅有admin才干对DB上权限进行管理,主要有:create/drop database、grant/revoke privilege on database
2、 Table/Column上的权限:普通用户仅仅有在被pplive grant create on database后才干创建表。一个表在被创建后,admin_role和owner拥有all也即全部的权限,同一时候仅仅有对table拥有all权限才干grant/revoke privilege on table。其它用户或拥有的role被grant相应权限后就能进行相应的操作
3、 Role上的权限:仅仅有admin_role才有权create/drop role,因此也就仅仅有admin才干对role进行权限相关的操作
4、 仅仅有admin_role拥有代理权限,即admin_role能够转换为bip.user用户进行hive的一切操作,此时创建、读写表都是以代理的bip.user的身份去运行,适用于bip web场景
Hive对hql的解析主要有词法分析、语法分析、语义分析和运行四步,词法分析和语法分析主要是形成抽象语法树AST。确保hql语法的正确性,语义分析则是将AST翻译成task并分析task间的关系形成有向无环图DAG。终于运行引擎则将DAG中task提交给Hadoop运行并监控task的运行状态。Hive通过在语义分析中进行权限验证。检查用户是否对运行hql所操作的table和column有对应的权限。同一时候开放了hook让我们能够对语义分析的输入和输出进行操作,下面属性能够配置语义分析hook类:
<property>
<name>hive.semantic.analyzer.hook</name>
<value>com.bip.hive.auth.AuthHook></value>
</property>
语义分析hook类须继承抽象类AbstractSemanticAnalyzerHook,可实现preAnalyze进行语义分析前检查,实现postAnalyze进行语义分析后操作,而自己定义的操作限制是在preAnalyze中实现,利用语义分析后结果自己定义权限规则可在postAnalyze中实现。
我们在Semantic Hook中获取用户的身份,推断用户能否运行某种操作。进而区分了admin和非admin的运行权限。
preAnalyze限制操作类型代码演示样例:
public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
ASTNode ast) throws SemanticException {
String userName = null;
// userName = context.getUserName();
//String command = context.getCommand();
if (SessionState.get() != null
&& SessionState.get().getAuthenticator() != null) {
userName = SessionState.get().getAuthenticator().getUserName();
}
switch (ast.getToken().getType()) {
case HiveParser.TOK_CREATEDATABASE:
case HiveParser.TOK_DROPDATABASE:
case HiveParser.TOK_CREATEROLE:
case HiveParser.TOK_DROPROLE:
case HiveParser.TOK_GRANT_ROLE:
case HiveParser.TOK_REVOKE_ROLE:
case HiveParser.TOK_CREATETABLE:
case HiveParser.TOK_DROPTABLE:
if (!AdminManager.isAdmin(userName)) {
throw new SemanticException(userName + " is not admin, expect admin privilege");
}
break;
case HiveParser.TOK_GRANT:
case HiveParser.TOK_REVOKE:
if(!AdminManager.isAdmin(userName)) {
int childCount = ast.getChildCount();
if(childCount>2) {
for (int i = 2; i < ast.getChildCount(); i++) {
ASTNode astChild = (ASTNode) ast.getChild(i);
if (astChild.getType() == HiveParser.TOK_PRIV_OBJECT && !grantRevokeCheck(astChild, userName)) {
throw new SemanticException(userName+" doesn't have grank/revoke privilege on the table ");
}
}
}
}
break;
default:
break;
}
return ast;
}
postAnalyze自己定义权限检查代码演示样例:
public void postAnalyze(HiveSemanticAnalyzerHookContext context,List<Task<?
extends Serializable>> rootTasks) throws SemanticException {
Hive hive = null;
try {
hive = context.getHive();
} catch (HiveException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
Set<ReadEntity> inputs = context.getInputs();
Set<WriteEntity> outputs = context.getOutputs();
Set<String> readTables = new HashSet<String>();
for(ReadEntity input : inputs) {
Table table = input.getT();
if(table!=null) {
readTables.add(table.getTableName());
}
}
Set<String> writeTables = new HashSet<String>();
for(WriteEntity output : outputs) {
Table table = output.getT();
if(table!=null) {
writeTables.add(table.getTableName());
}
}
String userName = SessionState.get().getAuthenticator().getUserName();
logger.debug(String.format("%s execute %s, read tables:%s, write tables:%s", userName, context.getCommand(), readTables, writeTables));
privDataProvider.checkHivePriv(userName, readTables, writeTables);
}
Hive默认使用HadoopDefaultAuthenticator获取运行hql的用户,并使用其返回的用户进行权限验证。为了使hive可以以代理的模式去运行,我们须要提供自己的authenticator,返回设置的bip.user作为真正的hql运行者。下面配置可设置authenticator:
<property>
<name>hive.security.authenticator.manager</name>
<value>com.pplive.bip.hive.auth.Authenticator</value>
<description>bip user authenticator</description>
</property>
眼下admin通过在hive命令行定义bip.user变量启动hive可进入代理模式:
Hive -d bip.user=xxx 或 hive --define bip.user=xxx
Memo
Hive也提供group权限管理功能,在role已经可以满足需求的情况下不建议进行group相关的权限管理。
通过对hive权限管理的改进,能够防止非法用户对没有权限的表、列进行读写删除操作,同一时候能够对运行的hql进行审计,分析hql的运行时间和频率以及hive表的使用频率。
基于MetaData的权限管理相关的权限信息是存储在hive metadata中,事实上也能够将权限信息存储在我们自己db中,这样就能自己把握权限控制的规则。不用开启hive的权限控制,在SemanticAnalyze之后基于我们的规则对hql所读写的表、字段进行控制。
然而,即使是改进后的hive权限依旧较弱,由于hive全部权限相关的信息都存储在MetaData中。仅仅要用户知道了存储MetaData的Mysqlusername和password就能够随意改动权限MetaData, 而连接MetaData Mysql的信息在hive-site.xml中是明文配置的,因此最安全权限是基于Storage底层的訪问控制。
Hive权限之改进的更多相关文章
- Winform开发框架之权限管理系统改进的经验总结(4)-一行代码实现表操作日志记录
在前面介绍了几篇关于我的权限系统改进的一些经验总结,本篇继续这一系列主体,介绍如何一行代码实现重要表的操作日志记录.我们知道,在很多业务系统里面,数据是很敏感的,特别对于一些增加.修改.删除等关键的操 ...
- Winform开发框架之权限管理系统改进的经验总结(2)-用户选择界面的设计
在上篇总结随笔<Winform开发框架之权限管理系统改进的经验总结(1)-TreeListLookupEdit控件的使用>介绍了权限管理模块的用户管理部分,其中主要介绍了其中的用户所属公司 ...
- Hive权限控制和超级管理员的实现
Hive权限控制 Hive权限机制: Hive从0.10可以通过元数据控制权限.但是Hive的权限控制并不是完全安全的.基本的授权方案的目的是防止用户不小心做了不合适的事情. 先决条件: 为了使用Hi ...
- hive权限管理之实践
一.实践心得 主要参考这个连接,里面说得也挺详细的.http://www.aboutyun.com/thread-12549-1-1.html 总结如下: 1.若赋予用户某个表的权限,查用户在该表所属 ...
- hive权限配置
基于CDH5.x的Hive权限配置 1.打开权限控制,默认是没有限制的 set hive.security.authorization.enabled=true; 2.配置默认权限 hive.secu ...
- Hive记录-hive权限控制
在使用Hive的元数据配置权限之前必须现在hive-site.xml中配置两个参数,配置参数如下: <property> <name>hive.security.authori ...
- Hive权限管理
最近遇到一个hive权限的问题,先简单记录一下,目前自己的理解不一定对,后续根据自己的理解程度更新 一.hive用户的概念 hive本身没有创建用户的命令,hive的用户就是Linux用户,若当前是用 ...
- HADOOP docker(七):hive权限管理
1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户 ...
- Hive权限管理(十)
Hive权限管理 1.hive授权模型介绍 (1)Storage Based Authorization in the Metastore Server 基于存储的授权 - 可以对Metastore中 ...
随机推荐
- 在Spring Boot中使用Spring-data-jpa实现分页查询
转自:https://www.cnblogs.com/sandea/p/8275890.html 在我们平时的工作中,查询列表在我们的系统中基本随处可见,那么我们如何使用jpa进行多条件查询以及查询列 ...
- thinkphp 内存查询表 防止多次查库
//从内存查询 表 以防止多次查库 private static function selectTable($tableName,array $where,$getFirst=false){ $res ...
- Gym-101915J The Volcano Eruption 计算几何
题面 题意:给你一个矩阵,然后有很多的圆,这些圆可能相交着,一个或者几个就导致这个矩形被分割开了,就是从最下面的边到上面的边,连线被这些圆阻隔了,每一堆圆当做一个阻碍,问一共有几个阻碍 题解:看起来好 ...
- 原生JS通过勾股定理计算苹果菜单效果
JS原生苹果菜单效果 知识点: 勾股定理 a²+b²=c² Event 是一个事件对象,当一个事件发生后,和当前事件发生相关的详细信息会被临时存储到一个指定的地方,也就是event对象,以方便我们在需 ...
- CI中的超级对象
CI中的超级对象就是当前控制器对象,它提供了很多属性,可以通过var_dump($this)打印所有的超级对象: load可以理解为一个加载器,加载了很多功能,可以理解为当你使用 $this -> ...
- 洛谷P1208 [USACO1.3]混合牛奶 Mixing Milk(贪心)
题目描述 由于乳制品产业利润很低,所以降低原材料(牛奶)价格就变得十分重要.帮助Marry乳业找到最优的牛奶采购方案. Marry乳业从一些奶农手中采购牛奶,并且每一位奶农为乳制品加工企业提供的价格是 ...
- [OpenWrt]安装mjpg-streamer
安装mjpg-streamer 远程监控基本上是wifi小车的一个必备功能了.摄像头我用的是奥尼百脑通 D881,这个要100左右. 确认安装了以下软件: kmod-usb2 kmod-video-u ...
- Android Studio复制项目 两个App之间不覆盖安装操作步骤
步骤一:修改包名 第五步注意:不能以数字等作为包名的开头. 步骤二:修改清单文件里面的包名 第八步注意:如果报红,从新引入新的包名下的Mainactivity类. 步骤三:修改Gradle Scrip ...
- MySQL 5.6 Reference Manual-14.4 InnoDB Configuration
14.4 InnoDB Configuration 14.4.1 InnoDB Initialization and Startup Configuration 14.4.2 Configuring ...
- 在YII2中使用redis
一.安装YII2的redis扩展 composer require --prefer-dist yiisoft/yii2-redis 二. 配置basic/config/web.php 在compon ...