HADOOP docker(七):hive权限管理
1.1 hive中的用户与组
1.2 使用场景
1.3 权限模型
1.3 hive的超级用户
2. 授权管理
2.1 开启权限管理
2.2 实现超级用户
2.3 实现hiveserver2用户名密码
2.4 授权
2.4.1 角色管理
2.4.2 权限管理
2.4.3 操作与权限对应关系
1. hive权限简介
1.1 hive中的用户与组
hive权限中有用户、组、角色的概念。
- 用户 
即操作系统中的用户,或者在hiveserver2中定义的用户。 - 组 
即操作系统中的组。(组是相对默认授权方式来说的) - 角色 
是一组权限的集合,参考关系型数据库。
hive内置public角色。public,所有用户都拥有的角色。 
1.2 使用场景
目前主要通过以下三种方式使用hive:
- hive cli 
hive cli中的用户是操作系统中存在的用户。使用hive cli,只会验证用户的hdfs目录权限。 - hiveserver2 
hiveserver2中的用户即可以是操作系统中的用户,也可以是hiveserver2中定义的用户。
hiveserver2默认开启用户代理,即用启动hiveserver2的用户来模拟实际用户来提交任务,这时的权限是实际提交的用户的。如果关闭代理,则以启动hiveserver2的用户的权限来执行。 - hcatalog api 
通过hcatalog api访问hive的用户只会检查用户hdfs上的目录权限。 
1.3 权限模型
1.Storage Based Authorization in the Metastore Server 
基于存储权限验证metastore服务:默认情况下hive像dbms一样管理权限,但是有时候为用户授权后用户却没有hdfs权限。因此当前hive元数据授权的方式是结合dbms权限管理和底层的存储权限管理。当用hive给用户授权时,会先检查用户是hdfs的对应目录是否有相应权限,如果有再执行授权,如果没有则反错。比如给用户授权查询test.t1表时,如果用户在hdfs上没有访问hdfs://user/hive/warehouse/test/t1目录权限则会直接报错。默认是不开启的。 
相关配置:
| hive.metastore.pre.event.listeners | org.apache.hadoop.hive.ql.security.authorization.AuthorizationPreEventListener | 
| hive.security.metastore.authorization.manager | org.apache.hadoop.hive.ql.security.authorization.StorageBasedAuthorizationProvider | 
| hive.security.metastore.authenticator.manager | org.apache.hadoop.hive.ql.security.HadoopDefaultMetastoreAuthenticator | 
| hive.security.metastore.authorization.auth.reads | true | 
设置以上配置后,将会开启基于存储的metastore验证。 
hive cli和hcatalog会使用此种权限验证方式。 
(详情参考文档:https://cwiki.apache.org/confluence/display/Hive/HCatalog+Authorization)
2.SQL Standards Based Authorization in HiveServer2 
基于sql的hiveserver2的权限验证。基于存储的权限验证方式只能验证用户是否有访问目录或文件的权限,但无法执行如列访问之类更精细的控制,因此要用基于sql的权限控制方式。hiveserver2提供了一套完全类似sql的权限验证,可以设置role、用户,可以执行表级、行级、列级授权。 
注意hive cli是不支持sql验证方式的。因为用户可以在cli中改变验证规则甚至禁用该规则。
特点
- dfs add delete compile reset会被禁止
 - set 命令被限制,只能用来设置少量安全的参数。hive.security.authorization.sqlstd.confwhitelist 参数可设置set可以设置哪些参数。
 - add/drop function以及宏只能被admin角色使用的
 - 只能有admin角色来创建永久性函数,其它用户都可以使用
 - admin角色必须使用set role=admin来启动角色
 
用户和角色 
非常类似关系型数据库,用户可以被授予角色。角色是一组权限的集合。 
内置了public和admin两个角色,每个用户都有public角色,可以执行基本操作。admin为管理角色。用户登录hiveserver2时执行show current roles;来查看当前角色。使用set role切换角色。 
admin角色用户可以创建其它角色。做admin角色前,做set role切换到admin角色。 
role name不分大小写,但是用户名分大小写。
配置 
hive-site.xml:
| hive.server2.enable.doAs | false | 
| hive.users.in.admin.role | |
| hive.security.metastore.authorization.manager | org.apache.hadoop.hive.ql.security.authorization.MetaStoreAuthzAPIAuthorizerEmbedOnly | 
| hive.security.authorization.manager | org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdConfOnlyAuthorizerFactory | 
hiveserver2-site.xml:
-hiveconf hive.security.authorization.manager=org.apache.hadoop.hive.ql.security.authorization.plugin.sqlstd.SQLStdHiveAuthorizerFactory
-hiveconf hive.security.authorization.enabled=true
-hiveconf hive.security.authenticator.manager=org.apache.hadoop.hive.ql.security.SessionStateUserAuthenticator
-hiveconf hive.metastore.uris=' '
注意:启动这个的前提是hive.server2.enable.doAs=false. 
权限设置 
各种grant/revoke操作,具体参考文档。 
(详情参考:https://cwiki.apache.org/confluence/display/Hive/SQL+Standard+Based+Hive+Authorization)
- Default Hive Authorization (Legacy Mode)(hive默认的验证方式) 
类似于dbms的授权方式,但是人人都可以执行Grant,当然也可以实现超级用户类来管理hive.开启权限验证后,不配置上面的两个默认就是用这个。
(详情参考:https://cwiki.apache.org/confluence/display/Hive/Hive+Default+Authorization+-+Legacy+Mode) 
总结:hive cli和hcatalog使用了基于hdfs权限加上类似dbsm的验证方式。hiveserver2使用了完全dbms化的sql权限验证(前提是hdfs权限验证通过)
1.3 hive的超级用户
默认hive是不启用权限验证的,只要使用hive的用户在hdfs上权限即可。默认存在超级用户,用户可以通过自定义类来实现超级用户。使用超级启用必须开始权限验证。
2. 授权管理
2.1 开启权限管理
修改以下配置开启基本的权限验证。开始后用户必须给自己授权才能做相应的操作。
<property>
  <name>hive.security.authorization.enabled</name>
  <value>true</value>
  <description>hive是否开启客户端认证,默认是false</description>
</property>
<property>
  <name>hive.security.authorization.createtable.owner.grants</name>
  <value>ALL</value>
  <description>创建表和用户是否拥有该的权限,默认为空,即创建者也没有该表的读写权限。 可以设置all select drop等</description>
</property>
<property>
  <name>hive.security.authorization.createtable.user.grants</name>
  <value>ALL</value>
  <description> 创建表后是否对特定用户权限,默认为空;如可以权限: irwin,hadoop:select;tom:create </description>
</property>
<property>
  <name>hive.security.authorization.createtable.role.grants</name>
  <value>ALL</value>
  <description>当表创建时自动授权给特定角色权限,默认是空;</description>
</property>
<property>
  <name>hive.security.authorization.task.factory</name>
  <value>org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTasFactoryImpl</value>
  <description> 覆盖默认的权限设置hive.security.authorization.task.factory DDL操作,一个实现接口的org.apache.hadoop.hive.ql.parse.authorization.hiveauthorizationtaskfactory</description>
</property>
<property>
  <name>hive.security.command.whitelist</name>
  <value>set</value>
  <description>hive授权用户执行的非SQL命令列表,用都好分隔。默认是set,reset,dfs,add,delete。就是hive授权用户可以执行的非sql命令。
</description>
</property>
<property>
  <name>hive.conf.restricted.list</name>
  <value>hive.security.authorization.manager,hive.security.authenticator.manager,hive.users.in.admin.role</value>
  <description>上面的属性值是限制修改的,即如果不从本属性列表中删除,在命令台reset无效</description>
</property>
2.2 实现超级用户
引用自: 
http://blog.csdn.net/kwu_ganymede/article/details/52733021
package com.ganymede.hiveauth;
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;  
/**
 * Created by Ganymede on 2016/10/4.
 */
public class MyAuthHook extends AbstractSemanticAnalyzerHook {
    private static String[] admin = {"root", "hadoop", "hive"};  //配置Hive管理员  
    @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) && !admin[2].equalsIgnoreCase(userName)) {
                    throw new SemanticException(userName
                            + " can't use ADMIN options, except " + admin[0] + "," + admin[1] + ","
                            + admin[2] + ".");
                }
                break;
            default:
                break;
        }
        return ast;
    }  
    public static void main(String[] args) throws SemanticException {
        String[] admin = {"admin", "root"};
        String userName = "root1";
        for (String tmp : admin) {
            System.out.println(tmp);
            if (!admin[0].equalsIgnoreCase(userName) && !admin[1].equalsIgnoreCase(userName)) {
                throw new SemanticException(userName
                        + " can't use ADMIN options, except " + admin[0] + ","
                        + admin[1] + ".");
            }
        }
    }
}   
将程序打成jar包放到$HIVE_HOME/lib下,然后修改hive-site.mxl文件:
<!-- 配置对hiveserver2生效-->
<property>
    <name>hive.aux.jars.path</name>
    <value>file:///opt/mllib/hive-app.jar</value>
