Moloch 那些不得不说的事

安全工具 2019-11-10

本文作者:Cherishao(信安之路作者团队成员 & 应急响应小组小组长) 成员招募:信安之路应急响应小组寻找志同道合的朋友

谈及 Moloch, 想必大家都知道” moloch 是一个开源的、大规模的 IPv4 数据包捕获(PCAP),索引数据库系统。“ 它以标准 pcap 格式存储和索引网络流量提供快速的索引访问,从而减少可疑事件的分析时间。

优势:

1、moloch 公开了API ,允许 pcap 数据和 json 格式的会话数据直接下载和使用。

2、提供直观的Web界面,用于 PCAP 浏览、搜索、分析,Moloch 以标准 PCAP 格式存储和导出所有数据包。

3、可扩展性:Moloch 旨在部署在多个集群系统中,提供扩展可以处理多个千兆位/秒的流量。PCAP保留基于可用的传感器磁盘空间,而元数据保留基于 Elasticsearch 集群的规模。 两种保留大小都可以随时增加。

4、安全: 通过使用具有摘要密码的 HTTPS 或使用提供 Web 服务器代理的身份验证来保护对 Moloch 的访问。 PCAP 都存储在已安装的 Moloch 传感器上,只能通过 Moloch 接口或API访问。 Moloch 支持在静止时加密 PCAP 文件。

简而言之: Moloch 可以保存所有原始数据流量,基于 elasticsearch 及 PCAP 的存储形式使它得以对通信数据流中的元数据进行快速检索。相对来说是一个比较好用的回溯分析系统。

Moloch 构成

流量回溯系统通常都会面临这样几个问题:

1、数据包的存取和协议的分析;

2、数据量很大的时候检索的速度。

我们设想一下使用 tshark 、Wireshark 对一个 几十 GB 的数据包进行分析时,包的加载都会是一个很头疼的问题,更不用说过滤表达式的应用。而 Moloch 在这方面就具备了独特的优势,我们来看看它的构成。

数据的来源是交换机的镜像端口,moloch 系统主要涉及三个组件 Capture,elasticsearch 和 Viewer

Capture (绑定 interface 运行的单线程 C 语言应用 )用来抓取流量并以 pcap 的格式存储到硬盘上面,还会存一份对应关系到 elasticsearch (moloch 的数据检索驱动)中,Viewer(运行在 capture 主机上的 node.js web应用 ) 提供 web 界面,以下为 Moloch 的单个主机部署架构图。

img

Moloch 安装

由上图中的架构可知,部署 Moloch ,我们需要安装 elasticsearch 及 Moloch (集成了Capture 与Viewer),存储数据包对机器的性能要求 moloch 提供了评估页面 Moloch Estimators:

https://molo.ch/#estimators)

img

可根据 PCAP 包的存储天数、TLS (加密数据包保存的百分比)、每台机器的处理能力;ES 日志的存储天数、机器节点等选择适合自己的硬件资源。Moloch 的每个节点需要 64GB - 128GB 内存:ES 为 30GB,OS 磁盘缓存为 34-96GB。对于大型计算机,计划为每个主机运行多个节点。

笔者部署的硬件资源如下:

img

上图新增 2 张网卡,是将交换机镜像过来的流量镜像到虚拟机的网卡。

虚拟机情况:

# cat /etc/redhat-release
CentOS Linux release 7.5.1804 (Core)
# uname -r
3.10.0-862.11.6.el7.x86_64

elasticsearch 安装

在安装 Moloch 之前,我们需要先安装配置好 elasticsearch,由官网的 CHANGELOG 可知,elasticsearch 的版本应该大于等于 5.5.0, 这里我们安装的版本为 elasticsearch-6.4.0

img

一、Java 环境安装

有两种安装方式:

1)yum 安装

$   yum install java-1.8.0-openjdk
$   java -version

2)手动安装

从 oracle 官网下载 jdk-8u 的安装包进行安装,笔者采用的是手动安装的方式

https://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html

img

二、elasticsearch 下载

下载 Linux 版 elasticsearch ( 下载地址https://www.elastic.co/downloads/elasticsearch

img

三、配置文件修改

1 )elasticsearch.yml 修改以下三个部分,network.host 为指定的 IP 地址,可以是多个。

# ---------------------------------- Cluster --------------------------
#
# Use a descriptive name for your cluster:
#
cluster.name: elasticsearch
#
# ------------------------------------ Node ---------------------------
#
# Use a descriptive name for the node:
#
node.name: node-1
node.master: true
node.data: true
# ---------------------------------- Network --------------------------
#
# Set the bind address to a specific IP (IPv4 or IPv6):
#
network.host: 10.0.10.207
#
# Set a custom port for HTTP:
#
http.port: 9200
transport.tcp.port: 9300
http.cors.enabled: true
http.cors.allow-origin: "*"
# For more information, consult the network module documentation.

2)为了预防文件描述符太低,在配置文件 limits.conf 中新增

$ vim /etc/security/limits.conf

* soft nofile 65526
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096

3)为了预防一个进程最多可用于的内存映射区太低,在配置文件 sysctl.conf 中新增

vim /etc/sysctl.conf

vm.max_map_count=655360

4) 重新加载系统参数使配置生效

sysctl -p

四、elasticsearch 启动

1)elasticsearch 不能使用 root 用户启动,创建组及用户

$ groupadd elasticsearch
$ useradd elasticsearch -g elasticsearch -p elasticsearch
$ chown -R elasticsearch /opt/elasticsearch-6.4.0 

