一、Ranger是什么
ranger大数据领域的一个集中式安全管理框架,它可以对诸如hdfs、hive、kafka、storm等组件进行细粒度的权限控制。比如它可以控制用户读取hdfs文件的权限,甚至可以控制某个用户对hive某个列访问的权限。
ranger目前支持的组件:
二、Ranger的权限模型
Ranger的权限模型一条条的权限策略组成的,权限策略主要由3个方面组成,即用户、资源、权限。
用户:ranger可以对用户进行分组,一个用户可以属于多个分组。Ranger支持对用户或者用户组配置某资源的相关权限。
资源:对于各个不同的组件,资源的表述都不相同。比如在HDFS中,文件路径就是资源,而在Hive中,资源可以指Database、Table甚至Column。
权限:ranger可以对各个资源的读、写、访问进行限制,具体可以配置白名单、白名单排除、黑名单、黑名单排除等条目。
ranger管理员配置好组件的相关策略后,并且将ranger插件安装到具体的大数据组件中,ranger就可以开始生效了。这时用户访问ranger就会进行权限的校验过程了,校验过程如下:
当用户要请求某个资源时,会先获取和这个资源有关联的所有配置的策略,之后遍历这些策略,然后根据黑白名单判断该用户是否有权限访问该资源。从上面的流程图可以看出,黑名单、黑名单排除、白名单、白名单排除匹配的优先级如下:
1.黑名单优先级高于白名单
2.黑名单排除的优先级高于黑名单
3.白名单排除的优先级高于白名单denyException >> deny >> allowException >> allow
黑名单排除优先级 >> 黑名单 >> 白名单排除优先级 >> 白名单
决策下放:
如果没有policy能决策访问,一般情况是认为没有权限拒绝访问,然而Ranger还可以选择将决策下放给系统自身的访问控制层。
三、Ranger架构
1.组件介绍
- RangerAdmin
以RESTFUL形式提供策略的增删改查接口,同时内置一个Web管理页面。
- Service Plugin
嵌入到各系统执行流程中,定期从RangerAdmin拉取策略,根据策略执行访问决策树,并且记录访问审计
- Ranger-SDK
四、各个组件授权流程
1.Hdfs实现原理
hdfs-site.xml会修改如下配置:
<property>
<name>dfs.permissions.enabled</name>
<value>true</value>
</property>
<property>
<name>dfs.permissions</name>
<value>true</value>
</property>
<property>
<name>dfs.namenode.inode.attributes.provider.class</name>
<value>org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer</value>
</property>
2.Hbase实现原理
在安装完hbase插件后,hbase-site.xml会修改如下配置:
<property>
<name>hbase.security.authorization</name>
<value>true</value>
</property>
<property>
<name>hbase.coprocessor.master.classes</name>
<value>org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor</value>
</property>
<property>
<name>hbase.coprocessor.region.classes</name>
<value>org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor</value>
</property>
3.Hive实现原理
hiveserver2-site.xml
<property>
<name>hive.security.authorization.enabled</name>
<value>true</value>
</property>
<property>
<name>hive.security.authorization.manager</name>
<value>org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizerFactory</value>
</property>
4.Yarn实现原理
yarn-site.xml
<property>
<name>yarn.acl.enable</name>
<value>true</value>
</property>
<property>
<name>yarn.authorization-provider</name>
<value>org.apache.ranger.authorization.yarn.authorizer.RangerYarnAuthorizer</value>
</property>
五、Ranger简单使用
1.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)对库、表、列的授权
# 在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权限(设置后 有时间延迟,默认30秒)
#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)
(3)Masking(动态列屏蔽)
动态列屏蔽: 可以将一列数据进行屏蔽操作 如哈希、加密、打马赛克等
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)
2.Ranger Hdfs权限控制
(1)linux环境下添加用户
(2)root用户在hdfs下创建文件夹
hdfsdfs –mkdir /xhhtest
hdfs dfs –mkdir /xhhtest/sub
(3)登录Ranger Admin,在hadoopdev里添加Policy
olicy:目录/xhhtest 对用户xhhtest只设置读权限
(4)切换到xhhtest用户执行
hdfs dfs –put my.txt /xhhtest
Error:Permission denied,说明无权限访问
(5)修改policy,对目录/xhhtest添加write权限给用户xhhtest。执行
hdfs dfs -put my.txt /xhhtest
执行成功。
(6)执行hdfs dfs -put my.txt /xhhtest/sub
六、Audit审计记录
1.Access
此页面记录每次授权的信息 包括策略id、时间、访问用户、访问的资源、访问的类型、授权结果等信息。可以根据条件进行搜索
开启此功能需要先安装Solr
2.Admin
3.Login Sessions
4.Plugins
5.Pugins Status
七、RestAPI
以上在RangerAdminWeb上操作的东西 都可以在RestAPI里面操作。
比如 添加服务、更新服务、删除服务、搜索服务、获取策略、创建策略、更新策略、删除策略、搜索策略等