</property>
<!-- 设置超级用户类-->
<property>
    <name>hive.semantic.analyzer.hook</name>
    <value>com.ganymede.hiveauth.MyAuthHook</value>
</property>
设置完超级用户后,其它必须用户必须通过超级用户授权才能做各种操作。
2.3 实现hiveserver2用户名密码
设置hiveserver2的权限验证方式、实现类、用户名密码等:
<property>
  <name>hive.server2.authentication</name>
  <value>CUSTOM</value>
  <description>安全验证方式,默认NONE,可选的包括 OSASL、KERBEROS、LDAP、PAM和CUSTOM等</description>
</property>
<property>
  <name>hive.server2.custom.authentication.class</name>
  <value>com.bqjr.bigdata.hive.hiveserver2.CustomHiveServer2Auth</value>
  <description>实现自定义,实现hiveserver2登录密码校验</description>
</property>
<property>
  <name>hive.server2.custom.authentication.file</name>
  <value>/usr/local/hiveserver2/hive.server2.users.conf</value>
  <description>hiveserver2用户名密码文件</description>
</property>
自定义hiveserver2用户名密码验证实现类:
package com.bqjr.bigdata.hive.hiveserver2;
import org.apache.hadoop.conf.Configuration;
import org.apache.hadoop.hive.conf.HiveConf;
import org.apache.hive.service.auth.PasswdAuthenticationProvider;
import javax.security.sasl.AuthenticationException;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
/**
 * Created by jian.zhang02 on 2016/12/21.
 */
