Apache Ranger及Hive权限控制

一、Ranger概述

1.Ranger简介

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

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

2.Ranger包含以下组件

  • Ranger Admin 用户管理策略,提供WebUI和RestFul接口
  • Ranger UserSync 用于将Unix系统或LDAP用户/组同步到RangerAdmin
  • Ranger TagSync 同步Atlas中的Tag信息
  • Ranger KMS
000.jpg

3.Ranger依赖的组件:

  • JDK 运行RangerAdmin RangerKMS
  • RDBMS 1.存储授权策略 2.存储Ranger 用户/组 3.存储审核日志
  • Solr(可选) 存储审核日志
  • HDFS(可选) 存储审核日志
  • Kerberos(可选) 确保所有请求都被认证

4.目前Ranger0.7支持的Plugin

  • HDFS
  • YARN
  • SOLR
  • ATLAS
  • HBASE
  • KNOX
  • KAFKA
  • HIVE
  • STORM
  • NIFI

二、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

  • 前置条件:
  • 1.必须有 MySQL/Oracle/Postgres/MSSQL/SQL Anywhere Server 数据库实例
  • 2.在RangerAdmin主机上 必须安装DB Client
  • 3.确保DB Admin用户可以再其他机器上登陆(用来创建ranger用户)
  • 4.执行下面的命令 导入JDBC驱动 ambari-server setup --jdbc-db={database-type} --jdbc-driver={/jdbc/driver/path}
#导入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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 211,817评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,329评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,354评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,498评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,600评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,829评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,979评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,722评论 0 266
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,189评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,519评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,654评论 1 340
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,329评论 4 330
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,940评论 3 313
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,762评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,993评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,382评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,543评论 2 349

推荐阅读更多精彩内容