大家好,欢迎来到IT知识分享网。
zeek使用
一、概述
资料
官网地址
https://docs.zeek.org/en/master/
架构
- zeek主要包括两个组件:事件引擎和脚本解释器
- 事件引擎组件包括多个子组件,尤其包括由以下组成的数据包处理管道:输入源、数据包分析、会话分析和文件分析。事件引擎提供了一个插件架构,用于从核心 Zeek 代码库之外添加任何这些,允许根据需要扩展 Zeek 的功能。
- 脚本解释器:它执行一组用 Zeek 的自定义脚本语言编写的事件处理程序。这些脚本可以表达站点的安全策略,例如当监视器检测到不同类型的活动时要采取的操作。脚本可以从输入流量中导出任何所需的属性和统计信息。Zeek 脚本可以生成实时警报,还可以按需执行任意外部程序。人们可能会使用此功能来触发对攻击的主动响应。
安装
centos7
依赖
需要gcc 7以上版本。
yum install cmake make gcc gcc-c++ flex bison libpcap-devel openssl-devel python3 python3-devel swig zlib-devel
yum list all --enablerepo="centos-sclo-rh"|grep devtoolset-7
yum install cmake3 devtoolset-7
设置gcc使用版本:(切换到编译用户dvb)
scl enable devtoolset-7 bash
pip3 install GitPython semantic-version
编译安装
### 下载源码包
使用官网源码包,不适用github上的
### 编译安装
./configure
make
make install
1,目录中auxil:辅助工具和库。 /auxiliary:辅助的,后备的/
2,zeek所在目录:/home/dvb/zeek-4.2.1/build/src
### 文件目录说明
$PREFIX/ (e.g. /opt/zeek/ or /usr/local/zeek/)
|_ bin/
|_ etc/
|_ include/
|_ lib/
|_ logs/
|_ share/
|_ spool/
## bin
1,zeek:命令行工具
2,zeek-cut:从 zeek 日志(非 JSON)中提取列,方便进行日志分析,还将 Unix 纪元时间转换为人类可读的格式。
3,zeekctl
主要用作 Zeek 集群管理工具,它是一个交互式 shell,可以轻松操作/管理 Zeek 安装。
## etc
1,networks.cfg:
在此处定义您的本地网络。Zeek 分析是网络感知的,建议使用此文件来定义您的本地网络,以便对网络流量进行有效和正确的分析
2,node.cfg
通过定义各种节点类型及其相应设置来配置独立节点或 Zeek 集群配置。它具有为用户使用的独立和集群配置定义的示例。
3,zeekctl.log
ZeekControl 管理的配置文件。它包含默认日志目录、日志轮换时间间隔和电子邮件配置的设置。
## logs
日志目录
current:zeekctl控制运行时生成的日志
## share
包含 Zeek 附带的所有 Zeek 脚本的目录,这些脚本是高度可定制的,以支持您特定环境的流量分析。
1,zeek/base/
#它包含始终由 Zeek 加载的基本脚本(除非-b 提供了命令行选项)
#这些文件不应直接编辑,否则升级的时候也需要手动修改。
#基本脚本处理收集有关网络活动的基本/有用状态或提供扩展 Zeek 功能而无需任何性能成本的框架/实用程序。
2,zeek/policy/
zeek 附带的其他策略脚本。目录下的脚本 policy/可能更具情境性或成本更高,因此用户必须明确选择是否要加载它们。默认情况下,Zeek 加载一些最有用的策略脚本,通过站点目录中的 local.zeek 文件启用。这些脚本同样不应被修改。
3,zeek/site/
这是可以放置本地特定于站点的文件/脚本的目录,而不必担心以后会被破坏(使用 Zeek 升级)。ZeekControl 管理的 Zeek 实例的默认分析配置的主要入口点是脚本,可用于加载其他自定义或策略脚本。$PREFIX/share/zeek/site/local.zeek
配置环境变量
vi .bashrc
# zeek
export PATH=/usr/local/zeek/bin:$PATH
快速入门
zeekctl(略)
zeek
使用
监控实时流量
zeek -i en0 <list of scripts to load>
1,en0应替换为您要监视流量的接口
2,默认情况下将加载并启用标准的基本脚本。可以在命令中提供附加脚本列表
3,Zeek 还将加载以空格分隔的文件或路径形式提供的任何此类脚本
4,Zeek 会将日志文件输出到当前工作目录
5,zeek的默认脚本路径:
./
<prefix>/share/zeek/
<prefix>/share/zeek/policy/
<prefix>/share/zeek/site/
不在默认脚本路径范围内的,则需要写清楚具体脚本所在路径。也可以使用环境变量ZEEKPATH扩展搜索路径。
离线分析(pcap文件)
### 捕获数据包
tcpdump -i en0 -s 0 -w mypackets.trace
### 默认分析,日志在工作目录下产生。
zeek -r mypackets.trace
### 如果没有为 pcap 生成日志,请尝试运行 pcap-C以告诉 Zeek 忽略无效的 IP 校验和:
zeek –C –r mypackets.trace
### 加载更多脚本或者自定义脚本。
zeek -r mypackets.trace local
zeek –r mypackets.trace my-script.zeek
### 您可以使用命令行中的选项 logdir 将文件写入目录:
mkdir output_directory ; zeek -r mypackets.trace LogAscii::logdir=output_directory
不安装直接运行
[dvb@localhost ~]$ cd zeek-4.2.1/
[dvb@localhost zeek-4.2.1]$ source build/zeek-path-dev.sh
[dvb@localhost zeek-4.2.1]$ which zeek
~/zeek-4.2.1/build/src/zeek
[dvb@localhost zeek-4.2.1]$ echo $ZEEKPATH
.:/home/dvb/zeek-4.2.1/scripts:/home/dvb/zeek-4.2.1/scripts/policy:/home/dvb/zeek-4.2.1/scripts/site:/home/dvb/zeek-4.2.1/build/scripts:/home/dvb/zeek-4.2.1/
build/scripts/builtin-plugins
日志
# ts uid orig_h orig_p resp_h resp_p
1311627961.8 HSH4uV8KVJg 192.168.1.100 52303 192.150.187.43 80
ts:时间戳
uid:唯一连接标识符 (UID)
连接 4 元组(发起方主机/端口和响应方主机/端口)
UID 可用于识别和关联与给定连接 4 元组在其生命周期内关联的所有记录活动(可能跨多个日志文件)
脚本学习
二、开发
WRITER_MYSQL
需求目标
需求
原有日志输出到sqlite数据库中,流量大的时候,同时读写导致死锁。现修改为日志输出的mysql中。
目标
目标1
- 在writer/sqlite,添加mysql操作,将数据同时输出到sqlite与mysql中。
- 记录并修改mysql不兼容部分
- 比对sqlite与mysql,表以及记录。
目标2
- 加入uds输入,编译部署在161.
- 比对sqlite与mysql,表以及记录。
- mysql同时读写是否正常。
目标3
- 去掉sqlite 写入部分。
- 测试mysql同时读写是否正常。
设计与开发
环境
-
开启六个终端。su – dvb
-
终端1:用于编译
cd /home/dvb/zeek-4.2.1 su ##使用root用户但是使用dvb的环境变量 make && make install
-
终端2 :用于开发,使用dvb用户
cd /home/dvb/zeek-4.2.1/src/logging/writers/sqlite
-
终端3:用于测试。(主要是用几个脚本)
cd /home/dvb/zeek_161 su ##使用root用户但是使用dvb的环境变量 zeek -i ens33 script/dvb_chan_1.zeek >log chown dvb:dvb log ### 输入使用uds测试。 cat do.sh nohup zeek -i /tmp/001_zeek.ipc script/dvb_chan_1.zeek -e 'redef LogAscii::use_json=T' >chan1.log &
-
终端4:演示uds发送数据
cd /home/dvb/ts_deal_demo/ts_deal_code_integration ./ts_deal_code_integration_zeek_demo ../ip.ts //循环发送
-
终端5:连接mysq,查看数据库写入情况。
# 连接 mysql -uroot -proot # 查看数据库 show databases; # 创建数据库 create database zeek; # 设置zeek数据库的默认编码。 alter database zeek character set utf8; # 选择数据库 use zeek; # 查看所有表 show tables; # 查看表结构以及编码。 desc tables; //只能查看表结构 show create table student \g; //表结构加字符编码 # 退出 \q # 帮助 \h # 显示连接数 show processlist;
-
终端6:连接sqlite,查看数据库写入情况。
# 数据库文件必须先创建,否则出错。 su mkdir -p /var/db/dvb cd /var/db/dvb touch dvb_chan_1.sqlite # 连接 sqlite3 dvb_chan_1.sqlite # 显示所有表 .table # 帮助 .help # 显示所有表的建表语句 .schema # 显示一个表的表结构 .schema tablename # 退出 .exit # 打开表头 .header on # 清空数据库(终端命令) >dvb_chan_1.sqlite
开发
源文件
cd /home/dvb/zeek-4.2.1/src/logging/writers/sqlite
## 新增
封装了数据库的操作。
mysql_op.cc
mysql_op.h
## 修改
编译
### 加入动态库。
cd/home/dvb/zeek-4.2.1/src
vi CMakeLists.txt
FIND_LIBRARY(MYSQLLIB libmysqlclient.so /usr/lib64/mysql/)
target_link_libraries(zeek ${zeekdeps} ${CMAKE_THREAD_LIBS_INIT} ${CMAKE_DL_LIBS} ${MYSQLLIB})
### 编译
cd /home/dvb/zeek-4.2.1
make &&make install
###打包
cd /home/dvb/zeek-4.2.1/build/src
sh get_zeek_bin_and_lib.sh
cat get_zeek_bin_and_lib.sh
## 脚本用来获取zeek的的最新版本的可执行文件和库。
# 创建目录
destDir=zeek_lib_$(date "+%Y%m%d")
[ ! -d ${destDir} ] &&mkdir ${destDir}
# 复制zeek可执行文件
cp zeek ${destDir}
# 复制lib
for i in `ldd zeek|grep /home/dvb/zeek-4.2.1|awk '{ print $3}'`
do
cp $i ${destDir}
done
测试
测试过程
问题记录
### mysql 不兼容问题记录
## 插入中文报错
mysql默认的编码为latin,需要修改为utf-8.
show variables like 'character%'; --显示数据库字符集
show create table info1 \g; ---显示表info1的默认字符集和建表语句
alter database zeek character set utf8; --设置数据库的编码为zeek。
##字符串为空,插入报错。
为空的替换为null。
##double类型的时间戳解析有问题。
拼接问题默认使用的科学计数法。
double a=1653621220.636292;
stringstream ss;
ss.unsetf(ios::scientific);
ss.setf(ios::fixed);
ss<<a;
string str=ss.str();
ss.unsetf(ios::fixed);
cout<<str<<endl;
## sql语句字段不支持添加单引号。
1,mysql支持在字段上添加反单引号(`)或者不加。
2,尝试在建表语句去掉单引号,但是发现,存在node.id等不常规的字段名称。
3,最终方案,sql中字段上单引号变为反单引号。
## 创建ssl表失败。
1,ssl表应该是内置表,用户不能再重新定义。
2,解决:加入通道号。
mysq c/c++
必要条件
### 安装
必须安装mysql-devel,具体安装参见mysq安装教程。
### 头文件与库
[dvb@localhost mysql]$ rpm -qa|grep mysql
mysql-community-common-5.7.29-1.el7.x86_64
mysql-community-libs-compat-5.7.29-1.el7.x86_64
mysql-community-client-5.7.29-1.el7.x86_64
mysql-community-libs-5.7.29-1.el7.x86_64
mysql-community-devel-5.7.29-1.el7.x86_64
mysql-community-server-5.7.29-1.el7.x86_64
[dvb@localhost mysql]$ rpm -ql mysql-community-devel-5.7.29-1.el7.x86_64
/usr/bin/mysql_config
/usr/bin/mysql_config-64
/usr/include/mysql
/usr/include/mysql/big_endian.h
/usr/include/mysql/binary_log_types.h
/usr/include/mysql/byte_order_generic.h
mysql/mysql.h:/usr/include/mysql
链接库:mysqlclient
编译示例:
gcc mysql_test.c -L /usr/lib64/mysql -lmysqlclient
g++ mysql_test.cpp -L /usr/lib64/mysql -lmysqlclient -std=c++11
api说明
参考资料
https://blog.csdn.net/Yetao1996/article/details/124745730
整理
demo
cd /home/dvb/zeek-4.2.1/test
cat mysql_test.cpp
#include <iostream>
#include <string.h>
#include <mysql/mysql.h>
#define SQL_MAX 256
using namespace std;
// 连接数据库 与 选择数据库
bool connectDB(MYSQL& mysql) {
// 初始化数据库句柄
mysql_init(&mysql);
// 设置字符编码
mysql_options(&mysql, MYSQL_SET_CHARSET_NAME, "utf8");
// 连接数据库
MYSQL* ret = mysql_real_connect(&mysql, "localhost", "root", "root", "zeek", 3306, NULL, 0);
if (ret == NULL) {
cout << "数据库连接失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
} else cout << "数据库连接成功!" << endl;
// 选择数据库,成功返回0, 失败返回非0
int res = mysql_select_db(&mysql, "zeek");
if (res) {
cout << "数据库选择失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
} else cout << "数据库选择成功!" << endl;
return true;
}
//创建表
bool createTable(string tabName) {
MYSQL mysql; // 数据库句柄
char sql[SQL_MAX]; // 存储sql语句
//连接数据库
if (!connectDB(mysql)) return false;
// c语言字符串组合
snprintf(sql, SQL_MAX, " create table IF NOT EXISTS %s(id int,user_name varchar(10),user_password varchar(10));", tabName.c_str());
cout << "建表 sql 语句:" << sql << endl;
// 执行sql,成功返回0
int ret = mysql_real_query(&mysql, sql, (unsigned)strlen(sql));
cout << "执行建语句,插入返回结果:" << ret << endl;
if (ret) {
cout << "建表失败!失败原因:" << mysql_error << endl;
return false;
}
cout << "建表成功!" << endl;
mysql_close(&mysql);
return true;
}
// 插入表数据
bool addTableData(int id, const char* user_name, const char* user_password) {
MYSQL mysql; // 数据库句柄
char sql[SQL_MAX]; // 存储语句
// 连接数据库
if (!connectDB(mysql)) return false;
// c语言字符串组合
snprintf(sql, SQL_MAX, "INSERT INTO user VALUES (%d, '%s', '%s');", id, user_name, user_password);
cout << "插入 sql 语句:" << sql << endl;
int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
cout << "执行插入语句,插入返回结果:" << ret << endl;
if (ret) {
cout << "插入表数据失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
}
cout << "插入数据成功!" << endl;
mysql_close(&mysql);
return true;
}
//删除表数据
bool delTableData(int id) {
MYSQL mysql; // 数据库句柄
char sql[SQL_MAX]; // 存储sql语句
//连接数据库
if (!connectDB(mysql)) return false;
// c语言字符串组合
snprintf(sql, SQL_MAX, "DELETE FROM user where id = %d;", id);
cout << "删除 sql 语句:" << sql << endl;
// 执行sql,成功返回0
int ret = mysql_real_query(&mysql, sql, (unsigned)strlen(sql));
cout << "执行删除语句,插入返回结果:" << ret << endl;
if (ret) {
cout << "删除表数据失败!失败原因:" << mysql_error << endl;
return false;
}
cout << "删除表数据成功!" << endl;
mysql_close(&mysql);
return true;
}
// 修改表数据
bool alterTableData(int id, const char* password) {
MYSQL mysql; // 数据库句柄
char sql[SQL_MAX]; // sql语句
// 连接数据库
if (!connectDB(mysql)) return false;
// c语言组合字符串
snprintf(sql, SQL_MAX, "UPDATE user SET user_password = '%s' WHERE id = %d;", password, id);
cout << "修改 sql 语句:" << sql << endl;
// 执行sql语句,成功返回0
int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
cout << "执行修改语句,修改返回结果:" << ret << endl;
if (ret) {
cout << "数据修改失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
}
cout << "修改表数据成功!" << endl;
mysql_close(&mysql);
return true;
}
// 查询表数据
bool queryTableData() {
MYSQL mysql; // 数据库句柄
MYSQL_RES* res; // 查询结果集
MYSQL_ROW row; // 记录结构体
char sql[SQL_MAX]; // SQL语句
// 连接数据库
if (!connectDB(mysql)) return false;
// C语言组合字符串
snprintf(sql, SQL_MAX, "SELECT id, user_name, user_password FROM user;");
cout << "查询 sql 语句:" << sql << endl;
int ret = mysql_real_query(&mysql, sql, (unsigned long)strlen(sql));
cout << "执行查询语句,查询返回结果:" << ret << endl;
if (ret) {
cout << "数据查询失败!失败原因:" << mysql_error(&mysql) << endl;
return false;
}
cout << "数据查询成功!" << endl;
// 获取结果集
res = mysql_store_result(&mysql);
while (row = mysql_fetch_row(res)) {
cout << "用户id:" << atoi(row[0]) << "\t"; // 转换为int类型,打印id
cout << "用户姓名:" << row[1] << "\t"; // 打印用户姓名
cout << "用户密码:" << row[2] << endl; // 打印用户密码
}
mysql_free_result(res);
mysql_close(&mysql);
return true;
}
int main() {
// addTableData(2, "zhuangqian", "66666666");
// delTableData(2);
// alterTableData(1, "88888888");
// queryTableData();
createTable("student");
return 0;
}
## 编译
g++ mysql_test.cpp -L /usr/lib64/mysql -lmysqlclient -std=c++11
三、辅助软件
mysql
centos7
离线包
链接:https://pan.baidu.com/s/1QGR7h1fCiX7-PgElk_hVtA
提取码:lrtc
本人磁盘:mysql-5.7.29-1.el7.x86_64.rpm-bundle.tar
安装
-
解压:注意没有文件夹,需要先将tar放在文件夹中。
-
卸载 mariadb与原有mysql
rpm -qa | grep mariadb rpm -e --nodeps mariadb-libs-xxxxx rpm -qa | grep mysql
-
离线安装。
rpm -ivh mysql-community-common-5.7.29-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-5.7.29-1.el7.x86_64.rpm rpm -ivh mysql-community-devel-5.7.29-1.el7.x86_64.rpm rpm -ivh mysql-community-libs-compat-5.7.29-1.el7.x86_64.rpm rpm -ivh mysql-community-client-5.7.29-1.el7.x86_64.rpm rpm -ivh mysql-community-server-5.7.29-1.el7.x86_64.rpm
-
初始化
chown -R mysql:mysql /var/lib/mysql/ mysqld --initialize chown -R mysql:mysql /var/lib/mysql/ ## 不执行,会导致mysql启动不起来
-
启动
systemctl start mysqld
-
连接
注意:root会带一个随机密码 ### 获取随机密码 cat /var/log/mysqld.log |grep pass ### 修改密码 mysql -u root -p 输入随机密码登录 mysql=》 set password for root@localhost = password('xfs123456');
常用命令
连接
mysql -h 主机名 -u 用户名 -p
显示数据库
mysql> SHOW DATABASES;
切换数据库
mysql> use RUNOOB;
Database changed
配置文件
/etc/my.cnf
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/32190.html