2)切换用户启动 elasticsearch

$  su elasticsearch 
$ ./elasticsearch -d # -d 参数代表后台启动

3) 关闭防火墙

$ systemctl stop firewalld

五、验证启动状态

访问:http://10.0.10.207:9200 或 curl http://10.0.10.207:9200

返回如下 json 信息,表示配置成功

{
 "name": "node-1",
 "cluster_name": "elasticsearch",
 "cluster_uuid": "9-dyTdtYTHmX7frIGWzIgw",
 "version": {
   "number": "6.4.0",
   "build_flavor": "default",
   "build_type": "tar",
   "build_hash": "595516e",
   "build_date": "2018-08-17T23:18:47.308994Z",
   "build_snapshot": false,
   "lucene_version": "7.4.0",
   "minimum_wire_compatibility_version": "5.6.0",
   "minimum_index_compatibility_version": "5.0.0"
},
 "tagline": "You Know, for Search"
}

检查 ES 的健康状态

访问:http://10.0.10.207:9200/_cat/health 或 curl http://10.0.10.207:9200/_cat/health 返回

1548230399 15:59:59 elasticsearch green 1 1 22 22 0 0 0 0 - 100.0%

表示健康

Moloch 下载

从官网下载适合自己的 Moloch 版本 ( 下载地址:https://www.molo.ch/#downloads ) ,笔者这里为 Centos 7 的 Moloch.1.6.2, 更多支持的版本如下:

img

Moloch 安装

img

5)初始化/升级 Elasticsearch Moloch 配置

第一次安装或者要清除数据可以运用如下命令

$ /data/moloch/db/db.pl http://ESHOST:9200 init

moloch 的包更新, 由CHANGELOG1.6.2 版本的包是需要更新的

img

6)新安装或 init 后添加管理员用户

$ /data/moloch/bin/moloch_add_user.sh admin "Admin User" THEPASSWORD --admin

7)启动 moloch

img

访问 http:// MOLOCHHOST:8005

  user: admin
    password: THEPASSWORD from step #6

img

Moloch 使用

1) 回溯分析

检索局域内的指定源 IP ip.src== host 目的 IP ip.dst == host

ip.src == 10.0.3.36

检索局域网内的指定 dns host.dns== dns

host.dns== music.163.com

img

上图中的 Action 支持将检索到的数据流以 PCAP 形式导出及 打上标签;对于数据流可以 natural 、ascill、utf8 等多种编码形式展示,流可以以 image 格式保存,对于简单的 Xor 及 base64 能进行解码。

检索局域网内利用 3389 端口进行通信的连接: port.dst == port

port.dst == 3389

img

利用表达式进行过滤后,在 Connections 中,可以看到与之节点的相关连接统计信息(一个华而不实的功能 :)..

更多 Search Expression 的运用,这里就不介绍了,Know it then do it

Moloch 优化

1)修改 moloch 的 config.ini 配置文件,在 High Performance settings 进行如下修改,降低丢包现象。

### High Performance settings
magicMode=basic
pcapReadMethod=tpacketv3
tpacketv3BlockSize=8388608
tpacketv3NumThreads=4
# tpacketv3NumThreads=2
pcapWriteMethod=simple
pcapWriteSize =2560000
packetThreads=5
dbBulkSize=4000000
compressES=true
maxPacketsInQueue =300000

2) pfring 安装

moloch 的 Capture 默认使用 libpcap 后面我们会用 pfring 提升抓包性能

img

3) 指定一个 PCAP 包目录

$ mkdir/data/moloch/pcap
$ vim/data/moloch/etc/config.ini #进行如下配置
# The directory to save raw pcap files to
pcapDir =/data/moloch/pcap

4)考虑数据的删除保留问题

$ vim /data/moloch/etc/config.ini 
freeSpaceG =10% #

Moloch 日常维护技巧

查看 ES 启动情况

img

如没有正常启动,需切换到用户elasticsearch 启动

$  cd /opt/ES6/elasticsearch-6.4.0/bin
$   ./elasticsearch -d #-d 后台启动
$  kill -9 4153

常规检查与数据清除

这里也提供一些检查的清单:

img

elasticsearch 中存储的 SPI 数据删除

/data/moloch/db/db.pl ESHOST:ESPORT wipe #相对于init 不会删除用户

PCAP 包删除

rm -rf /data/moloch/pcap #pcap 存储目录根据 config.ini 来确定,我这里是自己新建的 pcap

重启 molochcapture

 $ systemctl restart molochcapture.service
 $ systemctl stop molochcapture.service
 $ systemctl start molochcapture.service
 $ systemctl status molochcapture.service

重启 molochviewer

 $  systemctl restart molochviewer.service
 $  systemctl stop molochviewer.service
 $  systemctl start molochviewer.service

关闭 firewalld

$  systemctl stop firewalld

查看日志文件是否有错误

$  echo "" > capture.log #清除日志内容
$  cat   /data/moloch/logs/viewer.log
$  cat   /data/moloch/logs/capture.log

网卡配置

ethtool -G ens38 rx 4096 tx 4096 #设置环形缓冲区大小
ethtool -K ens38 rx off tx off gs off tso off gso off #关闭功能,查看 ens38 的可用功能

参考链接

https://github.com/aol/moloch/wiki/FAQ

https://github.com/aol/moloch/wiki/Settings


本文由 信安之路 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

楼主残忍的关闭了评论