本文讲的是Hadoop集群容易被攻击的几个场景,
前言
Hadoop是成为大数据分析平台的主流产品,其安全性一直深受诟病,而针对安全的各种配置也都比较复杂,因此我们在一些场景的配置下进行安全测试,看看究竟哪些场景可能会被攻击。
1、HDFS脆弱性测试
1.1、用户冒充,访问任意文件操作
受影响的环境:在hdfs-core.xml文件中配置,Simple模式,dfs.permissions.enabled开启或关闭均可。
方法:利用客户机1远程进行操作,如果当前客户机1和2分别建立不同密码的用户user1,并以user1为当前shell用户执行命令:
[user1@s1~]$ hadoop fs -ls hdfs://192.168.1.185:8020/
可查看集群中目录和文件列表
[user1@s1~]$ hadoop fs -mkdir hdfs:// 192.168.1.185:8020/user1
则可创建user1目录,其owner为user1
[user1@s1~]$ hadoop fs -put data.txt hdfs:// 192.168.1.185:8020/user1/data.txt
则可以上传data.txt文件至hdfs中,其owner为user1
[user1@s1~]$ hadoop fs -chmod 700 hdfs:// 192.168.1.185:8020/user1/data.txt
则是将文件data.txt文件的权限设为仅有属主user1可读,其他用户都无法读写执行。
[user1@s1~]$ hadoop fs –cat hdfs://192.168.1.185:8020/user1/data.txt
可查看文件内容。
这个过程可以看到两个user1,均无需密码就可以连接到hdfs中,访问集群时,所访问的对象都是一样的,因此可证明冒充攻击的有效性。
1.2、普通用户越权访问
受影响的环境:在hdfs-core.xml文件中配置,Simple模式或kerberos模式开启,dfs.permissions.enabled关闭。
方法:可以在客户机1上新建user2,执行指令:
[user2@s1~]$ hadoop fs –cat hdfs://host:port/user1/data.txt
可查看权限为700的data.txt文件,说明用户可任意越权访问。
1.3、特权用户越权访问
受影响的环境:在hdfs-core.xml文件中配置,Simple模式或kerberos模式开启,dfs.permissions.enabled开启。
方法:开启permissions验证以后,user2无法访问data.txt文件
[user2@s1~]$ hadoop fs –cat hdfs://host:port/user1/data.txt cat: Permission denied: user=user2, access=READ, inode="/user1/data.txt":user1:supergroup:-r--------
接下来在客户机2上su到root用户,执行指令:
[root@s1~]# hadoop fs –cat hdfs://host:port/hadoop/hacker/data.txt
则可查看权限为700的data.txt文件,说明在开启最严格的kerberos和permissions 验证以后,root用户可对任意数据进行越权访问。
2.Hbase脆弱性测试
2.1用户冒充,访问任意文件操作
受影响的环境:在hdfs-core.xml文件中配置,Simple模式,dfs.permissions.enabled开启或关闭均可。
hbase-site.xml文件中,org.apache.hadoop.hbase.security.access.AccessController配置开启或关闭ACL功能。
方法:hbase客户端访问远程服务器需要修改客户端配置,配置客户端的hbase-site.xml,设置Zookeeper集群的IP,从而协调Hbase各节点。
<name>hbase.zookeeper.quorum</name> <value>192.168.1.185</value>
利用客户机1和客户机2分别使用user1登录到hbase上。
user1@ubuntu:/usr$ hbase shell
启用hbase客户端
hbase(main):000:0> create 'user1','name','age'
新建一个表,表名user1,列名name,列名age
hbase(main):001:0>scan user1
对表进行扫描操作
hbase(main):002:0>disable user1
关闭表
hbase(main):003:0>drop user1
删除表
这个过程可以看到两个user1,均无需密码就可以连接到hbase中,访问集群时,所访问的表内容都是一样的,因此可证明冒充攻击的有效性。
2.2、普通用户越权访问
受影响的环境:在hdfs-core.xml文件中配置,Simple模式或kerberos模式开启,dfs.permissions.enabled关闭。hbase-site.xml文件中,org.apache.hadoop.hbase.security.access.AccessController配置关闭ACL功能。
方法:先用user1新建表:
hbase(main):004:0> create 'user1','name','age'
新建一个表,表名user1,列名name,列名age
可以再客户机1上user2,执行指令:
hbase(main):005:0>disable user1
关闭表
hbase(main):006:0>drop user1
可直接删除user1表,说明user2用户可任意越权访问user1的表。
2.3、特权用户越权访问
受影响的环境:在hdfs-core.xml文件中配置,Simple模式或kerberos模式开启,dfs.permissions.enabled开启。hbase-site.xml文件中,org.apache.hadoop.hbase.security.access.AccessController配置开启ACL功能。
方法:开启hbase的ACL以后,user2无法访问user1表
hbase(main):007:0>disable user1
关闭表失败
hbase(main):008:0>drop user1
删除表失败
接下来在客户机2上su到root用户,执行指令:
hbase(main):009:0>disable user1
关闭表
hbase(main):010:0>drop user1
删除表
说明在开启最严格的kerberos、permissions 以及hbase的ACL验证以后,root用户可对任意用户的表进行越权访问。
3、MR2 Yarn脆弱性测试
受影响的环境:Simple模式或kerbors模式,dfs.permissions.enabled开启或关闭。
方法:在无防护的情况下,可以对Yarn环境中的任务进行终止操作。
通过JAVA API 远程调用进行list Job 和Kill Job ,hadoop 只校验用户名。
代码实现:
1 . new yarnclient 实例
YarnClient client = YarnClient.createYarnClient();
2. 获取任务ID 列表
appsReportList = client.getApplications();
3. 遍历list 拿到任务ID ,调用killApplication 杀掉用户提交的任务
client.killApplication(ApplicationId.newInstance(timeStamp, id))
如果启动集群的用户名为root,那么root则可以kill任何用户的任务。
4、暴力破解
受影响的环境:Simple模式,dfs.permissions.enabled开启或关闭。
方法:Hadoop一直以来都没有密码的概念,但可以尝试穷举用户,可不断尝试不同的用户名来进行操作。
[user1@s1~]$ hadoop fs -ls hdfs://192.168.1.185:8020/ [user2@s1~]$ hadoop fs -ls hdfs://192.168.1.185:8020/ [user3@s1~]$ hadoop fs -ls hdfs://192.168.1.185:8020 /
等
在permissions关闭的情况下,如果用户名无效,则会返回无权限的提示,直到可列出目录内容,证明暴力猜解成功。
在permissions开启的情况下,则会在系统中新建多个用户。
Hbase和Yarn同理可穷举用户名。
5、嗅探webhdfs协议
受影响的环境:未启用SSL加密的集群
方法:在客户端上安装Wireshark,然后访问hadoop的50070端口,例如浏览文件:
抓包能够看到的内容全部为明文:
证明通过嗅探攻击,可以直接获取明文传输的数据。包括Block ID,所在的datanode的IP地址。
6、datanode直接访问
受影响环境:未启用网络边界防护、未启用kerberos认证、未启用访问控制的集群。
方法:不通过namenode的情况下,通过抓包,我们获得了datanode的IP,端口,那么就可以直接访问数据了,例如构造如下地址:
http://192.168.1.188:50075/webhdfs/v1/aa.txt?op=OPEN&namenoderpcaddress=mycluster&offset=0
则可直接下载文件aa.txt。
7、物理攻击,磁盘文件直接读取
受影响环境:攻击者能够物理接触集群节点的机器,或可通过SSH可登录datanode节点的操作系统。
方法:在hadf中上传一个data.txt文件,例如:
内容为:qwqeqyangfansa
利用hadoop客户端上传到集群中,此时在datanode的文件系统中新增了一个文件。
/opt/hadoop-2.5.2/dfs/data/current/BP-1162247907-192.168.1.186-1487671083826/current/finalized/subdir0/subdir0/blk_1073741886
此时将该机器的硬盘拔下来,接到别的电脑上,将此文件考出来,然后用记事本打开,能够看到的内容为:qwqeqyangfansa
由此可见block文件是明文存储,并未做加密或转换格式,可直接造成泄密。
8、端口扫描
受影响环境:未启用网络边界控制
方法:集群建立好以后,利用nmap对整个集群进行扫描,如:
localhost:~ like1$ nmap -p0-65535 192.168.1.185-188
端口列表
192.168.1.185 |
192.168.1.186 |
192.168.1.187 |
192.168.1.188 |
0/tcp 22/tcp 2181/tcp 3306/tcp 3888/tcp 8019/tcp 8020/tcp 35272/tcp 50010/tcp 50020/tcp 50070/tcp 50075/tcp
|
0/tcp 22/tcp 2181/tcp 2888/tcp 3888/tcp 8019/tcp 8020/tcp 8480/tcp 8485/tcp 33901/tcp 50010/tcp 50020/tcp 50070/tcp 50075/tcp
|
0/tcp 22/tcp 2181/tcp 3888/tcp 8480/tcp 8485/tcp 50010/tcp 50020/tcp 50075/tcp 50751/tcp
|
0/tcp 22/tcp 8480/tcp 8485/tcp 50010/tcp 50020/tcp 50075/tcp
|
扫描结果可以看到不管是datanode还是namenode,所开放端口一览无遗,对内网来说,链路上没有实施任何访问控制,可导致针对端口的直接访问,风险巨大。
9、物理攻击导致datanode被冒充
受影响环境:攻击者能够物理接触集群节点的机器,或可通过SSH可登录datanode节点的操作系统。
方法:在集群中任意增加新的datanode节点是非常容易的,而天生就为容灾机制设计的hadoop集群,认为datanode节点的损坏是常态,因此有十分强大的纠错和恢复机制。
在5个节点的集群中,先将其中一个datanode网线拔出,将该机器磁盘卸下,然后利用Ext3/4的文件系统读取工具,可以轻松读取/etc/hadoop/slaves和
/etc/hosts两个文件,将这两个文件考入冒充笔记本电脑的系统中,如开启kerberos,则将kerberos证书也复制一份。再将笔记本接回网线连到集群中,即可轻松导出集群中的数据。攻击完成后,可以随时将原datanode连上网线恢复,中间无需做过多操作,甚至不需要系统权限。
原文发布时间为:2017年3月11日
本文作者:guanshukeji
本文来自合作伙伴嘶吼,了解相关信息可以关注嘶吼网站。