zeek使用

zeek使用zeek使用一、概述资料官网地址https://docs.zeek.org/en/master/架构zeek主要包括两个组件:事件引擎和脚本解释器事件引擎组件包括多个子组件,尤其包括由以下组成的数据包处理管道:输入源、数据包分析、会话分析和文件分析。事件引擎提供了一个插件架构,用于从核

大家好,欢迎来到IT知识分享网。

zeek使用

一、概述

资料

官网地址

https://docs.zeek.org/en/master/

架构

zeek使用

  1. zeek主要包括两个组件:事件引擎和脚本解释器
  2. 事件引擎组件包括多个子组件,尤其包括由以下组成的数据包处理管道:输入源、数据包分析、会话分析和文件分析。事件引擎提供了一个插件架构,用于从核心 Zeek 代码库之外添加任何这些,允许根据需要扩展 Zeek 的功能。
  3. 脚本解释器:它执行一组用 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
  1. 在writer/sqlite,添加mysql操作,将数据同时输出到sqlite与mysql中。
  2. 记录并修改mysql不兼容部分
  3. 比对sqlite与mysql,表以及记录。
目标2
  1. 加入uds输入,编译部署在161.
  2. 比对sqlite与mysql,表以及记录。
  3. mysql同时读写是否正常。
目标3
  1. 去掉sqlite 写入部分。
  2. 测试mysql同时读写是否正常。

设计与开发

环境
  1. 开启六个终端。su – dvb

  2. 终端1:用于编译

    cd /home/dvb/zeek-4.2.1
    su            ##使用root用户但是使用dvb的环境变量
    make && make install
    
  3. 终端2 :用于开发,使用dvb用户

    cd /home/dvb/zeek-4.2.1/src/logging/writers/sqlite
    
  4. 终端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 &
    
  5. 终端4:演示uds发送数据

    cd /home/dvb/ts_deal_demo/ts_deal_code_integration
    ./ts_deal_code_integration_zeek_demo ../ip.ts   //循环发送
    
  6. 终端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;
    
  7. 终端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
    
开发

1653880225786

源文件
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})

1653619279887

### 编译
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

整理

1653440953230

1653441009699

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

安装
  1. 解压:注意没有文件夹,需要先将tar放在文件夹中。

  2. 卸载 mariadb与原有mysql

    rpm -qa | grep mariadb
    rpm -e --nodeps mariadb-libs-xxxxx
    
    rpm -qa | grep mysql
    
  3. 离线安装。

    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
    
  4. 初始化

    chown -R mysql:mysql /var/lib/mysql/
    mysqld --initialize
    chown -R mysql:mysql /var/lib/mysql/  ## 不执行,会导致mysql启动不起来
    
  5. 启动

    systemctl start mysqld
    
  6. 连接

    注意: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

(0)

相关推荐

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

关注微信