hive权限控制

原文 see https://www.jianshu.com/p/e5b80c3e7269

说明

  • 认证(authentication):验证用户所用的身份是否是对的
  • 授权(authorization):验证用户所用身份操作是否有权限

目前hive(版本0.12.0)支持简单的权限管理,默认情况下是不开启,这样所有的用户都具有相同的权限,同时也是超级管理员,也就对hive中的所有表都有查看和改动的权利,这样是不符合一般数据仓库的安全原则的。Hive可以是基于元数据的权限管理,也可以基于文件存储级别的权限管理,此次以介绍MetaData权限管理为主。通过配置hive-site.xml开启Hive身份认证功能进行权限检查。

配置

/*1.开启启身份认证后,任何用户必须被grant privilege才能对实体进行操作。*/
hive.security.authorization.enabled = true
/*2.表示创建表时自动赋予一些用户或角色相应的权限*/
hive.security.authorization.createtable.owner.grants = ALL
hive.security.authorization.createtable.role.grants = admin_role:ALL
hive.security.authorization.createtable.user.grants = user1,user2:select;user3:create
/*3.出现以下错误: Error while compiling statement: FAILED: SemanticException The current builtin authorization in Hive is incomplete and disabled. 需要配置属性 */
hive.security.authorization.task.factory = org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl

角色管理(ing)

  • 创建和删除角色
    create role role_name;
    drop role role_name;

  • 展示所有roles
    show roles

  • 赋予角色权限
    grant select on database db_name to role role_name;
    grant select on [table] t_name to role role_name;

  • 查看角色权限
    show grant role role_name on database db_name;
    show grant role role_name on [table] t_name;

  • 角色赋予用户
    grant role role_name to user user_name

  • 回收角色权限
    revoke select on database db_name from role role_name;
    revoke select on [table] t_name from role role_name;

  • 查看某个用户所有角色
    show role grant user user_name;

超级权限

Hive的权限功能还有一个需要完善的地方,那就是“超级管理员”。
Hive中没有超级管理员,任何用户都可以进行Grant/Revoke操作,为了完善“超级管理员”,必须添加hive.semantic.analyzer.hook配置,并实现自己的权限控制类。

hive.semantic.analyzer.hook = com.mycompany.AuthHook

编译下面代码,需要导入依赖antlr-runtime-3.4.jar,hive-exec-0.12.0-cdh5.1.2.jar(版本同当前hive lib里的一致),jar包配置到$HIVE_HOME/lib里。

package xxx;

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 AuthHook extends AbstractSemanticAnalyzerHook {
    private static String[] admin = { "root", "hadoop" };

    @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[0].equalsIgnoreCase(userName)
                    && !admin[1].equalsIgnoreCase(userName)) {
                throw new SemanticException(userName
                        + " can't use ADMIN options, except " + admin[0] + ","
                        + admin[1] + ".");
            }
            break;
        default:
            break;
        }
        return ast;
    }

//  public static void main(String[] args) throws SemanticException {
//      String[] admin = { "admin", "root" };
//      String userName = "root";
//      for (String tmp : admin) {
//          System.out.println(tmp);
//          if (!tmp.equalsIgnoreCase(userName)) {
//              throw new SemanticException(userName
//                      + " can't use ADMIN options, except " + admin[0] + ","
//                      + admin[1] + ".");
//          }
//      }
//  }
}

权限管理(ing)

  • 赋予用户权限
    grant [SELECT|…] on [database|table] [db_name|tbl_name ] to user [username];
    grant select(tab_col) on table [tbl_name] to user [username];
  • 回收用户权限
    revoke [ALL|…] on [database|table] [db_name|tbl_name ] from user [username];
  • 查看用户权限
    show grant user [username] on [database|table] [db_name|tbl_name];

HIVE支持的权限

权限名称 含义
ALL 所有权限
ALTER 允许修改元数据(modify metadata data of object)—表信息数据
UPDATE 允许修改物理数据(modify physical data of object)—实际数据
CREATE 允许进行Create操作
DROP 允许进行DROP操作
INDEX 允许建索引(目前还没有实现)
LOCK 当出现并发的使用允许用户进行LOCK和UNLOCK操作
SELECT 允许用户进行SELECT操作
SHOW_DATABASE 允许用户查看可用的数据库

登录hive元数据库,可以发现以下表:
Db_privs:记录了User/Role在DB上的权限
Tbl_privs:记录了User/Role在table上的权限
Tbl_col_privs:记录了User/Role在table column上的权限
Roles:记录了所有创建的role
Role_map:记录了User与Role的对应关系

作者:kimibob
链接:https://www.jianshu.com/p/e5b80c3e7269
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

猜你喜欢

转载自blog.csdn.net/weixin_41350766/article/details/79484762