hive hook限制grant权限

hive中有个比较严重的bug,默认情况下任何用户都可以运行grant命令来做授权操作

在Driver.compile方法中,可以增加对AST的hook(hive可以有很多hook,后面分析hive hook的类型和使用阶段),用来做一些forbidden的操作:

compile相关的内容如下:

 BaseSemanticAnalyzer sem = SemanticAnalyzerFactory.get( conf, tree);
      List<HiveSemanticAnalyzerHook> saHooks =
          getHooks(HiveConf.ConfVars.SEMANTIC_ANALYZER_HOOK,
              HiveSemanticAnalyzerHook. class);  // 获取hive.semantic.analyzer.hook的设置,可以是多项,中间以逗号分隔
      // Do semantic analysis and plan generation
      if (saHooks != null) {
        HiveSemanticAnalyzerHookContext hookCtx = new HiveSemanticAnalyzerHookContextImpl();
        hookCtx.setConf( conf);
        hookCtx.setUserName( userName);
        for (HiveSemanticAnalyzerHook hook : saHooks) {
          tree = hook.preAnalyze(hookCtx, tree);
        }
        sem.analyze(tree, ctx);
        hookCtx.update(sem);
        for (HiveSemanticAnalyzerHook hook : saHooks) {
          hook.postAnalyze(hookCtx, sem.getRootTasks());
        }
      } else {
        sem.analyze(tree, ctx);
      }

即,compile阶段通过获取hive.semantic.analyzer.hook的设置,来获取对应的hook方法,然后逐一应用到ast中。

具体的代码如下:

import org.apache.hadoop.hive.ql.parse.ASTNode;
import org.apache.hadoop.hive.ql.parse.AbstractSemanticAnalyzerHook;
import org.apache.hadoop.hive.ql.parse.HiveParser;
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 MyAuthHook extends AbstractSemanticAnalyzerHook {
     private static String admin = "hdfs;
     @Override
     public ASTNode preAnalyze(HiveSemanticAnalyzerHookContext context,
               ASTNode ast) throws SemanticException {
          switch (ast.getToken().getType()) {
          case HiveParser.TOK_CREATEDATABASE:
          case HiveParser.TOK_DROPDATABASE:
          case HiveParser.TOK_CREATEROLE:
          case HiveParser.TOK_DROPROLE:
          case HiveParser.TOK_GRANT:
          case HiveParser.TOK_REVOKE:
          case HiveParser.TOK_GRANT_ROLE:
          case HiveParser.TOK_REVOKE_ROLE:
               String userName = null;
               if (SessionState.get() != null
                         && SessionState.get().getAuthenticator() != null) {
                    userName = SessionState.get().getAuthenticator().getUserName();
               }
               if (!admin.equalsIgnoreCase(userName)) {
                    throw new SemanticException(userName
                              + " can‘t use ADMIN options, except " + admin + ".");
               }
               break;
          default:
               break;
          }
          return ast;
     }
}

测试一般用户的grant命令:

FAILED: SemanticException User:ericni isn‘t ADMIN, please ask for hdfs.
14/12/04 16:24:41 ERROR ql.Driver: FAILED: SemanticException User:ericni isn‘t ADMIN, please ask for hdfs.
org.apache.hadoop.hive.ql.parse.SemanticException: User:ericni isn‘t ADMIN, please ask for hdfs.
        at com.vipshop.hive.plugin.AuthHook.preAnalyze(AuthHook.java:44)
        at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:433)
        at org.apache.hadoop.hive.ql.Driver.compile(Driver.java:329)
        at org.apache.hadoop.hive.ql.Driver.compileInternal(Driver.java:1002)
        at org.apache.hadoop.hive.ql.Driver.runInternal(Driver.java:1075)
        at org.apache.hadoop.hive.ql.Driver.run(Driver.java:934)
        at org.apache.hadoop.hive.ql.Driver.run(Driver.java:921)
        at org.apache.hadoop.hive.cli.CliDriver.processLocalCmd(CliDriver.java:281)
        at org.apache.hadoop.hive.cli.CliDriver.processCmd(CliDriver.java:227)
        at org.apache.hadoop.hive.cli.CliDriver.processLine(CliDriver.java:442)
        at org.apache.hadoop.hive.cli.CliDriver.executeDriver(CliDriver.java:860)
        at org.apache.hadoop.hive.cli.CliDriver.run(CliDriver.java:733)
        at org.apache.hadoop.hive.cli.CliDriver.main(CliDriver.java:666)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
        at java.lang.reflect.Method.invoke(Method.java:597)
        at org.apache.hadoop.util.RunJar.main(RunJar.java:208)
