cloudera manager下的hive权限配置

前言


公司运营、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>

cloudera manager下的hive权限配置_第1张图片

注意:后续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客户端来操作

你可能感兴趣的:(cloudera manager下的hive权限配置)