Zeek可在大多数现代的,基于Unix的系统上运行,并且不需要自定义硬件。它可以以预构建的二进制程序包或源代码形式下载。请参阅安装以获取有关如何安装Zeek的说明。
在以下示例中,$PREFIX
用于引用Zeek安装根目录,默认情况下是/usr/local/zeek
从源安装。
与ZeekControl管理Zeek
ZeekControl是一个交互式外壳程序,用于轻松地在一个流量监控群集中的单个系统甚至跨多个系统上操作/管理Zeek安装。本节说明如何使用ZeekControl来管理独立的Zeek安装。有关ZeekControl的完整参考,请参见ZeekControl文档。有关如何配置Zeek群集的说明,请参阅“ 群集配置”文档。
最小的启动配置
这些是基本配置更改,可用于最小化ZeekControl安装,该安装将管理上的单个Zeek实例localhost
:
- 在中
$PREFIX/etc/node.cfg
,设置要监视的正确界面。 - 在中
$PREFIX/etc/networks.cfg
,注释掉默认设置,然后将Zeek认为是本地的网络添加到受监视环境中。 - 在中
$PREFIX/etc/zeekctl.cfg
,将MailTo
电子邮件地址更改为所需的收件人,将电子邮件地址更改LogRotationInterval
为所需的日志存档频率。
现在像下面那样启动ZeekControl shell:
由于这是外壳程序的首次使用,因此请执行ZeekControl配置的初始安装:
然后启动一个Zeek实例:
如果尝试启动Zeek实例时出错,则可以使用diag
命令查看详细信息。如果成功启动,则Zeek实例将根据默认策略开始分析流量,并在中输出结果$PREFIX/logs
。
注意
启动ZeekControl的用户需要权限才能捕获网络流量。如果您不是root用户,则可能需要为正在使用的帐户授予更多特权;请参阅常见问题解答。另外,如果看起来Zeek没有看到任何流量,请查看有关校验和卸载的FAQ条目。
您可以暂时让它运行,但是要停止此Zeek实例,您可以这样做:
浏览日志文件
默认情况下,日志以人类可读(ASCII)格式写出,数据组织为列(制表符分隔)。当前轮换间隔的一部分的日志被累积 $PREFIX/logs/current/
(如果Zeek没有运行,则该目录将为空)。例如,http.log
包含Zeek HTTP协议分析的结果。以下是的前几列 http.log
:
处理网络协议分析的日志通常是这样开始的:时间戳记,唯一连接标识符(UID)和连接4元组(发起者主机/端口和响应者主机/端口)。UID可用于识别与给定连接4元组在其生命周期内关联的所有记录的活动(可能跨多个日志文件)。
然后,协议特定日志的其余列详细说明了正在发生的协议相关活动。例如http.log
,接下来的几列(为简便起见,简称)显示了对Zeek网站根目录的请求:
一些日志值得明确提及:
conn.log
包含线路上可见的每个连接的条目,并具有基本属性,例如时间和持续时间,发起方和响应方IP地址,服务和端口,有效负载大小等。该日志提供了网络活动的全面记录。
notice.log
标识Zeek识别为潜在有趣,奇怪或不良的特定活动。用Zeek说,这种活动称为“通知”。
默认情况下,ZeekControl
定期从中获取所有日志 $PREFIX/logs/current
并将其存档/压缩到以日期命名的目录,例如$PREFIX/logs/2011-10-06
。可以通过中的LogRotationInterval
选项来配置执行此操作的频率$PREFIX/etc/zeekctl.cfg
。
部署定制
大多数Zeek 部署的目标可能是在网络事件需要人工干预/调查时发送电子邮件警报,但有时与Zeek作为保持策略和站点中立的分发目标相冲突–一个网络上的事件可能不如Zeek 引起注意。另一个事件相同。因此,部署Zeek可以是一个迭代过程,可以更新其策略以对注意到的事件采取不同的操作,并使用其脚本语言以编程方式以精确的方式扩展流量分析。
定制Zeek的第一步就是熟悉它在默认情况下可能生成的通知,并调低或升级发生特定通知时采取的措施。
假设我们已经研究notice.log
了一下,然后看到了我们要进行的两项更改:
SSL::Invalid_Server_Cert
(在该note
列中找到)是一种通知,表示已建立SSL连接,并且无法使用Zeek的默认信任根来验证服务器的证书,但我们希望忽略它。SSL::Certificate_Expired
是一种使用过期证书建立SSL连接时触发的通知类型。当发生这种情况时,我们只需要电子邮件,但仅适用于本地网络上的某些服务器(Zeek还可以主动监视即将过期的证书,但这只是出于演示目的)。
我们已经定义了我们想做的事情,但是需要知道在哪里做。答案是使用以Zeek编程语言编写的脚本,因此让我们快速介绍Zeek脚本。
Zeek脚本
Zeek附带了许多可高度自定义的预编写脚本,以支持针对特定环境的流量分析。默认情况下,这些文件将安装到文件扩展名中$PREFIX/share/zeek
并可以通过使用.zeek
文件扩展名进行标识。绝对不要直接编辑这些文件,因为在升级到Zeek的较新版本时,更改将丢失。该规则的例外是可以在$PREFIX/share/zeek/site
其中放置本地站点特定文件的目录,而不必担心以后会被破坏。在其他主要的脚本目录$PREFIX/share/zeek
是base
和 policy
。默认情况下,Zeek自动将所有脚本加载到 base
(除非-b
提供了命令行选项),用于收集有关网络活动的基本/有用状态,或者提供框架/实用程序来扩展Zeek的功能而不会产生任何性能成本。该policy
目录下的脚本 可能更适合情况或更昂贵,因此用户必须明确选择是否要加载它们。
由ZeekControl管理的独立Zeek实例的默认分析配置的主要入口点是$PREFIX/share/zeek/site/local.zeek
脚本。我们将在以下各节中对此进行添加,但是首先我们必须弄清楚要添加的内容。
重新定义脚本选项变量
许多简单的自定义仅要求您使用Zeek的redef
运算符使用自己的值从标准Zeek脚本中重新定义变量。
标准Zeek脚本向用户宣传可调整选项的典型方式是通过使用&redef
属性和const
限定符定义变量。可重定义的常数可能看起来很奇怪,但这的真正含义是变量的值在运行时可能不会更改,但其初始值可以redef
在解析时通过运算符进行修改。
让我们继续修改两个SSL通知的行为。查看base / frameworks / notice / main.zeek,我们看到它宣传:
这正是我们要第一时间做的事情。添加到local.zeek
:
注意
在Notice
因为变量被宣布和内出口的命名空间范围界定在这里是必需Notice
的模块,但被从外面它引用。如果在模块内部声明和导出的变量仍在模块内部进行引用,则不必对其范围进行限制。
然后进入ZeekControl shell,在安装配置更改之前检查配置更改是否有效,然后重新启动Zeek实例。“部署”命令自动完成所有这些操作:
现在已经忽略了SSL通知,让我们看一下如何在其他通知上发送电子邮件。通知框架有一个类似的选项,称为emailed_types
,但使用该选项 会为所有带有过期证书的SSL服务器生成电子邮件,我们只希望将电子邮件用于与某些证书的连接。有一个policy
挂钩,实际上就是用来实现的简单的功能ignored_types
和 emailed_types
,但它是可扩展的,使得在通知所采取的条件和操作可以由用户自定义。
在中local.zeek
,我们定义一个新的policy
钩子处理程序主体:
有条件notice.zeek
您现在只需要信任语法,但是我们要做的是首先声明我们自己的变量以保存一组受监视的地址 watched_servers
;然后将挂钩处理程序主体添加到策略中,该策略将在通知类型为SSL过期证书并且Info
记录的连接字段中存储的响应主机位于受监视服务器集中时生成电子邮件。
注意
记录字段成员访问使用“ $”字符而不是“。”完成。如其他语言所预期的那样,为了避免与内置地址类型使用’。’产生歧义。在IPv4点分十进制表示形式中。
请记住,要完成配置更改,请deploy
在ZeekControl Shell中执行命令。
下一步
至此,我们已经学习了如何设置最基本的Zeek实例并调整最基本的选项。以下是有关下一步探索的一些建议:
- 我们只研究了如何更改在notice框架中声明的选项,其他脚本包中还有更多选项可供选择。
- 继续阅读“ 使用Zeek”一章,其中将更深入地介绍如何使用Zeek;然后查看“ 编写脚本”以学习如何开始编写自己的脚本。
- 查看其中的脚本,以
$PREFIX/share/zeek/policy
获取可能需要加载的其他脚本。您可以在脚本包概述中浏览其文档 。 - 阅读Zeek附带的脚本代码也是一种进一步了解语言和脚本结构的好方法。
- 查看常见问题解答。
- 继续阅读下面的内容,获得另一个有关将Zeek用作独立命令行实用程序的微型教程。
Zeek作为命令行实用程序
如果您不想使用ZeekControl(例如,不需要其自动化和管理功能),则可以通过以下方法从命令行直接控制Zeek进行分析活动,以进行实时流量和跟踪的脱机工作。
监控实时路况
从接口分析实时流量很简单:
en0
可以由您选择的界面代替。默认情况下,将加载一些常用的基本脚本。
Zeek会将日志文件输出到工作目录中。
注意
此时,有关捕获为非特权用户和卸载校验和的FAQ条目尤其重要。
读取数据包捕获(pcap)文件
从接口捕获数据包并将其写入文件可以像这样完成:
凡en0
可以通过正确的接口为您的系统所取代如图如ifconfig
。(该参数告诉它捕获整个数据包;在不支持的情况下,请改用)。-s 0
-s 65535
捕获流量一段时间后,tcpdump
使用ctrl-c将其杀死,并告诉Zeek对捕获执行所有默认分析,主要包括:
Zeek会将日志文件输出到工作目录中。
如果您对更多检测感兴趣,可以再次加载local
作为建议配置包含的脚本:
告诉Zeek加载哪些脚本
Zeek的命令行调用通常如下所示:
最后一个参数是此Zeek实例将加载的特定策略脚本。这些参数不必包含.zeek
文件扩展名,并且如果相应的脚本位于默认搜索路径中,则不需要路径限定。以下目录包含在Zeek脚本的默认搜索路径中:
这些前缀路径可用于加载脚本,如下所示:
这将加载 <prefix>/share/zeek/policy/frameworks/files/extract-all.zeek
脚本,这将导致Zeek提取其在PCAP中发现的所有文件。
注意
如果希望Zeek能够加载位于Zeek安装根目录中默认目录之外的脚本,则必须提供文件的完整路径。通过运行查看默认搜索路径。zeek --help
您可能会注意到,从命令行加载的脚本使用@load
Zeek语言中的 指令来声明对其他脚本的依赖。该指令与#include
C / C ++的指令相似,不同之处在于语义是“如果尚未加载此脚本,请加载此脚本”。
此外,如果脚本目录包含__load__.zeek
定义了属于软件包一部分的脚本的脚本,则可以将脚本目录指定为要作为“软件包”加载的参数。
本地站点自定义
安装了一个脚本,该脚本被视为“本地站点自定义”,并且在进行升级时不会被覆盖。要使用特定于站点的local.zeek
脚本,只需将其添加到命令行(也可以使用@load通过脚本加载):
这会导致Zeek加载脚本,该脚本会显示有关缺少Site::local_nets
正在配置的变量的警告 。您可以像这样在命令行中提供此信息(在示例子网中提供“本地”子网):
与Zeekctl一起运行时,可通过配置networks.cfg
文件来设置此值。
运行Zeek不安装
对于希望直接从build/
目录运行Zeek的开发人员(即,不执行),他们将必须首先进行调整以在构建目录中查找脚本和其他文件。无论是采购 还是以适合当前的shell实现这一点,也增强了你 ,所以你可以直接使用Zeek二进制文件:make installZEEKPATHbuild/zeek-path-dev.shbuild/zeek-path-dev.cshPATH