hive数据权限管理

  • hive数据权限管理
    • 权限说明
    • 开启权限管理
    • 权限配置
    • 超级权限
    • 参考文献

hive数据权限管理

1.权限说明

Hive基于元数据库来管理多用户并控制权限。数据分为元数据和数据文件两部分,元数据存储在mysql,而数据文件则是HDFS,控制元数据即控制可访问的数据文件。从mysql存储的Hive元数据表数据字典(metastore数据库)看,Hive是基于元数据mysql管理多用户权限,用户权限信息都存储在元数据表中。要重点理解是,mysql只是保存Hive的元数据,mysql本身的用户和Hive没有关系,Hive只是把自己的用户信息保存在mysql元数据表中。hive能对数据文件的权限控制,未能控制元数据权限,考虑引入Apache Sentry组件。

眼下hive支持简单的权限管理,默认情况下是不开启。这样全部的用户都具有同样的权限,同一时候也是超级管理员,对hive中的全部表都有查看和修改的权利,这样是不符合一般数据仓库的安全原则的。但是Hive的权限控制并不是完全安全的。基本的授权方案的目的是防止用户不小心做了不合适的事情。

Hive授权的核心就是用户、组、角色。
Hive中的角色和平常我们认知的角色是有区别的。Hive中的角色可以理解为一部分有一些相同“属性”的用户或组或角色的集合。这里有个递归的概念,就是一个角色可以是一些角色的集合。

用户
张三 G_db1
李四 G_db2
王五 G_bothdb

如上有三个用户分别属于G_db1、G_db2、G_alldb。
G_db1、G_db2、G_ bothdb分别表示该组用户可以访问数据库1、数据库2和可以访问1、2两个数据库。现在可以创建role_db1和role_db2,分别并授予访问数据库1和数据库2的权限。
这样只要将role_eb 1赋给G_db1(或者该组的用户),将role_eb2赋给G_db2,就可以是实现指定用户访问指定数据库。最后创建role_bothdb指向role_db1、role_db2(role_bothdb不需要指定访问那个数据库),然后role_bothdb授予G_bothdb,则G_bothdb中的用户可以访问两个数据库。

使用和组使用的是Linux机器上的用户和组,而角色必须自己创建。

2.开启权限管理

1.在hive-site.xml文件中配置参数开启权限认证,开启启身份认证后,任何用户必须被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

4.属性赋值采用xml,格式如下:
 
    key 
    value 
 

3.权限配置

--创建和删除角色  
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支持以下权限:

权限名称 含义
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 允许用户查看可用的数据库

主要元数据表:

内容
Db_privs 记录了User/Role在DB上的权限
Tbl_privs 记录了User/Role在table上的权限
Tbl_col_privs 记录了User/Role在table column上的权限
Roles 记录了所有创建的role
Role_map 记录了User与Role的对应关系

4.超级权限

Hive的权限功能还有一个需要完善的地方,那就是“超级管理员”。Hive中没有超级管理员,任何用户都可以进行Grant/Revoke操作,为了完善“超级管理员“,必须在hive-site.xml添加配置hive.semantic.analyzer.hook = com.mycompany.AuthHook参数hive.aux.jars.path(目前仅支持本地路径) =file:///usr/lib/hive/lib/HiveAuthHook.jar(此配置仅对hive server有效),并实现自己的权限控制类。

权限控制类:

package com.newland;

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] + ".");
//            }
//        }
//    }
}

编译上面代码(需要导入依赖antlr-runtime-3.4.jar,hive-exec-0.12.0-cdh5.1.2.jar)
打包成jar放置在hive的classpath下(客户端hive shell所在主机的hive-env.sh 中的环境变量:HIVE_AUX_JARS_PATH指向的路径,此配置仅对hive shell生效),最后重启hiveserver。

参考文献

  1. Hive权限控制和超级管理员的实现
  2. Hive用户权限管理理解
  3. Hive 权限控制

你可能感兴趣的:(hive)