忽略一、二部分,直接二进制安装会避免很多问题。所以从第三部分开始看即可。
目录
三、二进制安装
四、使用
五、遇到的问题
六、浏览记录的日志
自动脚本运行
一、安装工具
1.Libpcap 工具安装
在http://www.tcpdump.org/下载libpcap,
解压: tar -xvzf libpcap-1.10.0.tar.gz -C ../ 解压到home目录下
./configure; make; sudo make install
2. OpenSSL 库安装
从openssl官网下载最新的稳定版本,https://www.openssl.org/source/ 当前的稳定版是 openssl-1.1.1i.tar.gz
解压:tar -xvzf openssl-1.1.1i.tar.gz 解压到home目录下
3.BIND库安装
sudo yum install bind
4.Libz
yum install -y zlib zlib-devel
二、安装依赖
RPM/基于RedHat的Linux(CentOS7是这个版本):
sudo yum install cmake make gcc gcc-c++ flex bison libpcap-devel openssl-devel python-devel swig zlib-devel
DEB/基于Debian的 Linux:
sudo apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python-dev swig zlib1g-dev
安装git Centos下使用:yum install git -y 或者 yum install -y git\
二、源码安装
从https://github.com/zeek上的git仓库获取最新的Zeek开发版本:
git clone --recursive https://github.com/zeek/zeek
从源码编译和安装的典型方式是:
./configure
make
make install
如果 configure
脚本失败了,那么最有可能是因为它没有找到需要的依赖或者它没有找到依赖的足够新的版本。假设你已经安装了所有需要的依赖,然后你只需要使用 —with-*
选项来运行 configure
脚本,帮助它定位到依赖。
问题一:./configure: /bin/sh^M: bad interpreter: No such file or directory 造成这个原因是:window换行与linux换行符不一样:----dos(换行符为\r\n) mac(换行为\r)linux(换行为\n)
解决方法:
vi configure
: set ff=unix
:wq!
问题二:CMake Error at CMakeLists.txt:3 (cmake_minimum_required): CMake 3.5...3.18 or higher is required. You are running version 2.8.12.2
解决:Cmake升级。包下载:Index of /files/v3.18
wget https://cmake.org/files/v3.18/cmake-3.18.0.tar.gz
tar xvf cmake-3.6.2.tar.gz && cd cmake-3.6.2/
./bootstrap
gmake
三、二进制安装
Zeek: Get Zeek 官网下载入口
https://github.com/zeek/zeek/wiki/Binary-Packages 选择下载Linux Binaries
Install package security:zeek / zeek-lts 选择添加软件源并手动安装,指的是复制命令行执行。
下面的命行永远安装最新的LTS版本的zeek,对应的系统版本是Ubuntu20.04
# Ubuntu20.04版本安装zeek
echo 'deb http://download.opensuse.org/repositories/security:/zeek/xUbuntu_20.04/ /' | sudo tee /etc/apt/sources.list.d/security:zeek.listcurl -fsSL https://download.opensuse.org/repositories/security:zeek/xUbuntu_20.04/Release.key | gpg --dearmor | sudo tee /etc/apt/trusted.gpg.d/security_zeek.gpg > /dev/nullsudo apt updatesudo apt install zeek-lts# 查看安装的zeek版本
zeek --version
四、使用
使用前的修改。安装好了之后使用whereis zeek,会显示出安装之后的路径,我的安装路径是自动安装在/opt/zeek,然后在(可参考这里)
-
在
$PREFIX/etc/node.cfg
文件中, 设置监测设备的正确接口interface。设置要监视的正确网卡,我的网卡是ens33 -
在
$PREFIX/etc/networks.cfg
文件中,注释掉默认设置,然后添加监测环境的本地网络。 -
在
$PREFIX/etc/zeekctl.cfg
文件中,修改MailTo
邮件地址成期望的收件人以及修改LogRotationInterval
成期望的日志归档频率(这一条的修改是可选的)。
现在像这样启动ZeekControl终端:
zeekctl
由于是第一次使用,执行ZeekControl配置的初始化安装:
[ZeekControl] > install
然后启动Zeek实例:
[ZeekControl] > start
如果尝试启动Zeek实例时遇到了错误,你可以使用 diag
命令查看细节。如果启动成功,Zeek实例就会开始根据默认策略分析流量,然后输出结果到 $PREFIX/logs
(即/opt/zeek/logs)文件夹中。
启动之后它就会一直运行下去,如果想停止Zeek实例,可以命令:
[ZeekControl] > stop
五、遇到的问题
1.zeekctl命令无法找到
原因是安装zeek的时候,并没有将bin目录放到环境中。解决方法就是将/opt/zeek/bin路径放在环境中
1.export PATH=$PATH:/opt/zeek/bin # 添加环境变量:在~/.bashrc文件中添加下面一行,如果是用户目录下的则 用户局限:仅对当前用户。如果是切换到root用户下面的则 用户局限:对所有用户。所以我选择的后者,便于普通用户使用。
2.source ~/.bashrc # 生效
3.echo $PATH # 打印环境变量中的路径,如果zeek地址在出现则添加成功# 如果不是root用户,则zeek文件夹的操作权限需要给用户
4.sudo chmod -R 777 /opt/zeek/综上:普通用户使用只需要加上第四步,其他和root用户是一样的。已经不存在权限相关问题,普通用户下可以使用zeek。
2.安装的版本是zeek3.0.13版本,需要挂钩python,会出现找不到/usr/bin/python ,
解决就是创建该连接,因为系统本身就存在python,但是名字是python2或者python3. 在这里我选择的是python3也就是系统的python3.8.3,因为个人觉得python2.7支持已经没有了,新版本才是主流。
sudo ln /usr/bin/python3 /usr/bin/python
3.运行start出现cannot create working directory for zeek。然后运行diag,查看具体原因:Failed to establish connection to host 127.0.0.1: "str" object has no attriobute "decode".
原因:关于python3出现 "AttributeError: 'str' object has no attribute 'decode'"错误的原因及其解决办法 说到了python 3中只有unicode str,所以把decode方法去掉了。python3环境中,f1已经是unicode str了,不用decode。所以这里的“str”本身已经没有decode方法了。解决方法就是在问题二中的连接改成python2.7的。由此可见当前zeek版本依赖的的python2.7,还不支持更高版本的python。
sudo rm -f /usr/bin/python 先删除连接
sudo ln /usr/bin/python2 /usr/bin/python 再修改为python2.7的版本。
4.出现 error:zeek terminated immediately after starting;check output with “diag”。然后diag命令后出现下面信息。
原因:diag信息里面出现了subnet and 192.168.153.129,联想到了上面设置的步骤:在
$PREFIX/etc/networks.cfg
文件中,注释掉默认设置,然后添加监测环境的本地网络。查看里面ip的设置样例,都是ipv4和掩码的组合,即子网掩码方式。而我添加的是ipv4,并没有添加掩码。使用ifconfig,和ip addr的区别:
所以只需要修改networks.cfg文件里面的ip地址,修改好的结果如下:
5. 启动start之后出现错误,运行diag之后里面显示这句错误:fatal error: problem with interface ens3 (pcap_error: socket: Operation not permitted (pcap_activate))
原因:在工作节点上(work nodes)用户必须能够以混杂模式(promiscuous mode)访问目标网络接口。虽然当前用户是sudoer,但是当zeek与工作人员建立ssh连接时,它无法控制网络接口并设置上限。遵循这里,它要求将整个集群设置为root就能成功运行集群,但是我希望避免这么做(即不使用root)。在stackoverflow上面发现了存在相同问题的讨论同时,追溯到了解决方法的讨论。总之,就是只有root用户具有访问网卡的权限。类似的,从Linux中第一次启动Wireshark的时候,可能会觉得奇怪,为什么看不到任何一个网卡,比如eth0之类的。这是因为,直接访问这些设备需要 root权限。然后,我就用root权限去用了。当然,这是一个不好的做法。比如Gentoo中就会提示:WIRESHARK CONTAINS OVER ONE POINT FIVE MILLION LINES OF SOURCE CODE. DO NOT RUN THEM AS ROOT. 现在多数Linux发行版都开始实现对raw网络设备使用文件系统权限(能力) ,可以用这个途径从普通用户启动Wireshark。
解决方法,使用setcap授予二进制文件权限,在普通用户下面执行下面两句命令
sudo setcap cap_net_raw,cap_net_admin=eip /opt/zeek/bin/zeek sudo setcap cap_net_raw,cap_net_admin=eip /opt/zeek/bin/zeekctl# root权限被分割成一下29种能力,其中的两种: # cap_net_admin:允许执行网络管理任务 cap_net_raw:允许使用原始套接字
六、浏览记录的日志
默认情况下,日志是以可读的格式(ASCII) 写下去的,数据是以列的形式组织的(tab分隔)。处于当前回滚间隔的日志是在 $PREFIX/logs/current/
(如果Zeek没有运行,这个目录就会是空的)中不断累积。默认情况下,ZeekControl
会定时把 $PREFIX/logs/current
下的所有日志归档/打包到一个以时间命名的文件夹下,比如 $PREFIX/logs/2011-10-06
。这项工作的频率可以在 $PREFIX/etc/zeekctl.cfg
中通过 LogRotationInterval
选项配置。
日志的类型:
(1)http.log
和网络协议分析相关的日志通常以下面几列开始:时间戳、唯一会话标识符(UID)、会话四元组(源IP/端口和目标IP/端口)。UID可以用来联系记录的所有和某一给定四元组的生命周期内相关的活动(可能跨越多个日志文件)。
# ts uid orig_h orig_p resp_h resp_p
1311627961.8 HSH4uV8KVJg 192.168.1.100 52303 192.150.187.43 80
然后特定协议日志的剩下的这些列详细记录了协议相关的活动。比如接下来的几列展示了对Zeek主网站的请求:
# method host uri referrer user_agent
GET zeek.org / - <...>Chrome/12.0.742.122<...>
(2)conn.log
网络上出现的每一个会话都会有一条记录,包含诸如时间、持续时长、源目标IP地址、服务、端口、负载大小在内的属性。这份日志提供了网络活动的详细记录。
(3)notice.log
用来辨认出Zeek认为可能是有趣、奇怪或者恶意的特定活动。在Zeek的语言中,这样的活动被称作 “notice”。
自动脚本运行
dns脚本简易部署方法:
1. 切换到site文件夹 cd /opt/zeek/share/zeek/site
2.新建dns.zeek脚本:脚本内在下面
3.修改local.zeek文件,最下面一行加入@load site/dns.zeek
4.重新部署程序zeekctl deploy
输出log格式可以改成json:在local.zeek里加一句@load tuning/json-logs
@load base/protocols/dns/mainmodule DNS;export {redef record Info += {origsize: count &log &optional;respsize: count &log &optional; };
}event dns_end(c: connection, msg: dns_msg) &priority=-4 {c$dns$origsize = c$orig$size;c$dns$respsize = c$resp$size;
}