基于Sentry和Hue对数仓表做权限管理

Hue简介

Hue是什么

Hue是一个可快速开发和调试Hadoop生态系统各种应用的一个基于浏览器的图形化用户接口。

Hue是出自CDH公司,在基于CDH的大数据集群中安装和使用非常方便。

Hue能干什么

1
2
3
4
5
6
7
8
9
10
11
12
13
14
1.访问HDFS和文件浏览 
2.通过web调试和开发hive以及数据结果展示
3.查询solr和结果展示,报表生成
4.通过web调试和开发impala交互式SQL Query
5.spark调试和开发
6.Pig开发和调试
7.oozie任务的开发,监控,和工作流协调调度
8.Hbase数据查询和修改,数据展示
9.Hive的元数据(metastore)查询
10.MapReduce任务进度查看,日志追踪
11.创建和提交MapReduce,Streaming,Java job任务
12.Sqoop2的开发和调试
13.Zookeeper的浏览和编辑
14.数据库(MySQL,PostGres,SQlite,Oracle)的查询和展示

其架构图:

hue-arch

Hue有哪些不足

  • 虽然提供了角色权限管理,但是仅是针对Hue各功能的权限控制
  • 没有办法从库级别、表级别对用户做权限管理

Sentry简介

Sentry是什么

Apache Sentry是一个适用于Hadoop,基于角色粒度的授权模块,旨在成为Hadoop组件的可插拔授权引擎。它允许定义授权规则以验证用户或应用程序对Hadoop资源的访问请求。目前可以与Apache Hive,Apache Solr,Impala和HDFS(仅限于Hive表数据)一起开箱即用。

Sentry同样是出自CDH公司,在基于CDH的大数据集群中安装和使用非常方便。

官网doc

其架构图:

sentry-arch

主要分为三个模块:

  • Sentry Server:管理授权元数据。它支持安全检索和操作元数据的界面;
  • Data Engine:数据处理引擎(如Hive或Impala)。数据引擎执行前会加载Sentry插件,拦截所有访问资源的请求并将其路由到Sentry插件进行验证;
  • Sentry plugin:运行在数据引擎中,验证用户是否有权限。

Sentry能干什么

1
2
3
4
5
6
7
- 对hive库、表、表字段做权限控制
- 对impala库、表、表字段做权限控制,与hive的区别是可以缓存权限(在Catalog server和Impalad都有),授权验证在本地发生并且速度会更快
- 对hdfs目录、文件做权限控制,更关注的是hive数仓的数据(任何属于Hive或Impala中表的数据)
- 权限可分为三级:
- SELECT privilege -> Read access on the file.
- INSERT privilege -> Write access on the file.
- ALL privilege -> Read and Write access on the file.

基于Sentry和Hue对数仓表做权限管理

安装步骤

基于Cloudera-manager可以直接安装Hue和Sentry,安装Hue前需要先安装Oozie。

安装Hue和Sentry都需要先创建mysql库:hue和sentry,并在安装时制定库和库地址。

  1. Hue安装遇到的问题
1
2
3
4
5
6
7
8
9
# 测试mysql链接时缺少jar包,找不到jdbc driver
解决方法:需要将这个包放到这个路径下
/usr/share/java/mysql-connector-java.jar

# 安装后启动进程失败
原因:hue所在的服务器环境没有预先安装httpd,mod_ssl服务
解决方法:
yum -y install httpd
yum -y install mod_ssl

权限配置

修改Hive的Sentry配置
  1. 在hive配置中启用sentry
  2. 禁用“HiveServer2 启用模拟:hive.server2.enable.impersonation”
  3. 配置“sentry-site.xml 的 Hive 服务高级配置代码段(安全阀)”
1
2
3
4
<property>
<name>sentry.hive.testing.mode</name>
<value>true</value>
</property>
修改Impala的Sentry配置
  1. 在Impala配置中启用sentry
  2. 重启Impala即可
1
2
3
注意:若启用了sentry,那么在Impala-jdbc调用时许指定用户。如
原来的url:jdbc:impala://node1.lb.bigdata.dmp.com:21050/prod;AuthMech=0
指定用户后url:jdbc:impala://node1.lb.bigdata.dmp.com:21050/prod;AuthMech=3;UID=impala;PWD=;UseSasl=0

修改Hue的Sentry配置

  1. 在Hue配置中启用sentry
  2. 重启Hue即可