public class CustomHiveServer2Auth   implements PasswdAuthenticationProvider{
    @Override
    public void Authenticate(String username, String password) throws AuthenticationException {
        boolean ok = false;
        String passMd5 = new MD5().md5(password);
        HiveConf hiveConf = new HiveConf();
        Configuration conf = new Configuration(hiveConf);
        String filePath = conf.get("hive.server2.custom.authentication.file");
        System.out.println("hive.server2.custom.authentication.file [" + filePath + "] ..");
        File file = new File(filePath);
        BufferedReader reader = null;
        try {
            reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            while ((tempString = reader.readLine()) != null) {
                String[] datas = tempString.split(",", -1);
                if(datas.length != 2) continue;
                //ok
                if(datas[0].equals(username) && datas[1].equals(passMd5)) {
                    ok = true;
                    break;
                }
            }
            reader.close();
        } catch (Exception e) {
            e.printStackTrace();
            throw new AuthenticationException("read auth config file error, [" + filePath + "] ..", e);
        } finally {
            if (reader != null) {
                try {
                    reader.close();
                } catch (IOException e1) {}
            }
        }
        if(ok) {
            System.out.println("user [" + username + "] auth check ok .. ");
        } else {
            System.out.println("user [" + username + "] auth check fail .. ");
            throw new AuthenticationException("user [" + username + "] auth check fail .. ");
        }
    }
}
2.4 授权
基于默认验证方式的授权。
2.4.1 角色管理
CREATE ROLE role_name
DROP ROLE role_name
GRANT ROLE role_name [, role_name] …
TO principal_specification [, principal_specification] …
[WITH ADMIN OPTION]
REVOKE [ADMIN OPTION FOR] ROLE role_name [, role_name] …
FROM principal_specification [, principal_specification] …
principal_specification:
    USER user
  | GROUP group
  | ROLE role
