1. 介绍
Ranger是HDP体系统中安全管理的重要一环。它提供了具体资源(如HBase中的具体表)权限管控、访问监控、数据加密的功能。
2. 组件介绍
2.1 整体说明
Raner是由三个部分组件:Ranger Admin 、Ranger Usersync 与Ranger plugin,它们关系如下:
在Ranger的官网中有对于这三个组件的说明
需要说明的是这三者是独立的。后面会有详细的说明
2.2 Ranger Admin
Ranger admin它包含三个部分: Web页面、Rest消息处理服务以及数据库。 我们可以把它看成一个用来数据集中存储中心(所有的数据都集中存在这里,但是其它两个组件也可单独运行存在)。它的具体作用:
1. 接收UserSync进程传过来的用户、组信息。 并将它们保存到MySql数据库中。 需要注意:这些用户信息在配置权限策略的时候需要使用。这个很容易理解,就象领物料的时候,管理员需要登记物料的领用人,如果不是本公司的人,肯定就不会让你领了。
2. 提供创建policy策略的接口
3. 提供外部REST消息的处理接口
2.3 UserSync
UserSync是Ranger提供的一个用户信息同步接口,可以用来同步Linux用户信息与LDAP用户信息。通过配置项:
SYNC_SOURCE = LDAP/Unix
来确认是LDAP还是Unix, 默认情况是同步Unix信息。 对于UserSync有三点需要说明:
1. 这个同步是单向的。
就是说它只管从Unix上面的本地用户信息读取出来,然后上传到Ranger Admin上面。在其代码中也可以看到
@Overridepublic void updateSink(UserGroupSink sink) throws Throwable {isUpdateSinkSucc = true;buildUserGroupInfo(); // 此处user、group读取信息for (Map.Entry<String, List<String>> entry : user2GroupListMap.entrySet()) {String user = entry.getKey();List<String> groups = entry.getValue();try{sink.addOrUpdateUser(user, groups); //此处往ranger admin发送消息}catch (Throwable t) {LOG.error("sink.addOrUpdateUser failed with exception: " + t.getMessage()+ ", for user: " + user+ ", groups: " + groups);isUpdateSinkSucc = false;}}}
2.UserSync不是实时同步的
如果用户新创建一个用户,但是这个用户无法立即同步到Ranger中,对于这一点,咨询Ranger社区,他们的回复:
Regarding, Is there another way to sync user info automatically?
Ranger-Usersync process syncs the added users in particular time interval which is in minutes; By default it is set to 5 minutes.The property name is “SYNC_INTERVAL”. So it will sync newly added user after that interval or you have restart ranger-usersync.
You can update this value in install.properties file and run the setup.sh script to update the value in the Usersync process, after this you will have to restart ranger-usersync process.
但是从我测试结果来看并不是太理想。因为我们系统要求用户创建后,能够马上在Ranger 上面创建策略。最终我们的解决的方案是:不使用UserSync这个进程,将Ranger中的同步代码抽取出来。利用这样来做到数据同步
<dependency><groupId>org.apache.ranger</groupId><artifactId>unixusersync</artifactId><version>0.7.0</version></dependency>
3.不支持删除用户
Ranger暂时不支持通过同步或者代码的方式直接删除用户(Ranger 版本0.70)。社区里给出的解决方案:
To delete the user from Ranger database, you will have to delete the user from Ranger UI manually, as the Ranger-Usersync process will only add users to Ranger Database.
2.3 Plugin
因为我只读过Hdfs的插件代码,这里也是以HDFS的插件代码进行说明。
2.3.1 Ranger Plugin的工作流程
NameNode启动时候,会创建一个Hdfs Plugin线程, 这个线程启动后就会读取配置信息[root@ysbdh03 conf]# cat ranger-hdfs-security.xml <configuration><property><name>ranger.plugin.hdfs.policy.cache.dir</name><value>/etc/ranger/clustersz_hadoop/policycache</value></property>... ... </configuration>
在这个目录中存储的就是相应的策略文件,如果这个配置文件不存,则会往Ranger admin发送消息,同步policy信息。同步过来之后,以文件方式持外化。:
这里还需要说明的一点的就是这个文件的名称。在上图中文件名称为hdfs_clustersz_hadoop, 这包含两个部分,其中hdfs对应的hdfs组件,而clustersz_hadoop就对应的Ranger中的Server,见图示:
2.同步完成后,hdfs plugin线程会每隔一段时间(30s)会往ranger admin发送一次消息,同步一次policy信息
2.3.2 HDFS Plugin的权限控制原理
1.anger的plugin会从ranger admin那里同步策略信息,并以.json的格式保存。
2.校验的时候,namenode会调用checkPermission()函数,一般是两部:
其具体过程如下:
1. 首先用这个用户去查找一下用户所属的组。
2. 拿到用户(kerberos的用户,包含组)信息以及需要读取(或者写入)的文件夹信息,去查看一下这个用户信息在策略文件有没有定义,如果没有给定策略信息,如果已经明确定义了,就直接返回;
3. 如果这个用户对于需要操作的文件没有定义信息上,此时,就会再调用hdfs原生的,就是我们常见的 xxx – xxx —xxx 即是否与文件在同一个组,是否有权限。
一般来说hdfs默认创建的文件权限都是类似于:
drwxr-xr-x - hdfs supergroup 0 -07-14 00:32 /test
即都会有读取权限,如果在创建文件夹(文件)的时候,不作修改,那么对于所有的用户都是读取权限。
如果这个校验通过了,也是返回,否则就直接抛出异常,说明没有权限.
3. 其它
3.1 Kerberos与Ranger
Kerberos与Ranger都是Hadoop安全体系中的两个部分,但是它们分工是不同的。在刚接触大数据安全的时候,我一直都不明白为啥需要两个不同组件来进行权限控制,很长一段时间之后,才会明白。联系我们每天上班然后坐到办公室的过程可能就会比较清楚
某个人员进入公司之前,保安需要检查它是否有工卡,如果没有工卡,保安GG就会认为你不是公司员工,而不允许你进入到公司园区。 当你进入公司园区之后,这个时候你想到某个仓库去看一下,仓库大门就会检查一下你有没有门禁,有门禁才会让你进入到仓库中。
我们可以把公司园区类比成大数据集群平台,工卡就要相当于你的Kerberos权限认证,而仓库就对应着具体的hdfs文件路径。
3.2 Ranger的数据加密
Ranger 的数据加密对应着Hadoop KMS,如果用户想直接使用Hadoop KMS也是可以的。下面说一下Ranger KMS的简单流程(以HDP集成安装的Ranger为例)
3.2.1 Ranger加密的过程
安装好ranger之后,打开ranger admin的UI连接
以用户名为keyamin(密码也是keyadmin)进入
进入界面后,首先创建一个加密策略。其过程如下:
首先选择”Encryption” –> “key Manager”
进入如下页面,选择相应的Service, 然后点击”Add Policy”
在弹出的配置项中进行配置:
填好之后,点击”save”保存,对应的密码策略就配置完成了。
下面就开始配置密码策略对应的用户了。
配置方式与ranger 的hdfs策略配置相似, 即回到如下的界面,然后选择相应的service,进入之后,增加相应的用户。
Hadoop侧的配置就与Hadoop KMS相同了。
3.2 审计
权限管理是Ranger的主体功能,Ranger的审计,我有点感觉象是一个半买半送的东西。
审计主要是日志审计,主要记录各个组件资料的访问信息,也就是从各个组件日志中抽到相应的登录访问信息,但是这一块没有LogSearch强(HDP另一个日志组件)。当然如果用户只需要知道一些简单的访问信息,也不想上LogSearch,用这个也是可以的。