一、Ranger是什么

ranger大数据领域的一个集中式安全管理框架,它可以对诸如hdfs、hive、kafka、storm等组件进行细粒度的权限控制。比如它可以控制用户读取hdfs文件的权限,甚至可以控制某个用户对hive某个列访问的权限。
ranger目前支持的组件:
image.png

二、Ranger的权限模型

Ranger的权限模型一条条的权限策略组成的,权限策略主要由3个方面组成,即用户、资源、权限。
image.png
用户:ranger可以对用户进行分组,一个用户可以属于多个分组。Ranger支持对用户或者用户组配置某资源的相关权限。

资源:对于各个不同的组件,资源的表述都不相同。比如在HDFS中,文件路径就是资源,而在Hive中,资源可以指Database、Table甚至Column。

权限:ranger可以对各个资源的读、写、访问进行限制,具体可以配置白名单、白名单排除、黑名单、黑名单排除等条目。

ranger管理员配置好组件的相关策略后,并且将ranger插件安装到具体的大数据组件中,ranger就可以开始生效了。这时用户访问ranger就会进行权限的校验过程了,校验过程如下:
image.png
当用户要请求某个资源时,会先获取和这个资源有关联的所有配置的策略,之后遍历这些策略,然后根据黑白名单判断该用户是否有权限访问该资源。从上面的流程图可以看出,黑名单、黑名单排除、白名单、白名单排除匹配的优先级如下:
1.黑名单优先级高于白名单
2.黑名单排除的优先级高于黑名单
3.白名单排除的优先级高于白名单
denyException >> deny >> allowException >> allow
黑名单排除优先级 >> 黑名单 >> 白名单排除优先级 >> 白名单
决策下放
如果没有policy能决策访问,一般情况是认为没有权限拒绝访问,然而Ranger还可以选择将决策下放给系统自身的访问控制层。

三、Ranger架构

image.png

1.组件介绍

  • RangerAdmin

以RESTFUL形式提供策略的增删改查接口,同时内置一个Web管理页面。

  • Service Plugin

嵌入到各系统执行流程中,定期从RangerAdmin拉取策略,根据策略执行访问决策树,并且记录访问审计
image.png

  • Ranger-SDK

对接开放平台,实现对用户、组、策略的管理

四、各个组件授权流程

1.Hdfs实现原理

hdfs-site.xml会修改如下配置:

  1. <property>
  2. <name>dfs.permissions.enabled</name>
  3. <value>true</value>
  4. </property>
  5. <property>
  6. <name>dfs.permissions</name>
  7. <value>true</value>
  8. </property>
  9. <property>
  10. <name>dfs.namenode.inode.attributes.provider.class</name>
  11. <value>org.apache.ranger.authorization.hadoop.RangerHdfsAuthorizer</value>
  12. </property>

加载过程:
image.png

2.Hbase实现原理

在安装完hbase插件后,hbase-site.xml会修改如下配置:

  1. <property>
  2. <name>hbase.security.authorization</name>
  3. <value>true</value>
  4. </property>
  5. <property>
  6. <name>hbase.coprocessor.master.classes</name>
  7. <value>org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor</value>
  8. </property>
  9. <property>
  10. <name>hbase.coprocessor.region.classes</name>
  11. <value>org.apache.ranger.authorization.hbase.RangerAuthorizationCoprocessor</value>
  12. </property>

加载过程:
image.png

3.Hive实现原理

hiveserver2-site.xml

  1. <property>
  2. <name>hive.security.authorization.enabled</name>
  3. <value>true</value>
  4. </property>
  5. <property>
  6. <name>hive.security.authorization.manager</name>
  7. <value>org.apache.ranger.authorization.hive.authorizer.RangerHiveAuthorizerFactory</value>
  8. </property>

加载过程:
image.png

4.Yarn实现原理

yarn-site.xml

  1. <property>
  2. <name>yarn.acl.enable</name>
  3. <value>true</value>
  4. </property>
  5. <property>
  6. <name>yarn.authorization-provider</name>
  7. <value>org.apache.ranger.authorization.yarn.authorizer.RangerYarnAuthorizer</value>
  8. </property>

加载过程:
image.png

五、Ranger简单使用

1.Ranger Hive权限控制

(1)准备测试数据

