1、困惑:
   hadoop和hive通过客户机接入到集群生产,客户机是linux系统,那么linux用户和hive角色之间是什么关系呢?

或者说,怎么控制linux系统用户可以细粒度访问hive的数据库和表。

2、新建linux用户和用户组
   1)#groupadd hphs;
   2)#useradd -d /home/hphs/ -m hphs -g hphs -G hadoop
     指定用户所属的附加组hadoop;
   3)#passwd hphs  
   设置密码为:123!@#
   4)ssh进入hphs,查看所属群组:
      #groups
      显示:hphs hadoop

3、回顾下Linux的ACL控制体系
   1)3个权限组:owner、group和other;
   2)3个权限类:r(读)、w(写)和x(执行);
     r=4,w=2,x=1 
     若要rwx属性则4+2+1=7; 
     若要rw-属性则4+2=6; 
     若要r-x属性则4+1=5。 
   3)在hadoop下有个文件test.txt,用hdfs用户进入:
     目前 
     -rw-r--r--   3 hdfs  supergroup          6 2017-04-05 16:24 /test.txt
     第一:将组赋予hadoop
     hadoop fs -chown hdfs:hadoop /test.txt
     第二:权限修改为组可读其他用户不可读
     hadoop fs -chmod 740 /test.txt
     修改后:
     -rwxr-----   3 hdfs hadoop          6 2017-04-05 16:24 /test.txt

4、HDFS访问控制实践
   集群没有kerberos认证,所以客户机的任何linux用户进入都可以执行hadoop命令。
   如果加入kerberos认证,那linux用户要认证后才能执行hadoop命令。
   1)目录不允许其他用户读写的情形
     —权限:
    drwxrwx---   - hbase hadoop              0 2016-04-14 23:14 /hbase
     —执行:[hphs@appnode142 hphs]$ hadoop fs -ls /hbase
       提示:ls: Permission denied: user=hphs, access=READ_EXECUTE, inode="/hbase":hbase:hadoop:drwxrwx---
   2)目录允许其他用户读的情形
     —权限:
  drwxr-xr-x   - hdfs  hadoop              0 2017-03-15 10:44 /flume 
     —执行:[hphs@appnode142 hphs]$ hadoop fs -ls /flume
     可以看到目录
   3)目录不允许其他用户写的情形
      —权限:
  drwxr-xr-x   - hdfs  hadoop              0 2017-03-15 10:44 /flume 
     —执行:[hphs@appnode142 hphs]$ hadoop fs -mkdir /flume/test
     提示:mkdir: Permission denied: user=hphs, access=WRITE, inode="/flume":hdfs:hadoop:drwxr-xr-x
   4)文件允许组读但不允许其他用户读的情形
     [hphs@appnode142 hdfs]$ hadoop fs -ls /test.txt
     -rwxr-----   3 hdfs hadoop          6 2017-04-05 16:24 /test.txt
     因为hphs也属于hadoop组,所以可以读取,但若要执行,则:
    [hphs@appnode142 hdfs]$ hadoop fs -text /test.txt
    text: Permission denied: user=hphs, access=READ, inode="/test.txt":hdfs:hadoop:-rwxr-----
   如此可以总结:
   linux用户在hdfs上访问权限是通过ACL控制的。

5、总结Hive权限控制体系
   1)Hive授权的核心就是用户(User)、组(Group)、角色(Role);
     Hive中的角色可以理解为一部分有一些相同“属性”的用户或组或角色的集合。
     用户和组使用的是Linux机器上的用户和组,而角色是Hive本身创建。
   2)例子:
     用户     组            
     db1      group_db1
     db2      group_db2
     dball    group_all
    有三个用户分别属于group_db1、group_db2、group_all;
    group _db1、group _db2、group_all分别表示该组用户可以访问数据库1、数据库2和可以访问1、2两个数据库;
    创建role_db1和role_db2,分别并授予访问数据库1和数据库2的权限,再将role_db1赋给group_db1(或者该组的所有用户),将role_db2赋给group_db2,就可以是实现指定用户访问指定数据库。
    最后创建role_all指向role_db1、role_db2(role_all不需要指定访问那个数据库),然后role_all授予group_all,则group_all中的用户可以访问两个数据库。

