hive认证相关类分析

简介:

  目前的hive版本是支持authentication和authorization的(再加上计费就是3A了,哈哈),

在hive的java.org.apache.hadoop.hive.conf.HiveConf类中定义的权限相关的设置项有:

HIVE_AUTHORIZATION_ENABLED("hive.security.authorization.enabled", false),   //是否开启权限验证
HIVE_AUTHORIZATION_MANAGER("hive.security.authorization.manager", 
    "org.apache.hadoop.hive.ql.security.authorization.DefaultHiveAuthorizationProvider"),  //默认的授权实现类
HIVE_AUTHENTICATOR_MANAGER("hive.security.authenticator.manager",  // 默认的认证实现类
    "org.apache.hadoop.hive.ql.security.HadoopDefaultAuthenticator"),
HIVE_METASTORE_AUTHORIZATION_MANAGER("hive.security.metastore.authorization.manager", //metasotre服务的权限验证
    "org.apache.hadoop.hive.ql.security.authorization."
    + "DefaultHiveMetastoreAuthorizationProvider"),
HIVE_METASTORE_AUTHENTICATOR_MANAGER("hive.security.metastore.authenticator.manager",
    "org.apache.hadoop.hive.ql.security.HadoopDefaultMetastoreAuthenticator"),
HIVE_AUTHORIZATION_TABLE_USER_GRANTS("hive.security.authorization.createtable.user.grants", ""),  //下面4项会对创建表的权限的定义,这里有个bug,之前已经fix
HIVE_AUTHORIZATION_TABLE_GROUP_GRANTS("hive.security.authorization.createtable.group.grants",
    ""),
HIVE_AUTHORIZATION_TABLE_ROLE_GRANTS("hive.security.authorization.createtable.role.grants", ""),
HIVE_AUTHORIZATION_TABLE_OWNER_GRANTS("hive.security.authorization.createtable.owner.grants",
    ""),

authenticator相关代码在org.apache.hadoop.hive.ql.security包

简单说明如下

1.HiveAuthenticationProvider 是一个扩展了Configurable的接口,实现类主要需要实现getUserName和getUserName方法

2.SessionStateConfigUserAuthenticator 实现了HiveAuthenticationProvider接口,用来做测试和debug的,主要是getUserName方法:

  public String getUserName() {
    String newUserName = sessionState.getConf().get("user.name" , "" ).trim();  // 是根据user.name的设置获取user
    if (newUserName.isEmpty()) {
      return System. getProperty("user.name");  // 如果为空,根据System.getProperty( "user.name")设置user, 可以获取通过-D<name>=<value>设置,没有设置时为当前登录用户
    } else {
      return newUserName;
    }
  }

3.SessionStateUserAuthenticator实现了HiveAuthenticationProvider接口,是hiveserver2 用来做验证的类

4.ProxyUserAuthenticator 扩展了HadoopDefaultAuthenticator ,重写了setConf方法,主要调用了UserGroupInformation类的createRemoteUser方法,可以做代理用户类(根据proxy.user.name的设置获取username)

5.因为默认hive.security.authenticator.manager的设置时org.apache.hadoop.hive.ql.security.HadoopDefaultAuthenticator,因此我们主要看的还是在HadoopDefaultAuthenticator类中,主要的方法时setConf方法

  public void setConf(Configuration conf) {  
    this. conf = conf;
    UserGroupInformation ugi = null;
    try {
      ugi = ShimLoader.getHadoopShims().getUGIForConf(conf); 
    } catch (Exception e) {
      throw new RuntimeException(e);
    }
    if (ugi == null) {
      throw new RuntimeException(
          "Can not initialize HadoopDefaultAuthenticator." );
    }
    this. userName = ShimLoader.getHadoopShims().getShortUserName(ugi);
    if (ugi.getGroupNames() != null) {
      this. groupNames = Arrays.asList(ugi.getGroupNames());
    }
  }


