Ranger是HDP体系统中安全管理的重要一环。它提供了具体资源(如HBase中的具体表)权限管控、访问监控、数据加密的功能。
Raner是由三个部分组件:Ranger Admin 、Ranger Usersync 与Ranger plugin,它们关系如下:
在Ranger的官网中有对于这三个组件的说明
组件名称 | 说明 |
---|---|
Admin | Ranger Admin Portal是安全管理的中心接口。 用户可以创建和更新策略,这些策略存储在策略数据库中。 每个组件内的Plugins会定期轮询这些策略。Portal还包括一个审计服务器,它发送从插件收集的审计数据,以便存储在HDFS或关系数据库中 |
UserSync | 同步实用工具来从Unix或LDAP或Active Directory中拉取用户和组。 用户或组信息存储在Ranger门户中,用于策略定义。 |
PlugIn | 插件是嵌入每个集群组件进程的轻量级Java程序。 例如,Apache Hive的Apache Ranger插件嵌入在Hiveserver2中。 这些插件从中央服务器提取策略,并将它们本地存储在一个文件中。 当用户请求通过组件时,这些插件拦截请求并根据安全策略进行评估。 插件还可以从用户请求中收集数据,并按照单独的线程将此数据发送回审计服务器 |
需要说明的是这三者是独立的。后面会有详细的说明
Ranger admin它包含三个部分: Web页面、Rest消息处理服务以及数据库。 我们可以把它看成一个用来数据集中存储中心(所有的数据都集中存在这里,但是其它两个组件也可单独运行存在)。它的具体作用:
1. 接收UserSync进程传过来的用户、组信息。 并将它们保存到MySql数据库中。 需要注意:这些用户信息在配置权限策略的时候需要使用。这个很容易理解,就象领物料的时候,管理员需要登记物料的领用人,如果不是本公司的人,肯定就不会让你领了。
2. 提供创建policy策略的接口
3. 提供外部REST消息的处理接口
UserSync是Ranger提供的一个用户信息同步接口,可以用来同步Linux用户信息与LDAP用户信息。通过配置项:
SYNC_SOURCE = LDAP/Unix
来确认是LDAP还是Unix, 默认情况是同步Unix信息。 对于UserSync有三点需要说明:
1. 这个同步是单向的。
就是说它只管从Unix上面的本地用户信息读取出来,然后上传到Ranger Admin上面。在其代码中也可以看到
@Override
public 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.rangergroupId>
<artifactId>unixusersyncartifactId>
<version>0.7.0version>
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.
因为我只读过Hdfs的插件代码,这里也是以HDFS的插件代码进行说明。
[root@ysbdh03 conf]# cat ranger-hdfs-security.xml
ranger.plugin.hdfs.policy.cache.dir
/etc/ranger/clustersz_hadoop/policycache
... ...
在这个目录中存储的就是相应的策略文件,如果这个配置文件不存,则会往Ranger admin发送消息,同步policy信息。同步过来之后,以文件方式持外化。:
这里还需要说明的一点的就是这个文件的名称。在上图中文件名称为hdfs_clustersz_hadoop, 这包含两个部分,其中hdfs对应的hdfs组件,而clustersz_hadoop就对应的Ranger中的Server,见图示:
2.同步完成后,hdfs plugin线程会每隔一段时间(30s)会往ranger admin发送一次消息,同步一次policy信息
1.anger的plugin会从ranger admin那里同步策略信息,并以.json的格式保存。
2.校验的时候,namenode会调用checkPermission()函数,一般是两部:
其具体过程如下:
1. 首先用这个用户去查找一下用户所属的组。
2. 拿到用户(kerberos的用户,包含组)信息以及需要读取(或者写入)的文件夹信息,去查看一下这个用户信息在策略文件有没有定义,如果没有给定策略信息,如果已经明确定义了,就直接返回;
3. 如果这个用户对于需要操作的文件没有定义信息上,此时,就会再调用hdfs原生的,就是我们常见的 xxx – xxx —xxx 即是否与文件在同一个组,是否有权限。
一般来说hdfs默认创建的文件权限都是类似于:
drwxr-xr-x - hdfs supergroup 0 2017-07-14 00:32 /test
即都会有读取权限,如果在创建文件夹(文件)的时候,不作修改,那么对于所有的用户都是读取权限。
如果这个校验通过了,也是返回,否则就直接抛出异常,说明没有权限.
Kerberos与Ranger都是Hadoop安全体系中的两个部分,但是它们分工是不同的。在刚接触大数据安全的时候,我一直都不明白为啥需要两个不同组件来进行权限控制,很长一段时间之后,才会明白。联系我们每天上班然后坐到办公室的过程可能就会比较清楚
某个人员进入公司之前,保安需要检查它是否有工卡,如果没有工卡,保安GG就会认为你不是公司员工,而不允许你进入到公司园区。 当你进入公司园区之后,这个时候你想到某个仓库去看一下,仓库大门就会检查一下你有没有门禁,有门禁才会让你进入到仓库中。
我们可以把公司园区类比成大数据集群平台,工卡就要相当于你的Kerberos权限认证,而仓库就对应着具体的hdfs文件路径。
Ranger 的数据加密对应着Hadoop KMS,如果用户想直接使用Hadoop KMS也是可以的。下面说一下Ranger KMS的简单流程(以HDP集成安装的Ranger为例)
安装好ranger之后,打开ranger admin的UI连接
以用户名为keyamin(密码也是keyadmin)进入
在弹出的配置项中进行配置:
填好之后,点击”save”保存,对应的密码策略就配置完成了。
下面就开始配置密码策略对应的用户了。
Hadoop侧的配置就与Hadoop KMS相同了。
权限管理是Ranger的主体功能,Ranger的审计,我有点感觉象是一个半买半送的东西。
审计主要是日志审计,主要记录各个组件资料的访问信息,也就是从各个组件日志中抽到相应的登录访问信息,但是这一块没有LogSearch强(HDP另一个日志组件)。当然如果用户只需要知道一些简单的访问信息,也不想上LogSearch,用这个也是可以的。