hive角色、用户组和Hue的区别
  • hive role:控制表、库的select、insert权限(通过sentry可以管理)
  • hive group:通常被指定拥有哪些 hive role
  • hue group:通过操作系统上的用户组和Hive的用户组进行关联。因此,配置完Hue用户组后还需配置OS上的用户组(需要配置所有hiveserver3,hue,sentry所在的机器)
  • hue username:需要和hue group保持相同
权限配置
  1. 使用admin用户登录Hue,创建group:hive(赋予所有权限),username:hive
  2. 使用hive用户登录,即可在security菜单中管理hive roles了
  3. 下面是总结创建一个用户的过程
1
2
3
4
5
6
7
8
9
10
11
12
13
1)在hue中创建group(页面操作,admin用户登录)
2)在hue中创建用户(页面操作,admin用户登录),并指定group:
3)所有hiveserver3,hue,sentry所在的机器上创建group(命令行操作)
- useradd group_name

4)在hue中为hive创建role(可在impala或hive的Edit页面操作,hive用户登录)
- create role role_name

5)在hue中为某个group授予角色(可在impala或hive的Edit页面操作,hive用户登录)
- grant role role_name to group group_name;

6)在hue中为创建的role指定库、表等权限(在sentry页面操作,hive用户登录)
7)使用第二步hue创建的用户登录,然后刷新,即可看到指定权限的库、表

遇到的问题

hiveSQL执行add jar失败
1
2
3
4
5
hive配置了sentry后执行下面语句失败
add jar hdfs://nameservice:8020/user/udf/phoenix-4.13.2-cdh5.11.2-hive.jar;

原因:
The ADD JAR command does not work with HiveServer2 and the Beeline client when Beeline runs on a different host.

解决办法:

cloudera官网

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
首先,只能借助hive的辅助jar来实现
在hive配置中修改(配置项:Hive 辅助 JAR 目录):
hive.aux.jars.path=/data/dmp/udf

hive-env.sh中添加(配置项:hive-env.sh 的 Gateway 客户端环境高级配置代码段(安全阀)):
HIVE_AUX_JARS_PATH=/data/dmp/udf

hive-site.xml中添加(配置项hive-site.xml 的 Hive 服务高级配置代码段(安全阀)):
hive.reloadable.aux.jars.path=/data/dmp/udf

然后将用的jar放的hiveserver2所在机器的/data/dmp/udf目录下

之后若有新jar需要加入,直接将jar放到目录下,然后在HiveSQL中执行reload命令即可。

最后在执行SQL时就不需要add jar操作
hiveSQL执行insert overwrite操作失败
1
2
3
4
5
6
7
8
ERROR : Failed with exception Directory hdfs://nameservice/user/hive/warehouse/prod.db/ods_hive_recommend_item_topic_nd could not be cleaned up.
19-03-2019 14:11:17 CST ods_hive_recommend_item_topic_nd
Directory hdfs://nameservice/user/hive/warehouse/prod.db/ods_hive_recommend_item_topic_nd could not be cleaned up.

... ...

Caused by: java.io.IOException: java.util.concurrent.ExecutionException: org.apache.hadoop.security.AccessControlException: Permission denied by sticky bit:
user=hive, path="/user/hive/warehouse/prod.db/ods_hive_recommend_item_topic_nd/000000_0":impala:hive:-rwxrwxrwt, parent="/user/hive/warehouse/prod.db/ods_hive_recommend_item_topic_nd":impala:hive:drwxrwxrwt

发现如下信息:

1
2
3
4
5
6
7
8
9
10
11
12
Permission denied by sticky bit: user=hive,

由于sticky bit导致的错误:
# sticky bit
不同于suid, guid,对于others的execute权限位,则可以设置sticky bit标志,
用t来表示,如果该位置本来就有可执行权限位,即x,则t和x叠加后用大写的T来表示。

sticky bit只对目录起作用,如果一个目录设置了sticky bit,则该目录下的文件只能被
该文件的owner或者root删除,其他用户即使有删除权限也无法删除该文件。

-rwxrwxrwt 3 hdfs hive 636 2018-11-06 10:19 /user/hive/xxxx/000000_0
-rwxrwxrwt 3 hdfs hive 635 2018-11-06 10:19 /user/hive/xxxx/000001_0

解决办法:

1
2
3
将sticky bit配置给移除:

hadoop fs -chmod -R -t /user/hive/xxxx/
© 2019 GuoYL's Notes All Rights Reserved. 本站访客数人次 本站总访问量
Theme by hiero