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,如需转载请自行联系原作者

相关文章
|
4月前
|
SQL HIVE
Hive LAG函数分析
Hive LAG函数分析
36 0
|
6月前
|
SQL 安全 Java
一篇文章彻底理解 HIVE 常见的三种 AUTHENTICATION 认证机制的配置与使用
一篇文章彻底理解 HIVE 常见的三种 AUTHENTICATION 认证机制的配置与使用
|
4月前
|
SQL 数据可视化 关系型数据库
【大数据实训】基于Hive的北京市天气系统分析报告(二)
【大数据实训】基于Hive的北京市天气系统分析报告(二)
63 1
|
6月前
|
SQL 分布式计算 资源调度
大数据问题排查系列-大数据集群开启 kerberos 认证后 HIVE 作业执行失败
大数据问题排查系列-大数据集群开启 kerberos 认证后 HIVE 作业执行失败
|
7月前
|
SQL 数据挖掘 HIVE
Hive数据仓库维度分析
Hive数据仓库维度分析
95 0
|
9月前
|
SQL 机器学习/深度学习 存储
Hadoop生态系统中的数据查询与分析技术:Hive和Pig的比较与应用场景
Hadoop生态系统中的数据查询与分析技术:Hive和Pig的比较与应用场景
|
SQL 消息中间件 Kafka
flink 读取kafka 写入带kerberos认证的hive环境
flink 读取kafka 写入带kerberos认证的hive环境
|
SQL HIVE
hive的窗口函数、分析函数有哪些?
窗口函数FIRST_VALUE:取分组内排序后,截止到当前行,第一个值LAST_VALUE: 取分组内排序后,截止到当前行,最后一个值LEAD(col,n,DEFAULT) :用于统计窗口内往下第n行值。第一个参数为列名,第二个参数为往下第n行(可选,默认为1),第三个参数为默认值(当往下第n行为NULL时候,取默认值,如不指定,则为NULL)LAG(col,n,DEFAULT) :与lead相反,用于统计窗口内往上第n行值。第一个参数为列名,第二个参数为往上第n行(可选,默认为1),第三个参数为默认值(当往上第n行为NULL时候,取默认值,如不指定,则为NULL)OVER从句1、使用标准的聚
88 0
|
SQL 分布式计算 Ubuntu
8-点击流数据分析项目-Hive分析
文章目录 8-点击流数据分析项目-Hive分析 一、环境准备与数据导入 1.开启hadoop 2.导入数据
8-点击流数据分析项目-Hive分析
|
SQL 监控 HIVE
网站流量日志分析--统计分析--漏斗模型转化分析 &amp;hive 级联求和问题|学习笔记
快速学习网站流量日志分析--统计分析--漏斗模型转化分析 &amp;hive 级联求和问题
261 0
网站流量日志分析--统计分析--漏斗模型转化分析 &amp;hive 级联求和问题|学习笔记