时间: 2024-10-13 22:34:03

hive hook限制grant权限的相关文章

Mysql grant权限管理

MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 [identified by '密码'] 最常用的,弄主从同步的时候,给从库的slave用户设置拥有所有权限,权限all 仅允许其从192.168.0.2登录,并限定使用密码 funsion (密码要用 单/双引号 括起来) grant all on *.* to slave@192.168.0.2 identified by 'funsion'; 执行完毕后,记得用 FLUSH PRIVILEGE

数据库中的grant权限赋予和系统中的权限管理是两码事。

数据库中的grant权限赋予和系统中的权限管理是两码事.grant一般是赋给个人的,对全部或单个数据库的增删改查等权限,不多说.权限管理系统 在数据库中建表,存角色,权限,不同的菜单,在java层面上写代码控制的.用filter或if等都能控制.参考资料:grant:http://www.cnblogs.com/Richardzhu/p/3318595.htmlhttp://blog.csdn.net/leshami/article/details/5688875http://7567567.b

mysql root权限优化后没有grant权限

原先数据库里root用户授权登录主机为% mysql> show grants for [email protected]"%";                 +--------------------------------------------------------------------------------------------------------------------------------+ | Grants for [email protected

Mysql grant权限详解

MySQL的 Grant命令权限分配 MySQL 赋予用户权限命令的简单格式可概括为: grant 权限 on 数据库对象 to 用户 一.grant 普通数据用户,查询.插入.更新.删除 数据库中所有表数据的权利. grant select on testdb.* to [email protected]'%'grant insert on testdb.* to [email protected]'%'grant update on testdb.* to [email protected]

Mysql Grant权限

查看用户权限: SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user; 权限取决于最上一条记录的值 如果需要收回权限: REVOKE ALL PRIVILEGES ON *.* FROM 'root'@'ip1'; 上面这条SQL将置Grant_priv,Super_priv为N,即使接下来执行SQL: GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASS

CDH中,执行HIVE脚本表联查权限问题。。

文章来自http://www.cnblogs.com/hark0623/p/4174641.html 转发请注明 有时候执行表联查的时候总会出现没有权限写文件的情况. 这个时候使用sudo -H hive hive -e "select * from tbl1 join tbl2 on tbl1.field = tbl2.field"即可

实现hive proxy5-数据目录权限问题解决

hive创建目录时相关的几个hdfs中的类: org.apache.hadoop.hdfs.DistributedFileSystem,FileSystem 的具体实现类 org.apache.hadoop.hdfs.DFSClient,client操作hdfs文件系统的类 org.apache.hadoop.fs.permission.FsPermission 文件权限相关类,主要的方法有getUMask和applyUMask方法 org.apache.hadoop.hdfs.Distribu

实现hive proxy3-日志目录权限问题解决

使用proxy之后,目录名为proxy之后的用户名目录,但是生成的文件属主是当前登陆用户,导致不能正常写入,日志目录的创建在org.apache.hadoop.hive.ql.history.HiveHistoryImpl类中,更改后的构造方法(增加了proxy之后的代码): public HiveHistoryImpl(SessionState ss) {   try {     console = new LogHelper(LOG);     if(ss.getConf().getBool

grant权限

oracle权限管理精英翻到结尾看备注 一:用户管理1.1:用户与模式在oracle中模式与用户是一一对应的,一个模式只能和被一个用户所拥有且名称和该用户一样:当用户访问自己模式中的对象时不需要指定模式名,如:scott用户访问自己的EMP表时SELECT * from emp不需要加模式名,经过授权的用户还可以访问其他模式的对象,访问时要在对象名的前面加上模式名.1.2:创建新用户要连接到Oracle数据库,就需要创建一个用户帐户,每个用户都有一个默认表空间和一个临时表空间拥有CREATE u