hive玩转大数据程序员

Apache Ranger及Hive权限控制

2017-08-03  本文已影响3101人  便利蜂数据平台

一、Ranger概述

1.Ranger简介

Apache Ranger提供一个集中式安全管理框架, 并解决授权和审计。它可以对Hadoop生态的组件如HDFS、Yarn、Hive、Hbase等进行细粒度的数据访问控制。通过操作Ranger控制台,管理员可以轻松的通过配置策略来控制用户访问权限。

本文章介绍Ranger与Hive集成过程,与使用方法

2.Ranger包含以下组件

000.jpg

3.Ranger依赖的组件:

4.目前Ranger0.7支持的Plugin

二、Ranger编译安装

说明: Ranger可以在Ambari上直接安装。开启AmbariHivePlugin也可以直接在页面上操作。
但如果跟ApacheHive集成的话,需要先编译出ApacheRanger的HivePlugin来

1.Apache Ranger编译

#Install maven git gcc mysql
git clone https://github.com/apache/ranger.git
cd ranger
git checkout release-ranger-0.7.1
mvn clean compile package assembly:assembly install -DskipTests
ls target

2.通过Ambari安装Ranger

#导入JDBC驱动:
#(MySQL JDBC Driver Jar包下载页面:https://dev.mysql.com/downloads/connector/j/5.0.html)
wget https://dev.mysql.com/get/Downloads/Connector-J/mysql-connector-java-5.0.8.tar.gz
tar -zxvf mysql-connector-java-5.0.8.tar.gz
ambari-server setup --jdbc-db=mysql --jdbc-driver=mysql-connector-java-5.0.8/mysql-connector-java-5.0.8-bin.jar

3.安装RangerHivePlugin

登陆RangerAdmin: http://l-node1.data.beta.cn0:6080

#AmbariHive可直接在Ambari页面上操作
#ApacheHive的话 需要执行以下命令:

# 1.拷贝RangerHivePlugin安装包
cp target/ranger-0.7.1-hive-plugin.tar.gz /usr/apache
tar -zxvf /usr/apache/ranger-0.7.1-hive-plugin.tar.gz

# 2.编辑install.properties文件
#编辑POLICY_MGR_URL 指向RangerAdmin 例如 POLICY_MGR_URL=http://l-node1.data.beta.cn0:6080
#编辑REPOSITORY_NAME 要与RangerAdmin中ServiceName配置一致 例如 REPOSITORY_NAME=hivebeta
vim /usr/apache/ranger-0.7.1-hive-plugin/install.properties

# 3.配置JAVA_HOME HIVE_HOME 环境变量
echo "export JAVA_HOME=/usr/java/jdk1.8.0_141" >> /etc/bashrc
echo "export HIVE_HOME=/usr/apache/hive" >> /etc/bashrc
source /etc/bashrc

# 4.开启plugin
sudo sh /usr/apache/ranger-0.7.1-hive-plugin/enable-hive-plugin.sh
#显示Ranger Plugin for hive has been enabled. Please restart hive to ensure that changes are effective.即成功

# 5.重启HiveServer

4.RangerAdmin上面配置要管理的HiveServer实例

001.png
002.png

三、Ranger Hive权限控制

1.准备测试数据

点击hivebeta 开始Hive权限控制

003.png

根据我们刚才的配置,hive用户拥有all权限

使用beeline登陆
[hive@l-node3 hive]$ bin/beeline
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/apache/apache-hive-2.3.0-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hdp/2.6.1.0-129/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 2.3.0 by Apache Hive
beeline> !connect jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha
Connecting to jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha
Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: hive
Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:
17/08/03 11:49:28 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000
Connected to: Apache Hive (version 2.3.0)
Driver: Hive JDBC (version 2.3.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ

#创建ranger测试库
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> create database ranger_test_db;
No rows affected (0.259 seconds)
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;
No rows affected (0.114 seconds)

#创建测试表
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user
. . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)
. . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED
. . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'
. . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;
No rows affected (0.317 seconds)
# 表数据
[hive@l-node3 hive]$ hadoop fs -cat /tmp/t_user.data
meizi   18518760001
xuaner  18518760002
afa 18518760003
hanze   18518760004
xupeng  18518760005
xiaofeng    18518760006
shuoshuo    18518760007
# 导入数据
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> LOAD DATA INPATH '/tmp/t_user.data' INTO TABLE t_user;
No rows affected (0.523 seconds)

