使用 Zeek 和 Python 进行实时威胁检测

2023-04-21 00:00:00 实时 检测 威胁

Zeek(前身为Bro)是一个网络安全监测系统,可以通过监控网络流量来检测威胁,同时还提供了丰富的协议解析和日志输出功能。Python 是一种流行的编程语言,使用 Python 可以扩展 Zeek 的功能,进行更高级的威胁检测和数据分析。

本文将介绍如何使用 Zeek 和 Python 进行实时威胁检测。我们将通过 Zeek 监控网络流量,将检测到的数据传递给 Python 脚本进行分析,并输出检测结果。

  1. Zeek 的安装和配置

首先需要安装 Zeek,可以从官网 https://www.zeek.org/download/index.html 下载二进制安装包进行安装。

安装完成后,需要配置 Zeek 监听的网络接口和输出的日志格式。编辑 Zeek 的主配置文件 /usr/local/zeek/etc/zeekctl.cfg,修改以下配置项:

[zeek]
interface=eth0

将 interface 配置为需要监听的网络接口。

然后编辑 /usr/local/zeek/share/zeek/site/local.zeek,添加以下内容:

@load policy/tuning/json-logs.zeek

event bro_init()
{
  Log::add_filter(Conn::LOG, [$name="json", $path="conn.json"]);
}

这将启用 JSON 格式的日志并输出到 conn.json 文件中。

  1. Python 脚本

接下来我们将编写 Python 脚本,用于分析 Zeek 输出的网络流量数据。

首先需要安装 Python,推荐使用 Python 3.x 版本。然后安装以下依赖库:

pip install bro_log_parser
pip install pygtail
  • bro_log_parser 用于解析 Zeek 的 JSON 格式日志;
  • pygtail 用于实时读取日志文件并获取新增的日志数据。

代码如下:

from bro_log_parser import parse_file
from pygtail import Pygtail

def analyze_log():
    # 监控日志文件,在有新的日志输出时进行解析
    for line in Pygtail('conn.json'):
        # 解析 JSON 格式的日志
        conn = parse_file(line.strip(), 'conn')
        if conn is None:
            continue
        # 进行威胁检测
        if 'pidancode.com' in conn.orig_host:
            print('检测到恶意流量:', conn.orig_host, conn.resp_host, conn.service)

if __name__ == '__main__':
    analyze_log()

以上代码实现了读取 Zeek 输出的 conn.json 日志文件,并解析其中的连接记录。对于每条连接记录,如果 orig_host 包含字符串“pidancode.com”,则将其视为恶意流量并输出。

  1. 启动 Zeek 和 Python

最后我们需要启动 Zeek 和 Python,让它们能够协同工作。

启动 Zeek:

sudo /usr/local/zeek/bin/zeekctl start

启动 Python:

python analyze.py

运行后,Python 会持续监听 conn.json 文件的变化,并进行威胁检测。如果检测到了恶意流量,会输出类似如下的结果:

检测到恶意流量: 54.246.64.145 192.168.1.103 http

相关文章