6、Hive权限控制启用需要配置hive-site.xml文件,如下:

<property><name>hive.metastore.authorization.storage.checks</name><value>true</value>
</property>
<property><name>hive.metastore.execute.setugi</name><value>false</value>
</property>
<property><name>hive.security.authorization.enabled</name><value>true</value>
</property>
<property><name>hive.security.authorization.createtable.owner.grants</name><value>ALL</value>
</property>

其中hive.security.authorization.createtable.owner.grants设置成ALL表示用户对自己创建的表是有所有权限。
  开启了权限控制,却发现任何用户都可以Grant/Revoke操作,需要设置hive管理员账户。

7、Hive管理员权限
   1)自定义权限控制类

package com.hive;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  HiveAdmin extends AbstractSemanticAnalyzerHook {private static String admin = "hdfs";@Overridepublic 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;}
}

2)打包上传HiveAdmin.jar
     hive-env.sh配置对hive的shell终端生效
     export HIVE_AUX_JARS_PATH=file:///home/hdfs/fangjs/HiveAdmin.jar 
     hive-site.xml配置对hiveserver2生效  
     <property>  
        <name>hive.aux.jars.path</name>  
        <value>file:///home/hdfs/fangjs/HiveAdmin.jar</value>  
    </property>

3)添加控制类HiveAdmin到Hive的配置文件(hive-site.xml)中
    <property> 
    <name>hive.semantic.analyzer.hook</name> 
    <value>com.hive.HiveAdmin</value> 
    </property>

4)添加了配置文件以后,重启Hive Server生效。
     至此,只有hdfs用户是hive管理员,可以进行Grant/Revoke操作。

8、Hive权限控制实践
   1)现在有两个linux用户和用户组,如下:
     hdfs:hdfs  -具有hive管理员权限
     hphs:hphs
     hive中有一个数据库cardb和数据表car_hosturl_m;
   
   2)为不修改hive-site.xm文件和重启Hive Server,这里直接在hive打开的shell上启用权限控制功能,相当于第6步作用。
     set hive.security.authorization.enabled=true;
     set hive.security.authorization.createtable.owner.grants = ALL;
     set hive.security.authorization.task.factory = org.apache.hadoop.hive.ql.parse.authorization.HiveAuthorizationTaskFactoryImpl;
      
     第三个设置是为避免如出现FAILED: SemanticException The current builtin authorization in Hive is incomplete and disabled.这个异常。
   
   3)为不修改hive-site.xm文件和重启Hive Server,这里直接hive打开的shell上上传HiveAdmin.jar包并设置参数,相当于第7步作用;  
     set hive.semantic.analyzer.hook=com.hive.HiveAdmin;
     add jar /home/hdfs/fangjs/HiveAdmin.jar;
     
   4)以下面两个角色操作为例
     hive>create role role_cardb;
     hive>GRANT SELECT ON DATABASE cardb TO USER hdfs;
     hdfs和hphs都可以能使用权限操作命令;
     配置com.hive.HiveAdmin类后发现没生效,怀疑和环境有关,或者要重启hiveserver才有效。
     查看hive版本#hive --version   执行结果:Hive 1.1.0-cdh5.5.0
     hive版本Hive 1.2.1000.2.5.3.0-37上类org.apache.hadoop.hive.ql.exec.DDLTask实现管理员权限。
     Hive管理员权限待继续研究新版本的Hive。

9、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 : 允许用户查看可用的数据库

10、登录hive元数据库,可以发现以下表:
    Db_privs:记录了User/Role在DB上的权限
    Tbl_privs:记录了User/Role在table上的权限
    Tbl_col_privs:记录了User/Role在table column上的权限
    Roles:记录了所有创建的role
    Role_map:记录了User与Role的对应关系
     
11、参考资料:
   http://blog.csdn.net/fjssharpsword/article/details/51312153
   http://www.aboutyun.com/thread-12549-1-1.html
   http://blog.csdn.net/kwu_ganymede/article/details/52728623
   http://blog.csdn.net/kwu_ganymede/article/details/52733021

