Hive权限控制:集成Sentry 和 Hue

作者: b91cbec6a902 | 来源:发表于2019-04-14 19:21 被阅读13次

概述

基于Hive 1.2.1、Sentry 1.5.1

Hive没有实现权限控制的功能,但提供了权限控制的接口。而Sentry实现了Hive提供的权限控制接口,这就是两者结合的关键点。
Hive操作被Sentry插件拦截后,Sentry插件带上用户信息和操作信息通过RPC访问Sentry Server,由Sentry Server来判断是否具有操作权限。

Hive + Sentry

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系统里要存在。

相关文章

网友评论

    本文标题:Hive权限控制:集成Sentry 和 Hue

    本文链接:https://www.haomeiwen.com/subject/jozziqtx.html