Hive权限之审计

由于在生产环境中大量使用hive,而hive的权限又较弱,如果可以记录所有hive操作,在增强安全性的同时,还能够统计hive表的使用频率;同时如果能够记录hql的开始和结束时间,则能够找出系统中花费时间较多的job,针对性的进行优化,因此跟踪hive的使用轨迹,增强安全的同时也能方便问题定位。如何记录用户操作了?Hive Hook为我们提供的方便的开放接口。

我们对hive的使用主要有两种使用场景,一是平时直接在命令行下执行的hql操作,此时执行hql的实体就是OS的登录用户;另外一种是从webapp获取的业务数据需求人员创建定时报表的hql脚本,此时执行hql的真正实体其实是报表创建者,系统仅仅是代理执行而已,此时记录用户的行为则需要重写hive.security.authenticator.manager。

Hive默认使用HadoopDefaultAuthenticator获取执行hql的用户,使用其返回的用户进行权限验证。为了使hive能够以代理的模式去执行,我们需要提供自己的authenticator,返回真正的hql执行者,以下配置可设置authenticator:

<property>

<name>hive.security.authenticator.manager</name>

<value>com.pplive.bip.hive.auth.Authenticator</value>

<description>bip user authenticator</description>

</property>

只有管理员可以开启代理模式,可以使用以下方式传递代理用户:

Hive -d bip.user=xxx 或 hive --define bip.user=xxx

重写authenticator代码示例:

public
class
Authenticator implements HiveAuthenticationProvider {

private
finalstatic
String BIP_USER="bip.user";

privateStringuserName;

privateStringbipUser;

privateList<String>groupNames;

privateConfigurationconf;

@Override

publicList<String> getGroupNames() {

returngroupNames;

}

@Override

publicStringgetUserName() {

this.bipUser = SessionState.get().getHiveVariables().get(BIP_USER);

if(this.bipUser !=null &&!this.bipUser.isEmpty())
{

if( AdminManager.isAdmin(this.userName)) {

returnthis.bipUser;

} else {

thrownewRuntimeException("bip.user is set while youare not admin");

}

} else{

returnthis.userName;

}

}

@Override

publicvoidsetConf(Configuration conf) {

this.conf = conf;

UserGroupInformation ugi = null;

try{

ugi = ShimLoader.getHadoopShims().getUGIForConf(conf);

//     UserGroupInformation.createProxyUser(user, realUser);

} catch(Exception e) {

thrownewRuntimeException(e);

}

if(ugi ==
null
){

thrownewRuntimeException(

"Can not initialize PPLive Authenticator.");

}

this.userName = ugi.getUserName();

if(ugi.getGroupNames() !=null) {

this.groupNames = Arrays.asList(ugi.getGroupNames());

}

}

publicString getProxy() {

return 
this
.userName;

}

Hive提供的SemanticHook可以方便我们记录hql语义分析前后的状态,Execute Hook可以记录hql翻译成job提交执行前后的状态, Driver Hook可以记录包括整个编译执行过程前后的状态。

SemanticHook记录语义分析后的行为:

public
void
postAnalyze(HiveSemanticAnalyzerHookContext context,

List<Task<?extendsSerializable>> rootTasks)

throws SemanticException {

Hivehive = 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 = newHashSet<String>();

for(ReadEntity input :inputs) {

Table table = input.getT();

if(table!=null) {

readTables.add(table.getTableName());

}

}

Set<String>writeTables = newHashSet<String>();

for(WriteEntity output :outputs) {

Table table = output.getT();

if(table!=null) {

writeTables.add(table.getTableName());

}

}

HiveAuthenticationProviderauthenticationProvider = SessionState.get().getAuthenticator();

if(authenticationProviderinstanceof Authenticator) {

Authenticatorauthenticator = (Authenticator)authenticationProvider;       //ip

this.logger.info(String.format("phase=SA&executor=%s&proxy=%s&db=%s&cmd=%s&readTables=%s&writeTables=%s",
authenticator.getUserName(),

authenticator.getProxy(), hive.getCurrentDatabase(),context.getCommand(),readTables.toString(),writeTables.toString()));

}

StringuserName = SessionState.get().getAuthenticator().getUserName();

logger.debug(String.format("%s execute %s, read tables:%s, writetables:%s", userName, context.getCommand(),readTables, writeTables));

}

Execute Hook记录job状态:

public
class
ExecuteHook implements ExecuteWithHookContext {

Loggerlogger= Logger.getLogger(DriverRunHook.class);

privateHiveAuthenticationProviderauthenticationProvider =
null;

private
static final
String JOB_START_TIME="PRE_EXEC_HOOK";

private
static
SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

@Override

public
void
run(HookContexthookContext) throwsException {

QueryPlanqueryPlan = hookContext.getQueryPlan();

StringqueryId = queryPlan.getQueryId();

StringqueryStr = queryPlan.getQueryStr();

if(authenticationProvider==null){

authenticationProvider= SessionState.get().getAuthenticator();

}

Stringresult = null;

switch(hookContext.getHookType()){

//hive.exec.pre.hooks

case
PRE_EXEC_HOOK
:

hookContext.getConf().setLong(JOB_START_TIME,System.currentTimeMillis());

break;

//hive.exec.post.hooks

case
POST_EXEC_HOOK
:

result= "Success";

break;

//hive.exec.failure.hooks

case
ON_FAILURE_HOOK
:

result= "Failure";

break;

default:

break;

}

if(hookContext.getHookType()!= HookContext.HookType.PRE_EXEC_HOOK&&authenticationProvider
instanceofAuthenticator) {

long jobEndTime = System.currentTimeMillis();

HiveConfconf = hookContext.getConf();

long jobStartTime =conf.getLong(JOB_START_TIME, jobEndTime);

long timeTaken =(jobEndTime-jobStartTime)/1000;

Authenticatorauthenticator = (Authenticator)authenticationProvider;       //ip

this.logger.info(String.format("phase=EXEC&result=%s&executor=%s&proxy=%s&db=%s&queryId=%s&queryStr=%s&jobName=%s&jobStartTime=%s&jobEndTime=%s&timeTaken=%d",
result,authenticator.getUserName(),authenticator.getProxy(),

Hive.get().getCurrentDatabase(),queryId, queryStr,conf.getVar(HiveConf.ConfVars.HADOOPJOBNAME),dateFormat.format(new
Date(jobStartTime)),

dateFormat.format(newDate(jobEndTime)),timeTaken));

}

}

}

DriverHook记录整个过程执行时间:

public
class
DriverRunHook implements HiveDriverRunHook{

Loggerlogger= Logger.getLogger(DriverRunHook.class);

privateHiveAuthenticationProviderauthenticationProvider =
null;

private
static
SimpleDateFormat dateFormat =new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

private
long
startTime = 0;

@Override

public
void
preDriverRun(HiveDriverRunHookContext hookContext)

throws Exception {

if(authenticationProvider==null){

authenticationProvider= SessionState.get().getAuthenticator();

}

startTime = System.currentTimeMillis();

}

@Override

public
void
postDriverRun(HiveDriverRunHookContext hookContext)

throws Exception {

if(authenticationProviderinstanceofAuthenticator) {

long endTime = System.currentTimeMillis();

long timeTaken = (endTime-startTime)/1000;

Authenticatorauthenticator = (Authenticator)authenticationProvider;       //ip

this.logger.info(String.format("phase=DriverRun&executor=%s&proxy=%s&db=%s&cmd=%s&startTime=%s&endTime=%s&timeTaken=%d",
authenticator.getUserName(),authenticator.getProxy(),

Hive.get().getCurrentDatabase(),hookContext.getCommand(),dateFormat.format(newDate(startTime)),dateFormat.format(new
Date(endTime)),timeTaken));

}

}

}

Hive权限之审计

时间: 2024-08-25 08:04:42

Hive权限之审计的相关文章

Hive权限之改进

不足 即使开启hive权限认证的情况下,不论什么用户仍然是超级用户.能够通过grant给不论什么人赋予不论什么权限,这样权限认证基本没有意义.因此必须在开启权限认证的同一时候.对运行grant/revoke的实体进行限制,比方仅仅有admin才干 grant privilege on database,仅仅有table owner才干grant privilege on table.BIP中hive眼下是没有开启权限认证的. 改进 针对hive权限的不足以及bip对hive的使用场景.改进后的h

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权限管理

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>

[转]Oracle DB审计

? 说明DBA 负责的安全和审计工作 ? 启用标准数据库审计 ? 指定审计选项 ? 复查审计信息 ? 维护审计线索 责任分离 ? 具有DBA 权限的用户必须是可信任的. – 滥用信任 – 用审计线索保护受信任位置 ? 必须共同分担DBA 责任. ? 绝对不要共享帐户. ? DBA 和系统管理员必须由不同的人员担任. ? 分离操作员与DBA 的责任. 以下是满足责任分离的主要要求. DBA 必须是可信任的:很难限制某个DBA 去做什么.为了完成工作,DBA 需要很高的权限.DBA 是受信任的职位,

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的基本知识及工作中要