【精华】Linux用户Hive权限控制实践
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权限控制实践相关推荐
- hive插件 ranger_Apache Ranger及Hive权限控制
一.Ranger概述 1.Ranger简介 Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计.它可以对Hadoop生态的组件如HDFS.Yarn.Hive.Hbase等进行细粒 ...
- linux的用户及权限管理,Linux 用户及权限管理.doc
? ? ? ? ? ? ? ? Linux 用户及权限管理 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Linux 是一个多用户的操作系统,引入用户,可 ...
- (三)Linux 用户和权限
一.认知 root 用户 1. root 用户(超级管理员) 无论是 Windows.MacOS.Linux 均采用多用户的管理模式进行权限管理 (1)在 Linux 系统中,拥有最大权限的账户名为: ...
- linux php 用户权限管理,LINUX教程:Linux用户及权限管理
<LINUX教程:Linux用户及权限管理>要点: 本文介绍了LINUX教程:Linux用户及权限管理,希望对您有用.如果有疑问,可以联系我们. [文件治理.管道.用户及组治理.用户及权限 ...
- Linux用户和权限
目录 Linux用户和权限 1 Linux的root用户 1.1 root用户(超级管理员) 1.2 su和exit命令 1.3 sudo命令 为普通用户配置sudo认证 2 用户和用户组 2.1 用 ...
- Linux用户与权限管理
Linux用户与权限管理 前言 一.管理用户账号 (1)用户账号概述 ①用户标识UID (User IDentity,用户标识号) ②用户账号文件 (2)用户账号管理 ①添加用户账号(useradd) ...
- linux chown 将root改变所有者为admin,Linux用户管理 权限管理 内存管理 网络管理命令 (第四天)...
默认添加的用户会自动加入和用户名一样的组中 su 切换用户 查看当前登陆的用户: whoami id` 查看当前用户属于哪个组:groups groupadd 组名 添加组 groupdel 组名 删 ...
- Linux用户、权限及改变文件所有者及文件所属组多例详解 附python代码
https://blog.csdn.net/hanhanwanghaha宝藏女孩 欢迎您的关注! 欢迎关注微信公众号:宝藏女孩的成长日记 如有转载,请注明出处(如不注明,盗者必究) Linux用户.权 ...
- 【Linux】Linux用户和权限管理
一.Linux用户和权限管理 用户 权限 命令 管理员用户 只有一个,UID=0的用户就是管理员用户,一般情况,默认它的用户名是root,家目录是/root root :x :0: 0: ...
最新文章
- Python(数据库之表操作)
- 2009年北京突然的一场雪
- response code 404 500
- CF526G Spiders Evil Plan(树上最优性问题、倍增+线段树)
- 自动生成宣传单打印页--提高工作效率
- 路由算法之距离矢量算法和链路状态算法
- 几个C#控件出现闪烁的问题的解决方案(转)
- C++ TBB concurrent_unordered_map find() at() return static_cast<size_t>( t ) * internal::hash_multip
- str.trim()去除空格
- xshell通过隧道连接_如何通过SSH隧道实现远程连接
- 阿里天猫小镇的实质就是为了圈地!
- python编辑dbf文件_Python修改DBF文件指定列
- 1.1.3 NetBIOS编程基础(1)
- java打地鼠小游戏
- 【Android】解决Android Studio中的虚拟设备无法上网问题
- 华为笔记本在linux下越狱苹果设备(2022.2.27更新)
- 知乎日报 API 分析
- php 微信开发回复消息
- 基于FFmpeg的音视频播放器
- 2022年9月全国计算机二级报名通知 @知识兔