一、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
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实例
三、Ranger Hive权限控制
1.准备测试数据
点击hivebeta
开始Hive权限控制
根据我们刚才的配置,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权限
#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
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
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
2.添加TagPolicy
上图的Policy,实现了这样的场景:
产品组(product)可以访问带"TAG"标签的资源; 但实习生(intern)不靠谱 实习生没有访问权限; 但因实习生中的meizi
表现突出 给他赋予访问权限
3.授权流程:
先检查基于Tag的权限是否拒绝,如果拒绝的话,报错退出。
如果不拒绝,再检查基于Resource的权限拒不拒绝。
如果不拒绝,再检查Tag的权限允不允许,Resource的权限允不允许。
五、Audit审计记录
1.Access
此页面记录每次授权的信息 包括策略id、时间、访问用户、访问的资源、访问的类型、授权结果等信息。可以根据条件进行搜索
开启此功能需要先安装Solr
2.Admin
此页面记录对策略的操作
3.Login Sessions
此页面记录登陆RangerAdmin的操作
4.Plugins
记录Plugins的同步策略
5.Pugins Status
Plugin的状态
六、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"
]
}
]
}