Hadoop集群容易被攻击的几个场景 2017-03-10 14:13

前言

Hadoop已成为大数据分析平台的主流产品,其安全性一直深受诟病,而针对安全的各种配置也都比较复杂,因此我们在一些场景的配置下进行安全测试,看看究竟哪些场景可能会被攻击。
 

1、HDFS脆弱性测试

1.1、用户冒充,访问任意文件操作

受影响的环境:在hdfs-core.xml文件中配置,Simp模式,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文件中配置,Simp模式或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文件中配置,Simp模式或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文件中配置,Simp模式,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文件中配置,Simp模式或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文件中配置,Simp模式或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脆弱性测试

受影响的环境:Simp模式或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,则任何用户的任务都可以被kill。

4、暴力破解

受影响的环境:Simp模式,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连上网线恢复,中间无需做过多操作,甚至不需要系统权限。