Hive权限之审计,hive
Hive权限之审计,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 classAuthenticator implements HiveAuthenticationProvider {
private finalstaticString 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 voidpostAnalyze(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 classExecuteHook 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 classDriverRunHook 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 voidpreDriverRun(HiveDriverRunHookContext hookContext)
throws Exception {
if(authenticationProvider==null){
authenticationProvider= SessionState.get().getAuthenticator();
}
startTime = System.currentTimeMillis();
}
@Override
public voidpostDriverRun(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));
}
}
}
()召开与审计事项有关会议
(二)检查内部审计范围和内容有关事项
(三)对与审计事项有关问题展开审计调查取得审计证据
(四)根据内部审计工作需要要求被审计单位按时报送生产、经营、财务收支计划、预算执行情况、决算、会计报表和其有关文件、资料;
(五)审核有关报表、凭证、帐薄、预算、决算、合同、协议及检查公司及下属子公司、分公司有关生产、经营和财务活动资料、文件和现场勘察实物;
(六)参与研究制定公司各项相关制度起草内部审计规范和工作细则经公司审议实施;
(七)对正进行严重违反财经法规、严重浪费损害公司利益行做出临时制止决定并及时上报董事会审计委员会
(八)对审计发现问题提出改进建议;对严重违反财经法规和严重损害公司利益单位和人提出追究责任建议
(九)阻挠破坏审计工作及拒绝提供审计资料单位和人有权向董事会审计委员会提出建议采取必要措施并追究相关责任
(十)对审计发现重大问题及时向董事会审计委员会报告
第三十条 审计机关有权要求被审计单位按照审计机关规定提供预算或者财务收支计划、预算执行情况、决算、财务会计报告运用电子计算机储存、处理财政收支、财务收支电子数据和必要电子计算机技术文档金融机构开立账户情况社会审计机构出具审计报告及其与财政收支或者财务收支有关资料被审计单位得拒绝、拖延、谎报
被审计单位负责人对本单位提供财务会计资料真实性和完整性负责
第三十二条 审计机关进行审计时有权检查被审计单位会计凭证、会计账簿、财务会计报告和运用电子计算机管理财政收支、财务收支电子数据系统及其与财政收支、财务收支有关资料和资产被审计单位得拒绝
第三十三条 审计机关进行审计时有权审计事项有关问题向有关单位和人进行调查并取得有关证明材料有关单位和人应当支持、协助审计机关工作实向审计机关反映情况提供有关证明材料
审计机关经县级上人民政府审计机关负责人批准有权查询被审计单位金融机构账户
审计机关有证据证明被审计单位人名义存储公款经县级上人民政府审计机关主要负责人批准有权查询被审计单位人名义金融机构存款
第三十四条 审计机关进行审计时被审计单位得转移、隐匿、篡改、毁弃会计凭证、会计账簿、财务会计报告及其与财政收支或者财务收支有关资料得转移、隐匿所持有违反国家规定取得资产
审计机关对被审计单位违反前款规定行有权予制止;必要时经县级上人民政府审计机关负责人批准有权封存有关资料和违反国家规定取得资产;对其金融机构有关存款需要予冻结应当向人民法院提出申请
审计机关对被审计单位正进行违反国家规定财政收支、财务收支行有权予制止;制止无效经县级上人民政府审计机关负责人批准通知财政部门和有关主管部门暂停拨付与违反国家规定财政收支、财务收支行直接有关款项已经拨付暂停使用 审计机关采取前两款规定措施得影响被审计单位合法业务活动和生产经营活动
第三十五条 审计机关认被审计单位所执行上级主管部门有关财政收支、财务收支规定与法律、行政法规相抵触应当建议有关主管部门纠正;有关主管部门予纠正审计机关应当提请有权处理机关依法处理
第三十六条 审计机关向政府有关部门通报或者向社会公布审计结
审计机关通报或者公布审计结应当依法保守国家秘密和被审计单位商业秘密遵守国务院有关规定
第三十七条 审计机关履行审计监督职责提请公安、监察、财政、税务、海关、价格、工商行政管理等机关予协助
有帮助请采纳
评论暂时关闭