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底层的訪问控制。

时间: 2024-12-22 01:22:14

Hive权限之改进的相关文章

HADOOP docker(七):hive权限管理

1. hive权限简介1.1 hive中的用户与组1.2 使用场景1.3 权限模型1.3 hive的超级用户2. 授权管理2.1 开启权限管理2.2 实现超级用户2.3 实现hiveserver2用户名密码2.4 授权2.4.1 角色管理2.4.2 权限管理2.4.3 操作与权限对应关系 文档链接: hive权限管理 https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization#LanguageManu

Hive权限之审计

由于在生产环境中大量使用hive,而hive的权限又较弱,如果可以记录所有hive操作,在增强安全性的同时,还能够统计hive表的使用频率:同时如果能够记录hql的开始和结束时间,则能够找出系统中花费时间较多的job,针对性的进行优化,因此跟踪hive的使用轨迹,增强安全的同时也能方便问题定位.如何记录用户操作了?Hive Hook为我们提供的方便的开放接口. 我们对hive的使用主要有两种使用场景,一是平时直接在命令行下执行的hql操作,此时执行hql的实体就是OS的登录用户:另外一种是从we

hive权限管理

1开启hive权限管理配置 <property> <name>hive.metastore.authorization.storage.checks</name> <value>true</value> </property> <property><name>hive.metastore.execute.setugi</name><value>false</value><

Hive权限介绍

一.开启权限 目前hive支持简单的权限管理,默认情况下是不开启,这样所有的用户都具有相同的权限,同时也是超级管理员,也就对hive中的所有表都有查看和改动的权利,这样是不符合一般数据仓库的安全原则的.Hive可以是基于元数据的权限管理,也可以基于文件存储级别的权限管理,此次以介绍MetaData权限管理为主.通过以下配置开启Hive身份认证功能进行权限检查: <property> <name>hive.security.authorization.enabled</name

Hive权限控制中间层-Hamza

1.产品概述 Hive作为大数据时代的数据仓库工具,使我们分析处理海量结构化数据成为可能.越来越多的公司和机构都将Hive作为应对大数据分析的强有力工具.但使用中,比较明显的问题便是当存在多个应用同时使用同一Hive的时候,如何有效控制彼此的数据安全,如何更方便使用Hive UDF的扩展机制. 当然,作为大数据平台开发过程中也同样遇到这些问题.整个公司不同业务方的数据汇聚到数据平台后,对数据的隔离访问尤为重要.在参考Cloudera Sentry项目的基础上,我们结合自身平台需求,开发了Hamz

hive的用户和用户权限

hive的用户和用户权限 HiverServer2支持远程多客户端的并发和认证,支持通过JDBC.Beeline等连接操作.hive默认的Derby数据库,由于是内嵌的文件数据库,只支持一个用户的操作访问,支持多用户需用mysql保存元数据.现在关心的是HiveServer如何基于mysql元数据库管理用户权限,其安全控制体系与Linux及Hadoop的用户是否存在联系. 1)remote方式部署Hive Hive中metastore(元数据存储)的三种方式:内嵌Derby方式.基于mysql的

在hue当中设置hive当中数据库的控制权限。

这段时间在搞大数据的集群搭建工作,并且安装了hive的服务,但是没有对其中的数据库的操作权限做限制,每个人都可以对数据库进行增删改查.今天有空做了一下了对hive数据库当中的数据库做一些限制. 我们都是在hue的客户端进行操作hive当中的数据库.操作如下: (1)在hue界面创建登录用户: (2)   配置hive权限控制 <property> <name>hive.security.authorization.enabled</name> <value>

HADOOP docker(六):hive简易使用指南

前言1.hive简介1.1 hive组件与相应功能:1.2 hive的表类型1.3 分区表1.3 分隔符1.4 hive的数据存储2.数据类型2.1 基本数据类型2.1 复杂数据类型2.3 NULL3.基本操作3.1 数据库操作3.2 表操作3.3 视图3.4 数据导入导出3.hsql3.1 hsql基本操作3.2 hive内置函数3.2 自定义函数3.3 注册函数4.hive权限管理4.1 权限简介4.2 权限分类4.3 授权管理5.hive优化 前言 本手册介绍了hive的基本知识及工作中要

实现hive proxy2-hive操作hadoop时使用用户的地方

hive权限有两层,hive本身的验证和hadoop的验证.自定义hive的proxy功能时,hive层面的相关验证更改在http://caiguangguang.blog.51cto.com/1652935/1587251 中已经提过,这里说下hive和hadoop以及本地文件系统相关的几个出现用户的地方:1.job的log文件 session初始化时会初始化日志文件,主要在SessionState的start方法中:     public static SessionState start(