根据分析代码,hive用来做认证的用户是在第一个命令运行时进行初始化的(后面即使通过设置也不会生效)因为在hive cli启动时,会读取.hiverc文件运行CREATE TEMPORARY FUNCTION xxxx,在第一个create xxx运行时,在命令的compile阶段(即Driver.compile()方法):


if (HiveConf.getBoolVar(conf,
     HiveConf.ConfVars.HIVE_AUTHORIZATION_ENABLED)) {  // 判断hive.security.authorization.enabled是否设置为true
   try {
     perfLogger.PerfLogBegin(CLASS_NAME, PerfLogger.DO_AUTHORIZATION);
     doAuthorization(sem);  // 如果开启了验证,则调用doAuthorization方法
   } catch (AuthorizationException authExp) {
     console.printError("Authorization failed:" + authExp.getMessage()
         + ". Use SHOW GRANT to get more details.");
     errorMessage = authExp.getMessage();
     SQLState = "42000";
     return 403;
   } finally {
     perfLogger.PerfLogEnd(CLASS_NAME, PerfLogger.DO_AUTHORIZATION);
   }
}

doAuthorization方法

private void doAuthorization(BaseSemanticAnalyzer sem)
  throws HiveException, AuthorizationException {
  HashSet<ReadEntity> inputs = sem.getInputs();
  HashSet<WriteEntity> outputs = sem.getOutputs();
  SessionState ss = SessionState.get();
  HiveOperation op = ss.getHiveOperation();  // 判断操作类型
  Hive db = sem.getDb();
  if (ss.isAuthorizationModeV2()) {  // 如果为v2时,调用doAuthorizationV2方法,而SessionState.isAuthorizationModeV2方法调用了SessiontState.getAuthorizationMode方法
    doAuthorizationV2(ss, op, inputs, outputs);
    return;
  }
  if (op == null) { 
    throw new HiveException("Operation should not be null");
  }
  if (op.equals(HiveOperation.CREATEDATABASE)) {   //下面的代码是做具体的验证操作,涉及到authorizator类
      ss.getAuthorizer().authorize(
...

SessionState.isAuthorizationModeV2和SessiontState.getAuthorizationMode方法:

  public AuthorizationMode getAuthorizationMode(){  //判断Authorization的类型(v1 or v2)
    setupAuth(); //调用SessiontState.setupAuth方法
    if(authorizer != null){
      return AuthorizationMode. V1;
    }else if(authorizerV2 != null){
      return AuthorizationMode. V2;
    }
    //should not happen - this should not get called before this.start() is called
    throw new AssertionError("Authorization plugins not initialized!" );
  }
  public boolean isAuthorizationModeV2(){
    return getAuthorizationMode() == AuthorizationMode. V2;
  }

SessiontState的setupAuth方法:

private void setupAuth() {
  if (authenticator != null) {  // 如果已经初始化过就直接返回,这里导致后面即使手动设置用户也不会生效
    // auth has been initialized
    return;
  }
  try {
    authenticator = HiveUtils.getAuthenticator(conf,
        HiveConf.ConfVars.HIVE_AUTHENTICATOR_MANAGER);// 调用HiveUtils.getAuthenticator方法生成一个对应类的实例
    authenticator.setSessionState(this);
    authorizer = HiveUtils.getAuthorizeProviderManager(conf,
        HiveConf.ConfVars.HIVE_AUTHORIZATION_MANAGER, authenticator, true);

.....

HiveUtils的getAuthenticator方法是用ReflectionUtils.newInstance生成org.apache.hadoop.hive.ql.security.HadoopDefaultAuthenticator类的实例,然后调用实例的setConf方法,设置hive的用户和组信息.


整个的调用顺序:

Driver.compile--->Driver.doAuthorization--->SessionState.isAuthorizationModeV2---->
SessiontState.getAuthorizationMode--->SessionState.setupAuth
--->HiveUtils.getAuthenticator+HiveUtils--->HadoopDefaultAuthenticator.setConf

需要注意的是:
1)这个账号控制的是hive的权限,和hdfs的权限无关,这两个需要区别开
2)在第一个命令的时候初始化,后面不再初始化
3)具体的验证操作是由HiveAuthorizationProvider的具体实现类的authorize完成



本文转自菜菜光 51CTO博客,原文链接:http://blog.51cto.com/caiguangguang/1587249,如需转载请自行联系原作者

相关文章
|
7月前
|
SQL HIVE
Hive LAG函数分析
Hive LAG函数分析
86 0
|
SQL 安全 Java
一篇文章彻底理解 HIVE 常见的三种 AUTHENTICATION 认证机制的配置与使用
一篇文章彻底理解 HIVE 常见的三种 AUTHENTICATION 认证机制的配置与使用
|
2月前
|
SQL 分布式计算 Hadoop
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
Hadoop-19 Flume Agent批量采集数据到HDFS集群 监听Hive的日志 操作则把记录写入到HDFS 方便后续分析
48 2
|
5月前
|
SQL 关系型数据库 MySQL
实时计算 Flink版产品使用问题之如何使用Flink SQL连接带有Kerberos认证的Hive
实时计算Flink版作为一种强大的流处理和批处理统一的计算框架,广泛应用于各种需要实时数据处理和分析的场景。实时计算Flink版通常结合SQL接口、DataStream API、以及与上下游数据源和存储系统的丰富连接器,提供了一套全面的解决方案,以应对各种实时计算需求。其低延迟、高吞吐、容错性强的特点,使其成为众多企业和组织实时数据处理首选的技术平台。以下是实时计算Flink版的一些典型使用合集。
|
6月前
|
SQL 数据采集 数据可视化
基于Hive的招聘网站的大数据分析系统
基于Hive的招聘网站的大数据分析系统
137 2
|
6月前
|
SQL 关系型数据库 MySQL
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
基于Hive的天气情况大数据分析系统(通过hive进行大数据分析将分析的数据通过sqoop导入到mysql,通过Django基于mysql的数据做可视化)
205 0
|
7月前
|
SQL 数据采集 存储
Hive实战 —— 电商数据分析(全流程详解 真实数据)
关于基于小型数据的Hive数仓构建实战,目的是通过分析某零售企业的门店数据来进行业务洞察。内容涵盖了数据清洗、数据分析和Hive表的创建。项目需求包括客户画像、消费统计、资源利用率、特征人群定位和数据可视化。数据源包括Customer、Transaction、Store和Review四张表,涉及多个维度的聚合和分析,如按性别、国家统计客户、按时间段计算总收入等。项目执行需先下载数据和配置Zeppelin环境,然后通过Hive进行数据清洗、建表和分析。在建表过程中,涉及ODS、DWD、DWT、DWS和DM五层,每层都有其特定的任务和粒度。最后,通过Hive SQL进行各种业务指标的计算和分析。
1014 1
Hive实战 —— 电商数据分析(全流程详解 真实数据)
|
7月前
|
SQL HIVE UED
【Hive SQL 每日一题】分析电商平台的用户行为和订单数据
作为一名数据分析师,你需要分析电商平台的用户行为和订单数据。你有三张表:`users`(用户信息),`orders`(订单信息)和`order_items`(订单商品信息)。任务包括计算用户总订单金额和数量,按月统计订单,找出最常购买的商品,找到平均每月最高订单金额和数量的用户,以及分析高消费用户群体的年龄和性别分布。通过SQL查询,你可以实现这些分析,例如使用`GROUP BY`、`JOIN`和窗口函数来排序和排名。
351 2
|
7月前
|
SQL 数据可视化 关系型数据库
【大数据实训】基于Hive的北京市天气系统分析报告(二)
【大数据实训】基于Hive的北京市天气系统分析报告(二)
202 1
|
SQL 分布式计算 资源调度
大数据问题排查系列-大数据集群开启 kerberos 认证后 HIVE 作业执行失败
大数据问题排查系列-大数据集群开启 kerberos 认证后 HIVE 作业执行失败