zoukankan      html  css  js  c++  java
  • Hive权限之改进

    不足

    即使开启hive权限认证的情况下,不论什么用户仍然是超级用户。能够通过grant给不论什么人赋予不论什么权限,这样权限认证基本没有意义。因此必须在开启权限认证的同一时候。对运行grant/revoke的实体进行限制,比方仅仅有admin才干 grant privilege on database,仅仅有table owner才干grant privilege on tableBIPhive眼下是没有开启权限认证的。

    改进

    针对hive权限的不足以及biphive的使用场景。改进后的hive权限认证有一个拥有超级权限的角色admin_role, 即admin_role拥有没有开启权限认证时候一样的全部权限。拥有admin_role的用户就是admin,而普通用户仅仅有是某个实体的owner或者被grant相应的权限时才干在这个实体上进行相应的操作。详细体如今一下几点:

    1、 DB上的权限:BIPhive_warehouse中仅仅有一个DB,也即默认的DB default,仅仅有admin才干对DB上权限进行管理,主要有:create/drop databasegrant/revoke privilege on database

    2、 Table/Column上的权限:普通用户仅仅有在被pplive grant create on database后才干创建表。一个表在被创建后,admin_roleowner拥有all也即全部的权限,同一时候仅仅有对table拥有all权限才干grant/revoke privilege on table。其它用户或拥有的rolegrant相应权限后就能进行相应的操作

    3、 Role上的权限:仅仅有admin_role才有权create/drop role,因此也就仅仅有admin才干对role进行权限相关的操作

    4、 仅仅有admin_role拥有代理权限,即admin_role能够转换为bip.user用户进行hive的一切操作,此时创建、读写表都是以代理的bip.user的身份去运行,适用于bip web场景

    Hivehql的解析主要有词法分析、语法分析、语义分析和运行四步,词法分析和语法分析主要是形成抽象语法树AST。确保hql语法的正确性,语义分析则是将AST翻译成task并分析task间的关系形成有向无环图DAG。终于运行引擎则将DAGtask提交给Hadoop运行并监控task的运行状态。Hive通过在语义分析中进行权限验证。检查用户是否对运行hql所操作的tablecolumn有对应的权限。同一时候开放了hook让我们能够对语义分析的输入和输出进行操作,下面属性能够配置语义分析hook类:

    <property>

    <name>hive.semantic.analyzer.hook</name>

       <value>com.bip.hive.auth.AuthHook></value>

    </property>

    语义分析hook类须继承抽象类AbstractSemanticAnalyzerHook,可实现preAnalyze进行语义分析前检查,实现postAnalyze进行语义分析后操作,而自己定义的操作限制是在preAnalyze中实现,利用语义分析后结果自己定义权限规则可在postAnalyze中实现

    我们在Semantic Hook中获取用户的身份,推断用户能否运行某种操作。进而区分了admin和非admin的运行权限。

    preAnalyze限制操作类型代码演示样例:

    public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
    ASTNode ast) throws SemanticException {
    String userName = null;
    // userName = context.getUserName();
    //String command = context.getCommand();
    if (SessionState.get() != null
    && SessionState.get().getAuthenticator() != null) {
    userName = SessionState.get().getAuthenticator().getUserName();
    }

    switch (ast.getToken().getType()) {
    case HiveParser.TOK_CREATEDATABASE:
    case HiveParser.TOK_DROPDATABASE:
    case HiveParser.TOK_CREATEROLE:
    case HiveParser.TOK_DROPROLE:
    case HiveParser.TOK_GRANT_ROLE:
    case HiveParser.TOK_REVOKE_ROLE:
    case HiveParser.TOK_CREATETABLE:
    case HiveParser.TOK_DROPTABLE:
    if (!AdminManager.isAdmin(userName)) {
    throw new SemanticException(userName + " is not admin, expect admin privilege");
    }
    break;

    case HiveParser.TOK_GRANT:
    case HiveParser.TOK_REVOKE:
    if(!AdminManager.isAdmin(userName)) {
    int childCount = ast.getChildCount();
    if(childCount>2) {
    for (int i = 2; i < ast.getChildCount(); i++) {
    ASTNode astChild = (ASTNode) ast.getChild(i);
    if (astChild.getType() == HiveParser.TOK_PRIV_OBJECT && !grantRevokeCheck(astChild, userName)) {
    throw new SemanticException(userName+" doesn't have grank/revoke privilege on the table ");
    }
    }
    }
    }
    break; 
    default:
    break; 

    return ast;
    }

    postAnalyze自己定义权限检查代码演示样例:

    public void postAnalyze(HiveSemanticAnalyzerHookContext context,List<Task<?

    extends Serializable>> rootTasks) throws SemanticException {
    Hive hive = 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 = new HashSet<String>();
    for(ReadEntity input : inputs) {
    Table table = input.getT();
    if(table!=null) {
    readTables.add(table.getTableName());
    }
    }

    Set<String> writeTables = new HashSet<String>();
    for(WriteEntity output : outputs) {
    Table table = output.getT();
    if(table!=null) {
    writeTables.add(table.getTableName());
    }
    }

    String userName = SessionState.get().getAuthenticator().getUserName();
    logger.debug(String.format("%s execute %s, read tables:%s, write tables:%s", userName, context.getCommand(), readTables, writeTables));
    privDataProvider.checkHivePriv(userName, readTables, writeTables);
    }


    Hive默认使用HadoopDefaultAuthenticator获取运行hql的用户,并使用其返回的用户进行权限验证。为了使hive可以以代理的模式去运行,我们须要提供自己的authenticator,返回设置的bip.user作为真正的hql运行者。下面配置可设置authenticator

    <property>

      <name>hive.security.authenticator.manager</name>

      <value>com.pplive.bip.hive.auth.Authenticator</value>

      <description>bip user authenticator</description>

    </property>

    眼下admin通过在hive命令行定义bip.user变量启动hive可进入代理模式:

    Hive -d bip.user=xxx 或 hive --define bip.user=xxx

    Memo

    Hive也提供group权限管理功能,在role已经可以满足需求的情况下不建议进行group相关的权限管理。

    通过对hive权限管理的改进,能够防止非法用户对没有权限的表、列进行读写删除操作,同一时候能够对运行的hql进行审计,分析hql的运行时间和频率以及hive表的使用频率。

    基于MetaData的权限管理相关的权限信息是存储在hive metadata中,事实上也能够将权限信息存储在我们自己db中,这样就能自己把握权限控制的规则。不用开启hive的权限控制,在SemanticAnalyze之后基于我们的规则对hql所读写的表、字段进行控制。

    然而,即使是改进后的hive权限依旧较弱,由于hive全部权限相关的信息都存储在MetaData中。仅仅要用户知道了存储MetaData的Mysqlusername和password就能够随意改动权限MetaData, 而连接MetaData Mysql的信息在hive-site.xml中是明文配置的,因此最安全权限是基于Storage底层的訪问控制。


  • 相关阅读:
    struts2+jpa+spring 泛型版小结
    PasswordEncoder
    父窗口 子窗口
    Powerdesigner的PDM(物理数据模型)生成数据库及逆向工程(将现有的数据库生成PDM)
    js 正则表达式
    <aop:config>
    CJDBC
    struts2取值
    mysql启动错误1067的解决
    杂碎
  • 原文地址:https://www.cnblogs.com/lytwajue/p/6977980.html
Copyright © 2011-2022 走看看