HADOOP docker(七):hive权限管理

1. 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 操作与权限对应关系

文档链接:

hive权限管理

https://cwiki.apache.org/confluence/display/Hive/LanguageManual+Authorization#LanguageManualAuthorization-1StorageBasedAuthorizationintheMetastoreServer

1. hive权限简介

1.1 hive中的用户与组

hive权限中有用户、组、角色的概念。

  • 用户

    即操作系统中的用户,或者在hiveserver2中定义的用户。

  • 即操作系统中的组。(组是相对默认授权方式来说的)

  • 角色

    是一组权限的集合,参考关系型数据库。

    hive内置public角色。public,所有用户都拥有的角色。

1.2 使用场景

目前主要通过以下三种方式使用hive:

  1. hive cli

    hive cli中的用户是操作系统中存在的用户。使用hive cli,只会验证用户的hdfs目录权限。

  2. hiveserver2

    hiveserver2中的用户即可以是操作系统中的用户,也可以是hiveserver2中定义的用户。

    hiveserver2默认开启用户代理,即用启动hiveserver2的用户来模拟实际用户来提交任务,这时的权限是实际提交的用户的。如果关闭代理,则以启动hiveserver2的用户的权限来执行。

  3. 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)

  1. 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;">

来自为知笔记(Wiz)

时间: 2024-12-26 13:50:17

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.基本操作3.1 数据库操作3.2 表操作3.3 视图3.4 数据导入导出3.hsql3.1 hsql基本操作3.2 hive内置函数3.2 自定义函数3.3 注册函数4.hive权限管理4.1 权限简介4.2 权限分类4.3 授权管理5.hive优化 前言 本手册介绍了hive的基本知识及工作中要

hive权限管理

1开启hive权限管理配置 <property> <name>hive.metastore.authorization.storage.checks</name> <value>true</value> </property> <property><name>hive.metastore.execute.setugi</name><value>false</value><

Greeplum 系列(七) 权限管理

Greeplum 系列(七) 权限管理 一.角色管理 Role 分为用户(User)和组(Group),用户有 login 权限,组用来管理用户,一般不会有 login 权限.初始化 gp 时创建了一个 SUPERUSER ROLE:gpadmin. 表 1 :ALTER ROLE 属性 属性 说明 SUPERUSER/NOSUPERUSER 超级管理员,默认 NOSUPERUSER CREATEDB/OCREATEDB 创建数据库的权限 CREATEROLE/NOCREATEROLE 创建角色

HADOOP docker(九):hdfs权限

1. 概述2. 用户身份标识3. 组映射4.关于权限的实现5.文件系统API的变更6.应用程序shell的变更7.超级用户8.ACLs9.ACL 文件系统API10.ACL命令11.参数配置12.总结 骚年们,我们今天来学习hdfs的权限~ 请忽略4,5两段内容~ 文档:http://hadoop.apache.org/docs/r2.7.3/hadoop-project-dist/hadoop-hdfs/HdfsPermissionsGuide.html 中文文档参考:http://hadoo

hadoop笔记之Hive的管理(远程登录方式)

Hive的管理(三) Hive的管理(三) Hive的远程服务 远程服务启动方式 端口号10000 启动方式:hive --service hiveserver (注意:以JDBC或ODBC的程序登录到hive中操作数据时,必须选用远程服务启动方式,否则我们的程序是连接不上的) 输入hive --service hiveserver以后 Starting Hive Thrift Server 然后就能远程登录到hive当中进行数据库操作

hadoop笔记之Hive的管理(CLI方式)

Hive的管理(一) Hive的管理(一) Hive的启动方式 CLI(命令行)方式 Web界面方式 远程服务启动方式 CLI方式 1. 进入命令行方式 直接输入<HIVE_HOME>/bin/hive的执行程序 或者输入hive --service cli 2. 退出命令行方式 exit; 3. 常用的CLI命令 清屏 ctrl+L或者!clear 查看数据仓库中的表 show tables --查看表列表; 注意在Hive命令行模式下用两个--表示后面的内容属于注释部分,用;表示结束 查看

Hive权限之改进

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

HADOOP docker(四):安装hive

1.hive简介2.安装hive2.1 环境准备2.1.1 下载安装包2.1.2 设置hive用户的环境变量2.1.3 hive服务端配置文件2.1.4 hive客户端配置文件2.1.4 分发hive配置文件2.2 启动hive2.2.1 初始化数据库2.2.2 创建HDFS目录2.2.3 启动hive3.总结 getting start: https://cwiki.apache.org/confluence/display/Hive/GettingStarted hive wiki: htt

osi七层模型 与Linux的一些常用命令和权限管理 继承上篇

OSI 七层模型 应用层:用户接口 表示层:数据的表示.安全.压缩. 会话层:建立.管理.中止会话 传输层:可靠与不可靠的传输.传输前的错误检测.流控 网络层:进行逻辑地址寻址,实现不同网络之间的路由选择 数据链路层:组帧.进行硬件地址寻址.差错效验的功能 物理层:设备与设备之间比特流的传输,物理接口,电气特性等 Linux常用命令 1)cp   复制 cp   源文件  目标位置 -r  复制目录 -p  连带文件属性复制 -d   若源文件是链接文件,则复制链接属性 -a   相当于  -p