Hive权限控制:集成Sentry 和 Hue
概述
基于Hive 1.2.1、Sentry 1.5.1
Hive没有实现权限控制的功能,但提供了权限控制的接口。而Sentry实现了Hive提供的权限控制接口,这就是两者结合的关键点。
Hive操作被Sentry插件拦截后,Sentry插件带上用户信息和操作信息通过RPC访问Sentry Server,由Sentry Server来判断是否具有操作权限。
Sentry配置
1、配置sentry-site.xml。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>sentry.service.security.mode</name>
<value>none</value>
</property>
<property>
<name>sentry.service.admin.group</name>
<value>hue,hive</value>
</property>
<property>
<name>sentry.service.allow.connect</name>
<value>impala,hive,hue</value>
</property>
<!-- 指定Sentry Server的访问地址 -->
<property>
<name>sentry.service.client.server.rpc-address</name>
<value>localhost</value>
</property>
<property>
<name>sentry.service.client.server.rpc-port</name>
<value>8038</value>
</property>
<!-- 这里使用MySQL存储Sentry的数据 -->
<property>
<name>sentry.store.jdbc.url</name>
<value>jdbc:mysql://localhost/sentry?characterEncoding=UTF-8</value>
</property>
<property>
<name>sentry.store.jdbc.driver</name>
<value>com.mysql.jdbc.Driver</value>
</property>
<property>
<name>sentry.store.jdbc.user</name>
<value>root</value>
</property>
<property>
<name>sentry.store.jdbc.password</name>
<value>123456</value>
</property>
<property>
<name>sentry.service.web.enable</name>
<value>true</value>
</property>
<property>
<name>sentry.service.web.port</name>
<value>51000</value>
</property>
<property>
<name>sentry.service.web.authentication.type</name>
<value>NONE</value>
</property>
<property>
<name>sentry.hive.server</name>
<value>server1</value>
</property>
<property>
<name>hive.sentry.provider</name>
<value>org.apache.sentry.provider.file.HadoopGroupResourceAuthorizationProvider</value>
</property>
<!-- Hive 结合Sentry使用 -->
<property>
<name>sentry.hive.testing.mode</name>
<value>true</value>
</property>
</configuration>
2、启动Sentry。
Hive配置
1、hive-site.xml 新增以下配置
<!-- Sentry实现的Metastore访问拦截插件 -->
<property>
<name>hive.metastore.event.listeners</name>
<value>org.apache.sentry.binding.metastore.SentryMetastorePostEventListener</value>
</property>
<property>
<name>hive.metastore.pre.event.listeners</name>
<value>org.apache.sentry.binding.metastore.MetastoreAuthzBinding</value>
</property>
<property>
<name>hive.metastore.filter.hook</name>
<value>org.apache.sentry.binding.metastore.SentryMetaStoreFilterHook</value>
</property>
<!-- Sentry插件需要的配置信息,主要包括Sentry Server的地址 -->
<property>
<name>hive.sentry.conf.url</name>
<value>file:///etc/hive/conf/hive-sentry.xml</value>
</property>
<!-- 通过Hive CURD权限的插件 -->
<property>
<name>hive.server2.session.hook</name>
<value>org.apache.sentry.binding.hive.HiveAuthzBindingSessionHook</value>
</property>
<property>
<name>hive.security.authorization.task.factory</name>
<value>org.apache.sentry.binding.hive.SentryHiveAuthorizationTaskFactoryImpl</value>
</property>
<property>
<name>hive.server2.enable.impersonation</name>
<value>false</value>
</property>
2、新增hive-sentry.xml文件,并跟hive-site.xml放在同一目录下。
这个文件主要配置的是Sentry Server的访问地址,集成在Hive里面的Sentry插件需要这些信息。
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<property>
<name>sentry.service.security.mode</name>
<value>none</value>
</property>
<property>
<name>sentry.service.client.server.rpc-address</name>
<value>localhost</value>
</property>
<property>
<name>sentry.service.client.server.rpc-port</name>
<value>8038</value>
</property>
<property>
<name>sentry.service.client.server.rpc-connection-timeout</name>
<value>200000</value>
</property>
<property>
<name>sentry.metastore.service.users</name>
<value>hive</value>
</property>
<property>
<name>sentry.hive.provider</name>
<value>org.apache.sentry.provider.file.HadoopGroupResourceAuthorizationProvider</value>
</property>
<property>
<name>sentry.hive.server</name>
<value>server1</value>
</property>
<property>
<name>sentry.hive.testing.mode</name>
<value>true</value>
</property>
<property>
<name>sentry.hive.provider.backend</name>
<value>org.apache.sentry.provider.db.SimpleDBProviderBackend</value>
</property>
<property>
<name>sentry.hive.testing.mode</name>
<value>true</value>
</property>
</configuration>
这里文件的名称可自定义,文件的位置也可以自定义,只要与hive-site.xml里的以下配置对应上即可。
<!-- Sentry插件需要的配置信息,主要包括Sentry Server的地址 -->
<property>
<name>hive.sentry.conf.url</name>
<value>file:///etc/hive/conf/hive-sentry.xml</value>
</property>
3、将Sentry插件包拷贝至Hive的lib目录下。
Sentry插件包在Sentry的lib目录下可以找到,sentrry-binding-hive-xxxx.jar的那个就是。
image.png
4、重启Hive-Server和Hive-Metastore。
注意:Hive的权限控制只对Beeline和JDBC方式有效,对Hive Cli方式无效。因此我们需要限制使用Hive Cli连接方式。
通过Hive中管理权限
root@xxxx (18:59:37) ~ # beeline -u jdbc:hive2://localhost:10000 -n hive -p hive
scan complete in 3ms
Connecting to jdbc:hive2://localhost:10000
Connected to: Apache Hive (version 1.1.0-cdh5.12.1)
Driver: Hive JDBC (version 1.1.0-cdh5.12.1)
Transaction isolation: TRANSACTION_REPEATABLE_READ
Beeline version 1.1.0-cdh5.12.1 by Apache Hive
0: jdbc:hive2://localhost:10000> show roles;
INFO : Compiling command(queryId=hive_20190414185959_e3dc7f9e-db8d-4595-90fe-f997bdb35f50): show roles
INFO : Semantic Analysis Completed
INFO : Returning Hive schema: Schema(fieldSchemas:[FieldSchema(name:role, type:string, comment:from deserializer)], properties:null)
INFO : Completed compiling command(queryId=hive_20190414185959_e3dc7f9e-db8d-4595-90fe-f997bdb35f50); Time taken: 0.118 seconds
INFO : Concurrency mode is disabled, not creating a lock manager
INFO : Executing command(queryId=hive_20190414185959_e3dc7f9e-db8d-4595-90fe-f997bdb35f50): show roles
INFO : Starting task [Stage-0:DDL] in serial mode
INFO : Completed executing command(queryId=hive_20190414185959_e3dc7f9e-db8d-4595-90fe-f997bdb35f50); Time taken: 0.149 seconds
INFO : OK
+-------------+--+
| role |
+-------------+--+
| admin_role |
| bi_role |
+-------------+--+
2 rows selected (0.362 seconds)
0: jdbc:hive2://localhost:10000>
常用命令如下:
CREATE ROLE role_name :创建角色
DROP ROLE role_name :删除角色
GRANT ROLE role_test1 TO USER abc :把role_test1角色授权给abc用户
SHOW ROLE GRANT USER abc:查看abc用户被授权的角色
注意:这里的用户是在Linux系统中也存在。
通过Hue中管理权限
1、hue.ini修改如下配置。
###########################################################################
# Settings for the Sentry lib
###########################################################################
[libsentry]
# Sentry服务地址
hostname=localhost
# Sentry服务端口号
port=8038
# Sentry的配置文件位置
sentry_conf_dir=/etc/sentry/conf
# Number of seconds when the privilege list of a user is cached.
## privilege_checker_caching=30
2、重启Hue,并使用Hue的管理员用户进行登录,进行权限配置。
Hue权限管理页面
角色权限管理
注意:在Hue涉及到以下几个概念:
①Role角色:权限的集合。
②Group用户组:角色是赋予给用户组的。这个用户组在Linux系统里要存在。
③User用户:用户归属于用户组。这个用户在Linux系统里要存在。