公司运营、BI以及财务不同部门不同人员需要hive数据查询服务,所以需要分配不同的权限给相关人员
权限配置主要涉及两项:
- 认证(authentication):验证用户所用的身份是否是对的
- 授权(authorization):验证用户所用身份操作是否有权限
cloudera集成的hive认证支持常用的LDAP和kerberos,授权使用的是他自家的sentry,sentry目前还处在孵化中。为了推广他自家的产品,屏蔽了hive的授权管理
针对我的需求,用户统一在hue界面操作hive,分配不同表权限给不同的用户,权限的授予只需要一个管理员账户;授权使用hive原生的
hive默认所有用户都可以做权限的更改,配置为只有管理员(如admin)才能修改权限
使用钩子做身份拦截,如果用户不为admin且操作权限管理操作,拒绝,代码示例如下:
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
import org.apache.hadoop.hive.ql.parse.HiveSemanticAnalyzerHookContext;
import org.apache.hadoop.hive.ql.parse.SemanticException;
import org.apache.hadoop.hive.ql.session.SessionState;
public class HiveAdmin extends AbstractSemanticAnalyzerHook {
private static String admin = "admin";
private static final Log LOG = LogFactory.getLog(HiveAdmin.class);
@Override
public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
ASTNode ast) throws SemanticException {
String userName = null;
String Authenticator="null";
switch (ast.getToken().getType()) {
case 692: //grant
case 646:// CREATE ROLE amengzi;
case 675:// DROP ROLE amengzi
case 694: //GRANT ROLE amengzi to user amengzi;
case 793:// REVOKE ROLE amengzi FROM user amengzi;
// case 647://create table test11(id string)
// case 676://drop table test;
// case 783://select * from test;
// case 817://show grant
// case 671: //drop database;
if (SessionState.get() != null
&& SessionState.get().getAuthenticator() != null) {
Authenticator = SessionState.get().getAuthenticator().toString();
userName = SessionState.get().getAuthenticator().getUserName();
}
if (!admin.equalsIgnoreCase(userName)) {
System.out.println("===================can't use ADMIN options, except");
throw new SemanticException(userName
+ " can't use ADMIN options, except " + admin + ".");
}
break;
default:
break;
}
int tokeType=ast.getToken().getType();
LOG.error("tokeType:"+tokeType+"=======user " + SessionState.get().getAuthenticator().getUserName()+" Authenticator "+SessionState.get().getAuthenticator().toString());
System.out.println("tokeType:"+tokeType+"===================user: " + SessionState.get().getAuthenticator().getUserName()+" Authenticator "+SessionState.get().getAuthenticator().toString());
return ast;
// return super.preAnalyze(context, ast);
}
// @Override
// public void postAnalyze(HiveSemanticAnalyzerHookContext context,
// List> rootTasks)
// throws SemanticException {
// console.printInfo("!! SimpleSemanticPreAnalyzerHook postAnalyze called !!");
// super.postAnalyze(context, rootTasks);
// }
}
在使用客户端hive时,会显示向控制台输出的语句,便于调试
在hue上操作时,logger的输出会在hiveserver2日志中输出
cloudera默认用org.apache.hadoop.hive.ql.parse.authorization.RestrictedHiveAuthorizationTaskFactoryImpl
替换hive的org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl
做权限屏蔽,需要通过配置文件使用原生hive类
从CM界面放入以下配置于hive-site.xml 的 Hive 客户端高级配置代码段(安全阀)和hive-site.xml 的 HiveServer2 高级配置代码段(安全阀)
<property>
<name>hive.security.authorization.enabledname>
<value>truevalue>
<description>enable or disable the hive client authorizationdescription>
property>
<property>
<name>hive.security.authorization.createtable.owner.grantsname>
<value>ALLvalue>
<description>the privileges automatically granted to the owner whenever a table gets created. An example like"select,drop" will grant select and drop privilege to the owner of the tabledescription>
property>
<property>
<name>hive.security.authorization.task.factoryname>
<value>org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImplvalue>
property>
<property>
<name>hive.semantic.analyzer.hookname>
<value>HiveAdminvalue>
property>
注意:后续hdfs权限需要做相应修改
在namenode活动节点创建需要的用户账户
如果使用hue,linux账户和hue的账户可以同步hue useradmin_sync_with_unix
启用了hive权限之后发现hue和hive客户端都没有创建数据库的权限,我需要客户端能过创建数据酷,所以“hive-site.xml 的 Hive 客户端高级配置代码段(安全阀)“不作配置,这样HiveAdmin的jar包只需放到hiveserver2所在主机/opt/cloudera/parcels/CDH-5.4.4-1.cdh5.4.4.p0.4/lib/hive/lib/
下就可以,如果hive-site客户端也配置了权限,则jar需要放到hive lib下
如果想后端也加上权限,又想可以创建数据库,则方案可以配置为单独一台机子不做权限配置,用来做数据库创建
hue和hive有一个坑导致不能相同授权重复,所以授权操作需要通过hive客户端来操作