使用 Zeek 和 Python 进行网络日志分析和可视化

2023-04-21 00:00:00 分析 可视化 网络日志

Zeek(以前称为Bro)是一个功能强大的网络安全监控工具,它能够把网络流量转化为易于分析的日志文件。在本文中,我们将使用Zeek和Python来分析和可视化网络日志,以便更好地了解网络活动。在本文中,我们假设您已经安装了Zeek并且能够捕获网络流量。

第一步:生成Zeek日志

要生成Zeek日志,我们需要编写一个Zeek脚本,告诉Zeek要捕获哪些内容。下面是一个简单的Zeek脚本,它只捕获HTTP流量,同时将数据写入一个日志文件中。我们将其保存为”http-logger.zeek”。

# http-logger.zeek
@load policy/protocols/http

event http_reply(c: connection, f: fa_file, h: http_reply_header)
{
    print f$id, c$id, h$status_code, h$protocol;
    LOG::write("http.log", format("%s %s %s %s", 
        f$id, c$id, h$status_code, h$protocol));
}

接下来,我们可以在命令行中启动Zeek并告诉它要运行我们的脚本。我们还将使用“-i”选项指定要监控的网络接口。

sudo zeek -i eth0 http-logger.zeek

现在Zeek将捕获HTTP流量,并将数据写入日志文件“http.log”中。您可以在“/usr/local/zeek/logs/current”目录下找到日志文件。

第二步:解析Zeek日志

现在我们已经生成了Zeek日志,我们可以使用Python来解析它。Zeek生成的日志是文本文件,行以指定的格式写入。我们将编写一个Python脚本来读取文件并将其转换为易于使用的数据结构。

下面是一个简单的Python脚本,它读取“http.log”文件,将其解析为字典对象,并打印每个字典对象以进行检查。我们将其保存为”http-parser.py”。

# http-parser.py
import re

def parse_log(filename):
    logs = []
    with open(filename) as f:
        for line in f:
            if "GET" in line or "POST" in line:
                fields = re.split("\s+", line.strip())
                logs.append({
                    "file_id": fields[0],
                    "connect_id": fields[1],
                    "status": fields[2],
                    "protocol": fields[3],
                })
    return logs

if __name__ == "__main__":
    logs = parse_log("http.log")
    for log in logs:
        print(log)

该脚本打印出以下类型的输出。

{'file_id': 'CGnl351zjeNelXGEcd', 'connect_id': 'CJjPPZ1x1gCMwBfpzk', 'status': '200', 'protocol': 'HTTP/1.1'}

第三步:分析Zeek日志

现在我们已经解析了Zeek日志,我们可以使用Python来分析它。如果您对统计学和数据可视化比较熟悉,您可能会使用NumPy和Matplotlib。然而,在这里,我们将使用Pandas和Seaborn包。

下面是一个简单的Python脚本,它使用Pandas读取Zeek日志数据,并使用Seaborn绘制状态码的计数图。我们将其保存为”http-analyzer.py”。

# http-analyzer.py
import pandas as pd
import seaborn as sns

from http_parser import parse_log

def analyze(log_df):
    sns.countplot(x="status", data=log_df)
    sns.plt.show()

if __name__ == "__main__":
    logs = parse_log("http.log")
    log_df = pd.DataFrame(logs)
    analyze(log_df)

该脚本将绘制状态码计数图。

第四步:结果分析

结果分析很重要,因为它揭示了网络活动的真相。例如,在我们的例子中,如果我们注意到状态码403(Forbidden)的计数很高,那么我们知道有人试图访问他们不应该访问的资源。

在本文中,我们使用Zeek和Python对网络日志进行了分析和可视化。这种方法可以帮助您了解网络上发生的事情,并确定是否存在安全漏洞。我们希望这篇文章能够启发您使用不同的工具和技术来了解网络安全。

相关文章