#查询成功
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
+--------------+---------------+
| t_user.name  | t_user.phone  |
+--------------+---------------+
| meizi        | 18518760001   |
| xuaner       | 18518760002   |
| afa          | 18518760003   |
| hanze        | 18518760004   |
| xupeng       | 18518760005   |
| xiaofeng     | 18518760006   |
| shuoshuo     | 18518760007   |
+--------------+---------------+
7 rows selected (0.11 seconds)

2.HiveAccess(对库、表、列的授权)

# 在Ranger UserSync机器上创建测试用户rangeruser1
[root@l-node1 ~]# useradd rangeruser1
# 测试未授权的用户
[hive@l-node3 hive]$ bin/beeline
SLF4J: Class path contains multiple SLF4J bindings.
SLF4J: Found binding in [jar:file:/usr/apache/apache-hive-2.3.0-bin/lib/log4j-slf4j-impl-2.6.2.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: Found binding in [jar:file:/usr/hdp/2.6.1.0-129/hadoop/lib/slf4j-log4j12-1.7.10.jar!/org/slf4j/impl/StaticLoggerBinder.class]
SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
Beeline version 2.3.0 by Apache Hive
beeline> !connect jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha
Connecting to jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/;serviceDiscoveryMode=zooKeeper;zooKeeperNamespace=hiveserver2_ha

#使用rangeruser1用户登陆
Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: rangeruser1
Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:
17/08/03 12:30:58 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000
Connected to: Apache Hive (version 2.3.0)
Driver: Hive JDBC (version 2.3.0)
Transaction isolation: TRANSACTION_REPEATABLE_READ

# use db; select table; 等访问全部被拒绝
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [USE] privilege on [ranger_test_db] (state=42000,code=40000)
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from ranger_test_db.t_user;
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [SELECT] privilege on [ranger_test_db/t_user/*] (state=42000,code=40000)

给rangeruser1用户授权

点击Add New Policy给rangeruser1用户授予ranger_test_db.t_user.* select权限

004.png
#select成功
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;
No rows affected (0.127 seconds)
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
+--------------+---------------+
| t_user.name  | t_user.phone  |
+--------------+---------------+
| meizi        | 18518760001   |
| xuaner       | 18518760002   |
| afa          | 18518760003   |
| hanze        | 18518760004   |
| xupeng       | 18518760005   |
| xiaofeng     | 18518760006   |
| shuoshuo     | 18518760007   |
+--------------+---------------+
7 rows selected (0.12 seconds)

#删除表 被拒绝
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> drop table t_user;
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [DROP] privilege on [ranger_test_db/t_user] (state=42000,code=40000)

#创建表 被拒绝
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user2
. . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)
. . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED
. . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'
. . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;
Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [CREATE] privilege on [ranger_test_db/t_user2] (state=42000,code=40000)

Delegate Admin(委托管理员)说明: 如果一个Condition中的 用户/组 为Delegate Admin,那么该 用户/组 可以修改上面resource的权限 并可以把此resource授权给其他人

也可以使用SQL进行授权(授权过的记录同样会显示在RangerAdmin上):
GRANT SELECT ON TABLE ranger_test_db.t_user TO USER fengjie;

3.Masking(动态列屏蔽)

动态列屏蔽: 可以将一列数据进行屏蔽操作 如哈希、加密、打马赛克等

添加一个Masking Policy

005.png
006.png

Select Masking Option里面填Mask的选项,默认有: 显示前4位、显示后4位、哈希、Null值、日期类型仅显示年等。我们这里使用Custom自定义,
其实就是写Select子句 可以根据逻辑自己实现,也可使用UDF。本例中我们使用concat(substr(phone,1,7),'****')将手机号的后四位屏蔽掉

0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
+--------------+---------------+
| t_user.name  | t_user.phone  |
+--------------+---------------+
| meizi        | 1851876****   |
| xuaner       | 1851876****   |
| afa          | 1851876****   |
| hanze        | 1851876****   |
| xupeng       | 1851876****   |
| xiaofeng     | 1851876****   |
| shuoshuo     | 1851876****   |
+--------------+---------------+
7 rows selected (0.173 seconds)

4.Row Level Filter(行级别过滤)

行级别过滤: 可以过滤掉行数据。比如订单表,北京的员工仅允许看北京的订单数据,其他地区的数据被强制过滤掉

添加一个Row Level Filter Policy

007.png
008.png

Row Level Filter里面填Filter的过滤规则,其实就是写Where子句。本例中我们使用name <> 'hanze'将 name为'hanze'的用户过滤掉

#hanze用户已经被过滤掉,不显示在结果中了
0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
+--------------+---------------+
| t_user.name  | t_user.phone  |
+--------------+---------------+
| meizi        | 1851876****   |
| xuaner       | 1851876****   |
| afa          | 1851876****   |
| xupeng       | 1851876****   |
| xiaofeng     | 1851876****   |
| shuoshuo     | 1851876****   |
+--------------+---------------+
6 rows selected (0.164 seconds)

四、基于TAG的权限控制

Apache Ranger可以和Apache Atlas(数据治理,元数据仓储)组件一起使用,它可以定义一种基于标签的安全服务,通过使用标签对文件和数据资产进行分类,并控制用户和用户组对一系列标签的访问。

Apache Atlas里面可以对资源打Tag。打了Tag后 我们可以在这里根据Tag来控制权限
(注意:因需要集成Atlas 此功能暂未验证)

1.添加TagService

009.png
010.png

2.添加TagPolicy

011.png
012.png

上图的Policy,实现了这样的场景:
产品组(product)可以访问带"TAG"标签的资源; 但实习生(intern)不靠谱 实习生没有访问权限; 但因实习生中的meizi表现突出 给他赋予访问权限

3.授权流程:

013.png

先检查基于Tag的权限是否拒绝,如果拒绝的话,报错退出。
如果不拒绝,再检查基于Resource的权限拒不拒绝。
如果不拒绝,再检查Tag的权限允不允许,Resource的权限允不允许。

五、Audit审计记录

1.Access

此页面记录每次授权的信息 包括策略id、时间、访问用户、访问的资源、访问的类型、授权结果等信息。可以根据条件进行搜索
开启此功能需要先安装Solr

014.png

2.Admin

此页面记录对策略的操作

015.png

3.Login Sessions

此页面记录登陆RangerAdmin的操作

016.png

4.Plugins

记录Plugins的同步策略

017.png

5.Pugins Status

Plugin的状态

018.png

六、RestAPI

以上在RangerAdminWeb上操作的东西 都可以在RestAPI里面操作。
比如 添加服务、更新服务、删除服务、搜索服务、获取策略、创建策略、更新策略、删除策略、搜索策略等

API name                Create Policy
Request Type            POST
Request URL             service/public/v2/api/policy
Request Parameters      Application/json

Hive Example:
{
 "policyName": "FinancePolicy",
 "databases": "finance,hr",
 "tables": "invoices,emps",
 "columns": "amt, emp_id",
 "udfs": "",
 "description": "Hive Policy",
 "repositoryName": "hivedev",
 "repositoryType": "hive",
 "tableType": "Exclusion",
 "columnType": "Inclusion",
 "isEnabled": true,
 "isAuditEnabled": true,
 "permMapList": [
 {
 "userList": [
 "john",
 "andrew"
 ],
 "permList": [
 "Write",
 "Admin"
 ]
 },
 {
 "userList": [
 "hr"
 ],
 "groupList": [
 "admin"
 ],
 "permList": [
 "Read",
 "Write",
 "Admin"
 ]
 }
 ]
}

参考文档

Apache Ranger Installation

Apache Ranger User Guide

Hortonworks HDP doc

HDFS + Ranger

Ranger PPT

Ranger + Atlas PPT

上一篇 下一篇

猜你喜欢

热点阅读