【精华】Linux用户Hive权限控制实践相关推荐

  1. hive插件 ranger_Apache Ranger及Hive权限控制

    一.Ranger概述 1.Ranger简介 Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计.它可以对Hadoop生态的组件如HDFS.Yarn.Hive.Hbase等进行细粒 ...

  2. linux的用户及权限管理,Linux 用户及权限管理.doc

    ? ? ? ? ? ? ? ? Linux 用户及权限管理 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Linux 是一个多用户的操作系统,引入用户,可 ...

  3. (三)Linux 用户和权限

    一.认知 root 用户 1. root 用户(超级管理员) 无论是 Windows.MacOS.Linux 均采用多用户的管理模式进行权限管理 (1)在 Linux 系统中,拥有最大权限的账户名为: ...

  4. linux php 用户权限管理,LINUX教程:Linux用户及权限管理

    <LINUX教程:Linux用户及权限管理>要点: 本文介绍了LINUX教程:Linux用户及权限管理,希望对您有用.如果有疑问,可以联系我们. [文件治理.管道.用户及组治理.用户及权限 ...

  5. Linux用户和权限

    目录 Linux用户和权限 1 Linux的root用户 1.1 root用户(超级管理员) 1.2 su和exit命令 1.3 sudo命令 为普通用户配置sudo认证 2 用户和用户组 2.1 用 ...

  6. Linux用户与权限管理

    Linux用户与权限管理 前言 一.管理用户账号 (1)用户账号概述 ①用户标识UID (User IDentity,用户标识号) ②用户账号文件 (2)用户账号管理 ①添加用户账号(useradd) ...

  7. linux chown 将root改变所有者为admin,Linux用户管理 权限管理 内存管理 网络管理命令 (第四天)...

    默认添加的用户会自动加入和用户名一样的组中 su 切换用户 查看当前登陆的用户: whoami id` 查看当前用户属于哪个组:groups groupadd 组名 添加组 groupdel 组名 删 ...

  8. Linux用户、权限及改变文件所有者及文件所属组多例详解 附python代码

    https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) Linux用户.权 ...

  9. 【Linux】Linux用户和权限管理

    一.Linux用户和权限管理 用户 权限 命令 管理员用户 只有一个,UID=0的用户就是管理员用户,一般情况,默认它的用户名是root,家目录是/root root     :x   :0:  0: ...

最新文章

  1. Python(数据库之表操作)
  2. 2009年北京突然的一场雪
  3. response code 404 500
  4. CF526G Spiders Evil Plan(树上最优性问题、倍增+线段树)
  5. 自动生成宣传单打印页--提高工作效率
  6. 路由算法之距离矢量算法和链路状态算法
  7. 几个C#控件出现闪烁的问题的解决方案(转)
  8. C++ TBB concurrent_unordered_map find() at() return static_cast<size_t>( t ) * internal::hash_multip
  9. str.trim()去除空格
  10. xshell通过隧道连接_如何通过SSH隧道实现远程连接
  11. 阿里天猫小镇的实质就是为了圈地!
  12. python编辑dbf文件_Python修改DBF文件指定列
  13. 1.1.3 NetBIOS编程基础(1)
  14. java打地鼠小游戏
  15. 【Android】解决Android Studio中的虚拟设备无法上网问题
  16. 华为笔记本在linux下越狱苹果设备(2022.2.27更新)
  17. 知乎日报 API 分析
  18. php 微信开发回复消息
  19. 基于FFmpeg的音视频播放器
  20. 2022年9月全国计算机二级报名通知 @知识兔

热门文章

  1. Java设计模式(六):命令设计模式
  2. 转载-如何应对在线故障
  3. C++零食:WTL中使用双缓冲避免闪烁
  4. UITextField的属性与程序启动后一系列方法
  5. USACO Section1.3 Combination Lock 解题报告
  6. hdoj 2544 最短路
  7. min-height最小高度的实现(兼容IE6、IE7、FF)
  8. 【Vegas原创】将treeview父结点的链接改为折叠事件
  9. date new 转换时区_Pandas 时间序列 时区控制
  10. matlab-高数 polar 极坐标系 绘制阿基米德线,心形线