SHOW ROLE GRANT principal_specification
principal_specification:
    USER user
  | GROUP group
  | ROLE role
2.4.2 权限管理
GRANT
    priv_type [(column_list)]
      [, priv_type [(column_list)]] …
    [ON object_specification]
    TO principal_specification [, principal_specification] …
    [WITH GRANT OPTION]
REVOKE [GRANT OPTION FOR]
    priv_type [(column_list)]
      [, priv_type [(column_list)]] …
    [ON object_specification]
    FROM principal_specification [, principal_specification] …
REVOKE ALL PRIVILEGES, GRANT OPTION
    FROM user [, user] …
priv_type:
    ALL | ALTER | UPDATE | CREATE | DROP
  | INDEX | LOCK | SELECT | SHOW_DATABASE 
object_specification:
    TABLE tbl_name
  | DATABASE db_name
principal_specification:
    USER user
  | GROUP group
  | ROLE role
SHOW GRANT principal_specification
[ON object_specification [(column_list)]]
principal_specification:
    USER user
  | GROUP group
  | ROLE role
object_specification:
    TABLE tbl_name
  | DATABASE db_name
2.4.3 操作与权限对应关系
| Operation | ALTER | UPDATE | CREATE | DROP | INDEX | LOCK | SELECT | SHOW_DATABASE | LOAD | 
|---|---|---|---|---|---|---|---|---|---|
| EXPORT | X | ||||||||
| IMPORT | X | X | X | ||||||
| CREATE TABLE | X | X | |||||||
| CREATE TABLE AS SELECT | X | ||||||||
| DROP TABLE | X | ||||||||
| SELECT | X | ||||||||
| ALTER TABLE ADD COLUMN | X | ||||||||
| ALTER TABLE REPLACE COLUMN | X | ||||||||
| ALTER TABLE RENAME | X | ||||||||
| ALTER TABLE ADD PARTITION | X | ||||||||
| ALTER TABLE DROP PARTITION | X | ||||||||
| ALTER TABLE ARCHIVE | X | ||||||||
| ALTER TABLE UNARCHIVE | X | ||||||||
| ALTER TABLE SET PROPERTIES | X | ||||||||
| ALTER TABLE SET SERDE | X | ||||||||
| ALTER TABLE SET SERDE | X | ||||||||
| ALTER TABLE SET SERDEPROPERTIES | X | ||||||||
| ALTER TABLE CLUSTER BY | X | X | |||||||
| ALTER TABLE PROTECT MODE | X | ||||||||
| ALTER PARTITION PROTECT MODE | X | ||||||||
| ALTER TABLE SET FILEFORMAT | X | ||||||||
| ALTER PARTITION SET FILEFORMAT | X | ||||||||
| ALTER TABLE SET LOCATION | X | ||||||||
| ALTER PARTITION SET LOCATION | X | ||||||||
| ALTER TABLE CONCATENATE | X | ||||||||
| ALTER PARTITION CONCATENATE | X | ||||||||
| SHOW DATABASES | X | ||||||||
| LOCK TABLE | X | ||||||||
| UNLOCK TABLE | X | 
<wiz_tmp_tag id="wiz-table-range-border" contenteditable="false" style="display: none;">
HADOOP docker(七):hive权限管理的更多相关文章
- HADOOP docker(六):hive简易使用指南
		
前言1.hive简介1.1 hive组件与相应功能:1.2 hive的表类型1.3 分区表1.3 分隔符1.4 hive的数据存储2.数据类型2.1 基本数据类型2.1 复杂数据类型2.3 NULL3 ...
 - Hive权限管理(十)
		
Hive权限管理 1.hive授权模型介绍 (1)Storage Based Authorization in the Metastore Server 基于存储的授权 - 可以对Metastore中 ...
 - Docker Volume 之权限管理(转)
		
Volume数据卷是Docker的一个重要概念.数据卷是可供一个或多个容器使用的特殊目录,可以为容器应用存储提供有价值的特性: 持久化数据与容器的生命周期解耦:在容器删除之后数据卷中的内容可以保持.D ...
 - Docker Volume 之权限管理(一)
		
