一、引言
Hadoop是一款由Apache基金会推出的分布式系统框架,它通过MapReduce 算法进行分布式处理。Hadoop在大数据环境中负责最底层的操作,MapReduce负责数据处理,HDFS则是一种特殊的文件系统,其用来存储Hadoop里的数据。而在这两者之上的Yarn是Hadoop集群的资源管理器。如下图所示:
图1 Hadoop运行框架图
大数据已经渗透到当今每个行业和业务职能领域,其在公司的业务中发挥着重要的作用。目前公司的信息系统已经搭建并接入了Hadoop大数据相关的业务。
二、现象描述
大数据平台一般有HDFS、MapReduce和YARN作为基础组件,并在上层使用Mongodb、Zookeeper等组件,在默认情况下,Hadoop大数据平台的组件hdfs和MR会监听下面端口:
类型 | 进程 | 默认端口 | 配置参数 |
HDFS | Namenode | 50070 | dfs.http.address |
Datanodes | 50075 | dfs.datanode.http.address | |
Secondarynamenode | 50090 | dfs.secondary.http.address | |
Backup/Checkpoint node | 50105 | dfs.backup.http.address | |
MR | Jobracker | 50030 | mapred.job.tracker.http.address |
Tasktrackers | 50060 | mapred.task.tracker.http.address |
表1 监听列表
在实际业务环节中,还会运行ZooKeeper、Mongodb等第三方应用组件。
在大数据平台部署过程中,一般会存在的漏洞如下所示:
1.NameNode节点的WEBUI未授权访问
默认情况下NameNode的WEBUI处于无认证状态,通过访问 NameNode WebUI 管理界面的 50070 端口,在文件目录浏览处可以下载任意文件。
验证方法如下:
使用浏览器访问NameNode节点的50070端口,http://x.x.x.x:50070,然后访问目录浏览页面,可以直接下载文件。
图2 Namenode未授权访问验证-1
图3 Namenode未授权访问验证-2
2.DataNode节点Restful API未授权访问
默认情况下DataNode的API接口处于无认证状态,DataNode 的API监听端口 50075对外开放,攻击者可以通过 HDSF 提供的 Restful API 对 HDFS 存储的数据进行操作。
验证方法如下:使用hdfsbrowser.py对NameNode进行检测。
图4 datanode未授权访问图
3.集群环境配置文件任意获取
由于Hadoop整体的安全防护比较弱,集群的配置文件没有得到有效的防护,使用工具,可以在未授权的情况下,直接获取hadoop集群的环境配置文件。
验证方法如下:
图5 datanode未授权访问图
4.第三方管理控制台配置文件及算法代码泄露
Hadoop集群的第三方Web管理平台Cloudera Manager存在未授权下载漏洞,通过遍历ID号,可以直接下载用户配置的项目配置文件、MapReduce算法文件。
验证方法如下:
通过hackbar对URL中的services的ID号进行遍历,可以获得配置文件和算法的源代码的压缩包。
图6 用户配置文件任意下载
5.集群配置文件泄露
由于集群默认没有开启认证,可直接在原生WebUI(HDFS WebUI/ JobHistory/ ResourceManager)中请求/conf,直接获取该集群的配置文件。
验证方法:
使用浏览器直接访问集群的8088端口,访问路径为/conf,可得到配置文件。
图7 配置文件泄露
6.zookeeper组件的未授权访问
hadoop大数据平台会使用ZooKeeper作为服务发现的注册中心,但其存在未授权访问漏洞,可以导致任意用户在网络可达的情况下进行未授权访问并读取配置数据。
验证方法:
使用命令 echo envi|nc x.x.x.x 2181,如果存在漏洞的话,会返回当前Zookeeper集群中的配置信息。
图 8 组件未授权访问
7.Mongodb未授权访问
MongoDB数据库默认配置下没有权限验证,可以通过默认的27017端口,进行无需密码远程访问数据库。
验证方法:
使用nmap的Mongodb-databases脚本,可以识别出Mongodb数据库是否处于未授权访问状态
图 9 Mongodb组件未授权访问
图 10 Mongodb组件未授权访问
三、处理过程/主要做法
出现上述存在的问题,是因为hadoop在设计之初,没有完全考虑到安全认证的问题,虽然支持认证,但是默认没有开启。
安全加固方案:
1)在hadoop的整个集群中全面开启Kerberos认证,开启方法由于集群的不同,需要参考官方文档:http://hadoop.apache.org/docs/r2.7.3/hadoop-auth/Configuration.html;
如下示例:
修改hadoop的配置文件。
图9 hadoop的配置文件
2)关闭不需要对外提供服务的端口,或者使用iptables做访问限制;
3)及时升级hadoop集群的第三方管理组件,如Cloudera Manager、ranger等。
4)针对ZooKeeper的未授权访问,配置网络访问限制和增加认证配置,可以参考如下配置:
a)增加一个认证用户
指令:addauth digest 【用户名】:【密码】
示例:addauth digest user1:password1
b)设置权限
指令:setAcl 【path】 auth:【用户名】:【密码】:【权限】
示例: setAcl / auth:user1:password1:crwda
注:CREATE、READ、WRITE、DELETE、ADMIN,即增、删、改、查、管理权限,简写为crwda
c)查看Acl设置
指令:getAcl 【path】
示例:getAcl /
d)授权完成后,启用另一个会话连接访问该zookeeper服务时,将出现如下提示:
图10 认证授权
5)针对Mongodb的未授权访问,配置网络访问限制和增加用户名密码认证,下面是参考方案。
- 在system.user中添加用户,启动认证
- 通过CLI连接到Mongodb数据库中,增加admin权限的用户(以“admin:adminz”为例)
[mongodb@rac3 bin]$ ./mongo 127.0.0.1:27017 MongoDB shell version: 2.0.1 connecting to: 127.0.0.1:27017/test > use admin switched to db admin > db.addUser("admin", "adminz") { "n" : 0, "connectionId" : 4, "err" : null, "ok" : 1 } { "user" : "admin", "readOnly" : false, "pwd" : "51a481f72b8b8218df9fee50b3737c44", "_id" : ObjectId("4f2bc0d357a309043c6947a4") } > db.auth("admin","adminz") 1 > exit bye |
四、经验总结
密切跟踪信息系统新业务、新技术的应用情况,并及时跟进信息安全漏洞公布情况,在新建或接入相关hadoop的业务时,通过上述加固方法,对hadoop集群进行安全加固,可有效防止hadoop数据的泄露,及提高信息系统的安全性。