概念介绍
joy/README.md at master · cisco/joy (github.com)
Joy 是一个 BSD 许可证开源软件包,用于收集和分析网络数据,重点是网络数据特征的探索。本文档介绍了如何使用、安装、构建和修改 Joy。
1.1.1 为什么选择 Joy?
Joy包含了一个数据收集程序joy和一些数据分析程序,包括sleuth。前者是用C99编写的,它读取原始网络流量或数据包捕获文件,然后以JavaScript对象表示法(JSON)格式输出观察到的流量摘要;见图1.1的例子。该程序还可以以遥测收集器模式运行,并接收IPFIX或Netflow版本9数据包;在该模式下,它将遥测转换为JSON描述的流,这些流是由遥测导出程序观察到的。sleuth程序读取流量的JSON描述,根据其命令行指定过滤流量,并打印出选定流量的描述,或者它可以按部分3所述选择、汇总或分析流量。
1.1.1 为什么选择Joy? Joy对于收集、分析和探索网络数据非常有用。它的JSON输出格式灵活,非常适合许多数据分析工具和现代编程环境,如Python和scikit-learn,并且它使用流导向模型,既方便又概念上熟悉。它能够在保留隐私的同时获取网络元数据,方法是避免大量数据捕获并通过匿名化地址和用户名。它还意识到几个重要的协议,包括HTTP、TLS、DNS和DHCP,从能够记录其会话元数据元素在其JSON格式的意义上。它也很容易扩展;JSON优雅地处理可选或额外的数据,捕获工具具有C预处理器接口,有助于捕获新数据元素。Joy不像wireshark、tshark或tcpdump那样了解那么多的协议,所以后者可能更适合于详细的人驱动的特定数据包捕获文件的取证分析。然而,Joy更适合于分析许多会话或许多数据包捕获文件。流,在积极心理学中,是指一个人在进行活动时完全沉浸在充满活力的专注、深度参与和快乐的感觉中的状态。这第二种含义激发了这个软件包名称的选择。
1.1.2 伦理 Joy旨在用于网络和安全研究、取证以及(小规模)网络监控,以检测漏洞、威胁和其他未经授权或不想要的行为。研究人员、管理员、渗透测试人员和安全运营团队可以充分利用这些信息,以保护被监控的网络,并且在漏洞的情况下,通过改善防御姿态,造福更广泛的社区。像任何网络监控工具一样,Joy可能会被滥用;不要在您不是所有者或管理员的任何网络上使用它。
1.2 网络数据背景
流量是一组具有共同特征的数据包,称为流量键。在Joy中,流量键是传统的网络五元组:源地址和目的地址、源端口和目的端口(对于TCP和UDP流量)以及协议号。象征性地,流量键是元组(源地址,目的地址,协议号,源端口,目的端口)。如上所定义,流量是单向的;它的所有数据包都朝同一个方向移动。交互式网络会话通常涉及双向流量,这在1.2.1节中有所描述。在本文档中,我们有时使用术语"流量"来指代描述流量的数据记录;这种约定在计算机网络中很常见。下表显示了Joy使用的JSON格式中的流量键字段以及一些其他重要字段:
JSON元素 | 数据元素 | 备注 |
---|---|---|
源地址 | 互联网协议地址 | |
目的地址 | 互联网协议地址 | |
协议号 | ||
源端口 | TCP或UDP端口 | |
目的端口 | TCP或UDP端口 | |
出字节 | sa→da的字节数 | 任何协议 |
出包数 | sa→da的数据包数 | |
开始时间 | 从纪元以来的秒数 | |
结束时间 | 从纪元以来的秒数 | |
数据包 | 数据包长度、方向和时间的数组 | |
入字节 | sa←da的字节数 | 仅双向流量 |
入包数 | sa←da的数据包数 |
纪元由POSIX定义为协调世界时(UTC),星期四,1970年1月1日00:00:00。默认情况下,joy不报告数据包数组中数据字段长度为零的TCP数据包。所有的TCP会话都是从包含两个这样的数据包的握手开始的,大多数TCP会话包括'ACK数据包',这些数据包不包含数据,仅用于确认由另一方发送的数据的接收。有关更多信息,请参见第2.3.2节。
1.2.1 双向流量
默认情况下,joy捕获单向流量,但在许多情况下,双向流量更有趣;bidir=1选项(第2.3.4节)会导致程序将同一会话中的任何单向流量缝合在一起。双向流量由一对单向流量组成,它们的源地址和目的地址及端口被颠倒,并且它们的时间跨度重叠。也就是说,如果出和入是单向的,那么它们的组合是双向流量,当
入源地址 = 出目的地址,入目的地址 = 出源地址, 入源端口 = 出目的端口, 入目的端口 = 出源端口,(1.1) 入协议号 = 出协议号, 入开始时间 > 出开始时间, 入开始时间 < 出结束时间。
图1.3a显示了两个单向流量及其双向组合之间的关系,图1.3b显示了Joy输出双向流量的一个例子。Joy的约定是,在双向流量中,从源地址(sa)流向目的地址(da)的数据包是出站的,从da流向sa的数据包是入站的;每当在JSON模式中使用出和入时,都暗示了这种方向性。双向流量有时被称为双流。
1.2.2 流量过期
在网络监控中,等待长时间流量完成之前才使其流量记录可用是不可取的。一些流量的持续时间几乎与它们连接的操作系统的正常运行时间一样长。为了避免这种无限期等待流量数据,监控系统采用超时方法:当流量在非活动超时期间不活动,或者当它处于活动状态并且持续时间超过活动超时期间时,就会导出流量记录。joy捕获工具使用这些约定,非活动时间为十秒,活动时间为三十秒。也就是说,如果流量在十秒钟内不活动,或者如果它处于活动状态达三十秒,就会创建流量记录。流量记录指示发生了上述哪种条件,在顶层的过期类型元素中显示:
• "expire type": "i" 表示非活动到期, • "expire type": "a" 表示活动到期。
sleuth程序默认将具有匹配流量键的连续流量缝合在一起。可以关闭时间顺序缝合(见第3.2.8节),这有助于理解Netflow或IPFIX监控系统的超时逻辑如何影响数据捕获。然而,在大多数情况下,应该使用时间顺序缝合。这在监控私有网络时尤其重要,因为经过活动时间限制的流量可能看起来来自私有网络之外。更具体地说:缺乏时间顺序缝合可能使看起来有违反私有网络访问控制策略的流量。TCP SYN标志可以用作健全性检查,因为被活动超时截断为两个更多流量记录的长时间运行的TCP流量将只在第一个流量记录中包含SYN标志。
第2章 The joy tool
2.1 概览
调用joy的命令行语法是
joy [选项] [文件1 [文件2 ...]]
默认情况下,它的输出是以GZIP压缩的JSON格式,使用第5节中描述的格式。未压缩的输出或bz2压缩的输出可以作为编译时选项(见文件src/include/output.h)。有许多软件工具可以处理GZIP压缩的数据,尤其是在Linux和其他POSIX环境中,如gunzip、zless和zcat。下面是一个示例调用,它将joy应用于离线模式,并使用gunzip将其输出转换为未压缩的形式:
joy bidir=1 browse.pcap | gunzip {"version":"1.74","interface":"none","promisc":0,"output":"none", ... } {"sa":"10.0.2.15","da":"74.125.228.207","pr":6,"sp":43039,"dp":443, ... } {"sa":"10.0.2.15","da":"74.125.228.195","pr":6,"sp":54210,"dp":443, ... } {"sa":"10.0.2.15","da":"74.125.228.104","pr":6,"sp":47443,"dp":443, ... } ...
2.1.1 配置对象
在初始化和任何其他输出之前,joy会写出一个JSON对象,描述其完整的配置以及生成它的joy程序的版本。这些信息很重要,因为选项会影响流对象中可以出现的数据元素。分析joy JSON输出的程序应该检查配置对象,并确保它们不会将其作为流对象进行处理,它们应该通过检查对象顶层的version字段的存在来进行这一点。一个配置对象的注释示例:
{ "version": "1.74", // joy程序的版本 "interface": "none", // 未指定输出接口 "promisc": 0, // 没有使用混杂模式 "output": "none", // 未指定输出;将使用stdout "outputdir": "none", // 未指定输出目录 "username": "none", // 未指定用于特权降低的用户名 ... }
配置对象中的JSON名称是本章定义的joy命令名称。
2.1.2 子网文件
有些选项会导致joy从文件中读取一系列子网,并在sa和/或da位于这些子网之一时执行特定处理。子网文件的格式由文件internal.net展示:
# 用于地址匿名化的子网 # 10.0.0.0/8 # RFC 1918地址空间 172.16.0.0/12 # RFC 1918地址空间 192.168.0.0/16 # RFC 1918地址空间
每一行包含一个地址作为点分四元组,或者是一个子网作为点分四元组后跟一个斜杠和一个0到32之间的数字,或者是空的。井号字符和其后面该行的任何字符都被忽略,空行也是如此。
安装和部署Linux (Ubuntu)
(中间需要重启一次reboot)
#环境依赖 安装中需要重启服务器
sudo apt-get install build-essential libssl-dev libpcap-dev libcurl4-openssl-dev
#Download, Configure and Make Joy
git clone https://github.com/cisco/joy.git
#Configure
cd joy
./configure --enable-gzip
#build
make clean;make
sudo ./install_joy/install-sh
.....
A new SSH key was generated, and its private key was installed in
the /usr/local/etc/joy directory. To use this key to authenticate scp
connections to a server that copy the JSON files, you will need to
provide the public key upload-key.pub to the server administrator,
as it needs to be installed in the ./ssh/known_hosts file.
=====================
Joy的使用example
参考链接:https://github.com/cisco/joy/wiki/Usage
要了解 Joy 的配置方式,请阅读配置文件 "options.cfg"。要在离线模式下处理 pcap 文件,请运行:[joy]$ bin/joy [ OPTIONS ] filename [ filename2 ... ]
例如:
[joy]$ bin/joy bidir=1 output=data.json filename
要在在线模式下运行数据包捕获,请使用相同的命令格式,但在 OPTIONS 中包含 interface=
命令,并省略命令行中的文件名。例如:
[joy]$ sudo bin/joy interface=eth0 bidir=1 output=data.json
有许多命令行选项。为了避免在命令行上输入所有选项,您可以让程序读取配置文件。此类文件在分发时包含在内,路径为 install/options.cfg。如果您想更改程序默认设置(您可能需要这样做,以便捕获您感兴趣的数据),请复制配置文件。通过创建具有不同名称的本地副本,您的配置在更新 Joy 软件包时不会被覆盖。f
cd /joy/bin
#方式1
./joy tls=1 bidir=1 dist=1 num_pkts=50 zeros=0 retrans=0 entropy=1 /home/yangshanshan/joy/test/pcaps/tls10.pcap | gunzip > test-multi.json
#方式2
./joy output=test_easy.gz /home/yangshanshan/joy/test/pcaps/tls10.pcap
gunzip test_easy.gz