摘要: Volume数据卷是Docker的一个重要概念.数据卷是可供一个或多个容器使用的特殊目录,可以为容器应用存储提供有价值的特性.然而Docker数据卷的权限管理经常是非常令人困惑的.本文将结合实 ...
 - Greeplum 系列(七) 权限管理
		
Greeplum 系列(七) 权限管理 一.角色管理 Role 分为用户(User)和组(Group),用户有 login 权限,组用来管理用户,一般不会有 login 权限.初始化 gp 时创建了一 ...
 - hive权限管理之实践
		
一.实践心得 主要参考这个连接,里面说得也挺详细的.http://www.aboutyun.com/thread-12549-1-1.html 总结如下: 1.若赋予用户某个表的权限,查用户在该表所属 ...
 - Hive权限管理
		
最近遇到一个hive权限的问题,先简单记录一下,目前自己的理解不一定对,后续根据自己的理解程度更新 一.hive用户的概念 hive本身没有创建用户的命令,hive的用户就是Linux用户,若当前是用 ...
 - HADOOP docker(九):hdfs权限
		
1. 概述2. 用户身份标识3. 组映射4.关于权限的实现5.文件系统API的变更6.应用程序shell的变更7.超级用户8.ACLs9.ACL 文件系统API10.ACL命令11.参数配置12.总结 ...
 - hadoop笔记之Hive的管理(远程登录方式)
		
Hive的管理(三) Hive的管理(三) Hive的远程服务 远程服务启动方式 端口号10000 启动方式:hive --service hiveserver (注意:以JDBC或ODBC的程序登录 ...
 
随机推荐
- UIButtonType各个类型的解释:
			
UIButtonType各个类型的解释: typedef NS_ENUM(NSInteger, UIButtonType) { UIButtonTypeCustom = , UIButtonTypeS ...
 - (Nagios)-check_openmanage[Dell]
			
Nagios->check_openmanage[Dell R7*] 2014年11月13日 下午 07:44 需求介绍: 透过Nagios监控Dell R7系列服务器硬件状态 环境信息: ...
 - React的安装方法
			
一:直接使用 BootCDN 的 React CDN 库,地址如下: <script src="https://cdn.bootcss.com/react/16.4.0/umd/rea ...
 - ruby基础知识之 class&module
			
以下分别介绍了class方法和module方法,还有最简单的def方法. 其中module和class的区别下面会说,这里首先声明,def定义的方法,需要定义对象后才能调用,而class和module ...
 - POJ-3436:ACM Computer Factory (Dinic最大流)
			
题目链接:http://poj.org/problem?id=3436 解题心得: 题目真的是超级复杂,但解出来就是一个网络流,建图稍显复杂.其实提炼出来就是一个工厂n个加工机器,每个机器有一个效率w ...
 - python--复习之路的目录
			
想要看时点链接看看,常来复习,温故而知新,可以为师矣. 1:基本类型 python--基本类型之字符串 python--基本类型之列表 python--基本类型之元组 python--基本类型之集合 ...
 - Java技术——Iterator和Enumeration的不同
			
个函数接口.Iterator除了能读取集合的数据之外,也能对数据进行删除操作.尽管前者还没有被弃用但是已经被后者所代替了,Enumeration已经过时的,之所以没有被弃用是因为它仍被几种从以前版本遗 ...
 - 【转载】SOCKS代理:从***到内网漫游
			
原文:SOCKS代理:从***到内网漫游 本文原创作者:tahf,本文属FreeBuf原创奖励计划,未经许可禁止转载 之前在Freebuf上学习过很多大牛写的关于Tunnel.SOCKS代理.***等 ...
 - jQuery File Upload 文件上传插件使用一 (最小安装 基本版)
			
jQuery File Upload 是一款非常强大的文件上传处理插件,支持多文件上传,拖拽上传,进度条,文件验证及图片音视频预览,跨域上传等等. 可以说你能想到的功能它都有.你没想到的功能它也有.. ...
 - NB-IOT使用LWM2M移动onenet基础通信套件对接之APN设置
			
1. 先搞懂APN是做什么的?APN指一种网络接入技术,是通过手机上网时必须配置的一个参数,它决定了手机通过哪种接入方式来访问网络.对于手机用户来说,可以访问的外部网络类型有很多,例如:Interne ...