点击hivebeta 开始Hive权限控制
image.png
根据我们刚才的配置,hive用户拥有all权限

  1. 使用beeline登陆
  2. [hive@l-node3 hive]$ bin/beeline
  3. SLF4J: Class path contains multiple SLF4J bindings.
  4. 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]
  5. 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]
  6. SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
  7. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
  8. Beeline version 2.3.0 by Apache Hive
  9. 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
  10. 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
  11. Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: hive
  12. Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:
  13. 17/08/03 11:49:28 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000
  14. Connected to: Apache Hive (version 2.3.0)
  15. Driver: Hive JDBC (version 2.3.0)
  16. Transaction isolation: TRANSACTION_REPEATABLE_READ
  17. #创建ranger测试库
  18. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> create database ranger_test_db;
  19. No rows affected (0.259 seconds)
  20. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;
  21. No rows affected (0.114 seconds)
  22. #创建测试表
  23. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user
  24. . . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)
  25. . . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED
  26. . . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'
  27. . . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;
  28. No rows affected (0.317 seconds)
  1. # 表数据
  2. [hive@l-node3 hive]$ hadoop fs -cat /tmp/t_user.data
  3. meizi 18518760001
  4. xuaner 18518760002
  5. afa 18518760003
  6. hanze 18518760004
  7. xupeng 18518760005
  8. xiaofeng 18518760006
  9. shuoshuo 18518760007
  1. # 导入数据
  2. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> LOAD DATA INPATH '/tmp/t_user.data' INTO TABLE t_user;
  3. No rows affected (0.523 seconds)
  4. #查询成功
  5. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
  6. +--------------+---------------+
  7. | t_user.name | t_user.phone |
  8. +--------------+---------------+
  9. | meizi | 18518760001 |
  10. | xuaner | 18518760002 |
  11. | afa | 18518760003 |
  12. | hanze | 18518760004 |
  13. | xupeng | 18518760005 |
  14. | xiaofeng | 18518760006 |
  15. | shuoshuo | 18518760007 |
  16. +--------------+---------------+
  17. 7 rows selected (0.11 seconds)

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

  1. # 在Ranger UserSync机器上创建测试用户rangeruser1
  2. [root@l-node1 ~]# useradd rangeruser1
  1. # 测试未授权的用户
  2. [hive@l-node3 hive]$ bin/beeline
  3. SLF4J: Class path contains multiple SLF4J bindings.
  4. 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]
  5. 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]
  6. SLF4J: See http://www.slf4j.org/codes.html#multiple_bindings for an explanation.
  7. SLF4J: Actual binding is of type [org.apache.logging.slf4j.Log4jLoggerFactory]
  8. Beeline version 2.3.0 by Apache Hive
  9. 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
  10. 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
  11. #使用rangeruser1用户登陆
  12. Enter username for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/: rangeruser1
  13. Enter password for jdbc:hive2://l-node1.data.beta.cn0:2181,l-node2.data.beta.cn0:2181,l-node3.data.beta.cn0:2181/:
  14. 17/08/03 12:30:58 [main]: INFO jdbc.HiveConnection: Connected to l-node5.data.beta.cn0:10000
  15. Connected to: Apache Hive (version 2.3.0)
  16. Driver: Hive JDBC (version 2.3.0)
  17. Transaction isolation: TRANSACTION_REPEATABLE_READ
  18. # use db; select table; 等访问全部被拒绝
  19. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;
  20. Error: Error while compiling statement: FAILED: HiveAccessControlException Permission denied: user [rangeruser1] does not have [USE] privilege on [ranger_test_db] (state=42000,code=40000)
  21. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from ranger_test_db.t_user;
  22. 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秒)
image.png

  1. #select成功
  2. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> use ranger_test_db;
  3. No rows affected (0.127 seconds)
  4. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
  5. +--------------+---------------+
  6. | t_user.name | t_user.phone |
  7. +--------------+---------------+
  8. | meizi | 18518760001 |
  9. | xuaner | 18518760002 |
  10. | afa | 18518760003 |
  11. | hanze | 18518760004 |
  12. | xupeng | 18518760005 |
  13. | xiaofeng | 18518760006 |
  14. | shuoshuo | 18518760007 |
  15. +--------------+---------------+
  16. 7 rows selected (0.12 seconds)
  17. #删除表 被拒绝
  18. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> drop table t_user;
  19. 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)
  20. #创建表 被拒绝
  21. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> CREATE TABLE t_user2
  22. . . . . . . . . . . . . . . . . . . . . . . .> (name STRING,phone STRING)
  23. . . . . . . . . . . . . . . . . . . . . . . .> ROW FORMAT DELIMITED
  24. . . . . . . . . . . . . . . . . . . . . . . .> FIELDS TERMINATED BY '\t'
  25. . . . . . . . . . . . . . . . . . . . . . . .> STORED AS TEXTFILE;
  26. 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(动态列屏蔽)

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

  1. 0: jdbc:hive2://l-node1.data.beta.cn0:2181,l-> select * from t_user;
  2. +--------------+---------------+
  3. | t_user.name | t_user.phone |
  4. +--------------+---------------+
  5. | meizi | 1851876**** |
  6. | xuaner | 1851876**** |
  7. | afa | 1851876**** |
  8. | hanze | 1851876**** |
  9. | xupeng | 1851876**** |
  10. | xiaofeng | 1851876**** |
  11. | shuoshuo | 1851876**** |
  12. +--------------+---------------+
  13. 7 rows selected (0.173 seconds)

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

行级别过滤: 可以过滤掉行数据。比如订单表,北京的员工仅允许看北京的订单数据,其他地区的数据被强制过滤掉
添加一个Row Level Filter Policy
image.png
image.png
Row Level Filter里面填Filter的过滤规则,其实就是写Where子句。本例中我们使用name <> 'hanze'将 name为’hanze’的用户过滤掉

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

2.Ranger Hdfs权限控制

(1)linux环境下添加用户

useradd xhhtest

(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
image.png

2.Admin

此页面记录对策略的操作
image.png

3.Login Sessions

此页面记录登陆RangerAdmin的操作
image.png

4.Plugins

记录Plugins的同步策略
image.png

5.Pugins Status

Plugin的状态
image.png

七、RestAPI

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