suricata新增Mysql告警规则处理

suricata新增Mysql告警规则处理

  • 协议解析后续处理内容
  • 新增规则
  • 规则解析关键字新增
  • Setup用于初始化检测项
  • Free用于资源释放
  • AppLayerTxMatch用于协议解析完成后的规则检测
  • 针对pcap文件进行检测
  • 总结

协议解析后续处理内容

经过Mysql协议解析处理流程 介绍,我们在suricata中,新增加了Mysql协议处理相关的内容;
Mysql协议处理后,有两种方式进行处理,
一是将协议解析的内容,进行结果输出;(该内容相对比较简单,在协议框架生成包含了相关处理内容)
二是,将解析的内容与检测规则结合一起进行告警检测
在这里插入图片描述

新增规则

假设,我们需要检测Mysql sql语句中的所有truncate 语句,并进行告警。则规则形如:

alert mysql any any -> any 3306 (msg:"test mysql detect";mysql.sql:truncate;sid:10001;rev:1;)

规则解析关键字新增

如果,新增了以上规则,通过suricata进行引擎分析

suricata -c suricata.yaml --engine-analysis

会提示如下错误:

E: detect-parse: unknown rule keyword 'mysql.sql'.
E: detect: error parsing signature "alert mysql any any -> any 3306 (msg:"test mysql detect";mysql.sql:truncate;sid:10001;rev:1;)"

首先将mysql.sql加入到引擎检测关键字列表中;
在协议框架生成会生成detect-mysql-mysql.h及detect-mysql-mysql.c两个文件。
同时DetectMysqlmysqlRegister为注册关键字及检测函数的入口,
检测注册代码如下

void DetectMysqlmysqlRegister(void)
{sigmatch_table[DETECT_AL_MYSQL_MYSQL].name = "mysql.sql";sigmatch_table[DETECT_AL_MYSQL_MYSQL].desc ="Mysql content modifier to match on the mysql buffers";sigmatch_table[DETECT_AL_MYSQL_MYSQL].Setup = DetectMysqlmysqlSetup;sigmatch_table[DETECT_AL_MYSQL_MYSQL].Free = DetectMysqlmysqlFree;sigmatch_table[DETECT_AL_MYSQL_MYSQL].AppLayerTxMatch = DetectMysqlMatch;
#ifdef UNITTESTSsigmatch_table[DETECT_AL_MYSQL_MYSQL].RegisterTests = DetectMysqlmysqlRegisterTests;
#endifsigmatch_table[DETECT_AL_MYSQL_MYSQL].flags |= SIGMATCH_INFO_STICKY_BUFFER;/* register inspect engines */DetectAppLayerInspectEngineRegister2("mysql.sql", ALPROTO_MYSQL, SIG_FLAG_TOSERVER, 0,DetectEngineInspectGenericList, NULL);g_mysql_rust_id = DetectBufferTypeGetByName("mysql.sql");SCLogNotice("Mysql application layer detect registered.");
}

其中sigmatch_table,为注册各关键字的全局数组。
DETECT_AL_MYSQL_MYSQL为枚举值,在协议框架生成时自动生成在enum DetectKeywordId 中

enum DetectKeywordId {DETECT_SID,DETECT_PRIORITY,DETECT_REV,DETECT_CLASSTYPE,...,DETECT_TARGET,DETECT_AL_MYSQL_MYSQL,...DETECT_AL_TEMPLATE_BUFFER,DETECT_AL_DHCP_LEASETIME,
}

同时将DetectMysqlmysqlRegister的调用加入到SigTableSetup中

void SigTableSetup(void)
{memset(sigmatch_table, 0, sizeof(sigmatch_table));DetectSidRegister();DetectPriorityRegister();DetectPrefilterRegister();DetectRevRegister();DetectClasstypeRegister();DetectReferenceRegister();DetectTagRegister();DetectThresholdRegister();DetectMetadataRegister();...DetectMysqlmysqlRegister();/* close keyword registration */DetectBufferTypeCloseRegistration();
}

完成以上代码注册后,再次执行引擎分析,发现错误已经消失。

Setup用于初始化检测项

此例初始化中,对应mysql.sql:truncate,在执行Setup时,需要将truncate进行缓存,后续在规则检测时进行处理。其处理代码如下:

int DetectMysqlmysqlSetup(DetectEngineCtx *de_ctx, Signature *s, const char *str)
{uint8_t *de = NULL;SigMatch *sm = NULL;s->init_data->list = g_mysql_rust_id;if (DetectSignatureSetAppProto(s, ALPROTO_MYSQL) != 0)return -1;sm = SigMatchAlloc();if (sm == NULL)goto error;sm->type = DETECT_AL_MYSQL_MYSQL;char *value = SCMalloc(strlen(str) + 1);strcpy(value, str);sm->ctx = (SigMatchCtx *)value;SigMatchAppendSMToList(s, sm, g_mysql_rust_id);return 0;error:if (de != NULL)SCFree(de);if (sm != NULL)SCFree(sm);return -1;return 0;
}

从以上代码不难看出,此函数的处理,是把truncate进行了缓存处理。

Free用于资源释放

在上一节的,初始化过程中,存在SigMatchAlloc申请资源的情况,需要在程序退出前执行资源释放

void DetectMysqlmysqlFree(DetectEngineCtx *de_ctx, void *de_ptr)
{if (de_ptr != NULL)SCFree(de_ptr);
}

AppLayerTxMatch用于协议解析完成后的规则检测

sigmatch_table[DETECT_AL_MYSQL_MYSQL].AppLayerTxMatch = DetectMysqlMatch;
此处注册的函数DetectMysqlMatch,在Mysql协议解析过程中的每个Transaction都会执行一次检测;本例中,相当于每执行一条sql语句就会执行一遍。
函数定义如下

static int DetectMysqlMatch(DetectEngineThreadCtx *det_ctx,Flow *f, uint8_t flags, void *state,void *txv, const Signature *s,const SigMatchCtx *ctx) {uint8_t ret = 0;const uint8_t *data = NULL;uint32_t data_len = 0;SCLogDebug("DetectMysqlMatch: flags %d, txv %p, s %p, ctx %p", flags, txv, s, ctx);if (flags & STREAM_TOSERVER) {rs_mysql_get_request_buffer(txv, &data, &data_len);} else if (flags & STREAM_TOCLIENT) {rs_mysql_get_response_buffer(txv, &data, &data_len);      }SCLogDebug("DetectMysqlMatch: flags %d, txv %p, s %p, ctx %p done", flags, txv, s, ctx);if (data != NULL) {char* de = (char *)ctx;char *stripped_data = strip((const char *)data);return startsWith((const char *)stripped_data, de) ;}return 0;
}

其中rs_mysql_get_request_buffer,rs_mysql_get_response_buffer是rust中根据解析的内容,并返回缓存的函数。
其定义如下:

pub unsafe extern "C" fn rs_mysql_get_request_buffer(tx: *mut c_void, buf: *mut *const u8, len: *mut u32,
) -> u8 {let tx = cast_pointer!(tx, MysqlTransaction);if let Some(ref request) = tx.request {match request {MysqlFEMessage::SimpleQuery(quey) => {// If we have a login request, we can return the request buffer.if !quey.is_empty() {*len = quey.len() as u32;*buf = quey.as_ptr();return 1; // success}}_ => {return 0;}}}return 0;
}

此处,我们只返回了SimpleQuery对应的sql语句,正好对应了mysql.sql,对于其他关键字,可以根据实际情况进行修改,比如,检测使用超级用户(root/admin)进行远程登录,其检测规则就需要修改成mysql.login_user:root;而后增加相应的规则处理即可。
此外,在检测之前,执行了strip操作,是因为;默认sql语句前面会增加一些注释,所以执行strip先去除注释内容,而后使用startsWith函数进行检测。(更严谨的做法,可能需要对sql语句进行语法分析后再检测;待完善–)

针对pcap文件进行检测

完成以上步骤后,使用pcap文件检验规则是否能产生告警

suricata -c suricata.yaml -k none -r mysql.pcap 

打开eve.json后,查看alert情况

{"time":"2025-07-09T09:32:25.481582+0000","timestamp":1752053545481,"flow_id":"2036907348195717","pcap_cnt":54,"alarm_type":"alert","src_ip":"10.1.30.200","src_port":54366,"dest_ip":"10.1.1.3","dest_port":3306,"proto":"TCP","pkt_src":"wire/pcap","event_id":"ec830925-9c01-434c-9651-5e43c836da5f","tx_id":9,"alert":{"action":"allowed","gid":1,"signature_id":10001,"classification":"","rev":1,"signature":"test mysql detect","category":"","severity":3,"attack_result":"attempt","severity":3,"sid":10001},"tx_id":10,"request":{"message":"SimpleQuery","query":"/* ApplicationName=DBeaver 24.1.3 - SQLEditor <Script-17.sql> */ truncate tb_attack_20250111"},"protocol":"mysql","direction":"to_server","flow":{"pkts_toserver":35,"pkts_toclient":19,"bytes_toserver":5220,"bytes_toclient":11003,"start":"2025-07-09T09:31:27.146574+0000","src_ip":"10.1.30.200","dest_ip":"10.1.1.3","src_port":54366,"dest_port":3306}}

总结

通过以上操作,即完成了Mysql协议一条告警规则的新增及处理

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/89921.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/89921.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用位运算优化 Vue.js 应用:高效状态管理技巧

在 Vue.js 开发中&#xff0c;位运算&#xff08;Bitwise Operations&#xff09;是一种高效的工具&#xff0c;尤其适用于需要管理大量布尔状态或优化性能的场景。位运算通过操作二进制位来实现状态的存储和检查&#xff0c;相比传统的数组或对象操作&#xff0c;内存占用更低…

【Java SE】Clonable接口和深拷贝

目录 一.Clonable接口 实现步骤&#xff1a; 完整代码&#xff1a; 二.深拷贝 实现步骤&#xff1a; 完整代码&#xff1a; 浅拷贝与深拷贝的对比 使用场景建议 完 浅拷贝&#xff08;Shallow Copy&#xff09;和深拷贝&#xff08;Deep Copy&#xff09;是对象复制的两…

accelerate 在Pycham中执行的设置方法

背景 使用 accelerate 进行分布式代码训练时&#xff0c;需要在pycharm中进行调试&#xff0c;此时需要在pycharm中运行。 终端执行命令 # *[Specify the config file path and the GPU devices to use] export CUDA_VISIBLE_DEVICES0# *[Specify the config file path] expo…

探索量子计算与法律理论的交叉领域

文章目录 前言 一、引言 二、内容 (一)知识产权 (二)隐私与安全 (三)责任认定 (四)证据与证明 (五)法律推理与决策 三、结论 总结 前言 随着量子计算技术的突破性发展,其引发的法律范式重构问题日益凸显。乌兹别克斯坦学者伊索姆别克・阿卜迪哈基莫夫于2024年在《量…

js迭代器

文章目录前言实现原理&#xff1a;调用迭代器自制迭代器前言 迭代器是 JSt 中一种特殊的对象&#xff0c;它提供了一种统一的、通用的方式遍历个各种不同类型的数据结构。 可以遍历的数据结构包括&#xff1a;数组、字符串、Set、Map 等可迭代对象。我们也可以自定义实现迭代器…

chainlink VRF中文教程(含mock),解决error: Arithmetic Underflow in createSubscription

⸻我使用的版本&#xff1a;chainlink-brownie-contracts version:1.3.0⸻1. Import 相关包 ,,, import {VRFConsumerBaseV2Plus} from "chainlink/contracts/src/v0.8/vrf/dev/VRFConsumerBaseV2PLUS.sol"; import {VRFV2PlusClient} from "chainlink/contract…

非线性优化框架CasADi工具箱求解最优控制问题OCP

CasADi是一个开源的Python/MATLAB库&#xff0c;主要用于数值优化&#xff0c;特别是最优控制问题。它提供了一个易于使用的符号框架&#xff0c;用于处理和生成表达式&#xff0c;以及高效地生成导数信息。 https://web.casadi.org/get/https://web.casadi.org/get/ 所有OCP…

Type-C接口台式显示器:LDR6021引领新潮流

Type-C单口便携显示器LDR6021是市场上一种新兴的显示设备&#xff0c;以下是对其的详细介绍一、主要特点 便携性:LDR6021采用了Type-C接口作为数据传输和供电接口&#xff0c;这种设计使得它能够与各种支持Type-C接口的设备无缝连接&#xff0c;如笔记本电脑、智能手机、平板电…

在翻译语义相似度和会议摘要相似度评估任务中 ,分类任务 回归任务 生成任务区别

在翻译语义相似度&#xff08;Translation Semantic Similarity&#xff09;和会议摘要相似度&#xff08;Meeting Summary Similarity&#xff09;等任务中&#xff0c;通常会根据任务的目标和输出形式&#xff0c;将其划分为三类常见的任务类型&#xff1a;1. 分类任务定义&a…

UGUI 性能优化系列:第二篇——Canvas 与 UI 元素管理

UGUI 性能优化系列&#xff1a;第一篇——基础优化与资源管理 UGUI 性能优化系列&#xff1a;第二篇——Canvas 与 UI 元素管理 UGUI 性能优化系列&#xff1a;第三篇——渲染与像素填充率优化 UGUI 性能优化系列&#xff1a;第四篇——高级优化与注意事项 在 UGUI 性能优化…

企业开发转型 | 前端AI化数字化自动化现状

文章目录前端AI化数字化自动化发展现状引言调研背景与目的调研范围与方法前端AI化技术现状与工具生态主流AI工具分类与能力矩阵工具能力对比分析关键能力指标深度解析大模型技术成熟度评估前端AI化核心应用场景与人力优化路径代码生成与自动化开发设计到代码全链路自动化自动化…

Mysql(运维-日志)

黑马mysql笔记 最好开两个窗口&#xff0c;一个用于mysql命令&#xff0c;一个用于liunx命令 目录 错误日志 二进制日志 介绍 日志格式 mysq默认二进制日志文件为ROW 日志查看 二进制日志查看命令 默认日志文件格式下查看日志内容 更改日志文件格式查看日志内容 日志…

RabbitMQ:解锁高效消息传递的密码[特殊字符]

目录 一、RabbitMQ 核心概念 1.1整体框架 1.2元素详解 1.2.1 生产者&#xff08;Producer&#xff09;&消费者&#xff08;Consumer&#xff09; 1.2.2 交换机&#xff08;Exchange&#xff09; ①fanout &#xff08;广播型&#xff09; ②direct &#xff08;直连型…

StarRocks × MinIO:打造灵活高效的存算分离方案

“存算分离”&#xff08;Decoupled Storage and Compute&#xff09;是一种在现代数据系统中被广泛采用的架构设计。它将计算和存储解耦&#xff0c;使二者可以独立扩展&#xff0c;提升资源利用率并降低运维成本。StarRocks 从 3.0 版本开始支持这一架构&#xff0c;允许用户…

R语言的分位数回归实践技术高级应用

回归是科研中最常见的统计学研究方法之一&#xff0c;在研究变量间关系方面有着极其广泛的应用。由于其基本假设的限制&#xff0c;包括线性回归及广义线性回归在内的各种常见的回归方法都有三个重大缺陷&#xff1a;(1)对于异常值非常敏感&#xff0c;极少量的异常值可能导致结…

Tomcat的部署、单体架构、session会话、spring

一、Tomcat的部署①②③④⑤二.web项目在tomcat服务中如何运行&#xff1a;1.web项目源码部署在服务器的webapps目录里面2.将web项目打包(war),部署在服务器的webapps目录里面。三 单体架构和前后端分离单体架构是将所有功能模块&#xff08;包括前端界面、后端逻辑、数据库交互…

海康威视视觉算法岗位30问及详解

海康威视视觉算法岗位30问及详解 前言 视觉算法工程师是人工智能领域的热门岗位&#xff0c;尤其在安防、自动驾驶、工业检测等行业有着广泛应用。海康威视作为行业龙头&#xff0c;对视觉算法岗位的要求较高&#xff0c;面试问题既考察基础理论&#xff0c;也关注工程实现。本…

14.7 Alpaca格式深度解析:3倍指令准确率提升的LLM微调秘诀

文章目录 Alpaca格式深度解析:3倍指令准确率提升的LLM微调秘诀 指令微调格式:Alpaca Format 深度解析 14.3.1 Alpaca 格式诞生背景与技术价值 14.3.2 Alpaca 格式结构解析 14.3.3 实战 Dolly-15K 数据转 Alpaca 格式 14.3.4 Alpaca 格式的工程化实践 14.3.5 格式扩展与挑战应…

42.sentinel实现线程隔离

线程隔离有两种实现方式: 1.线程池隔离 优点: 1.支持主动超时,线程池中的线程都是可控的,可以停掉某个线程。 2.支持异步调用,每个请求都是一个独立的线程,线程之间不受影响。 缺点: 线程的额外开销比较大 适用场景: 低扇出(一个微服务,不会依赖很多微服务)…

【过拟合和欠拟合】——深度学习.全连接神经网络

目录 1 概念认知 1.1 过拟合 1.2 欠拟合 1.3 如何判断 2 解决欠拟合 3 解决过拟合 3.1 L2正则化 3.1.1 数学表示 3.1.2 梯度更新 3.1.3 作用 3.1.4 代码实现 3.2 L1正则化 3.2.1 数学表示 3.2.2 梯度更新 3.2.3 作用 3.2.4 与L2对比 3.2.5 代码实现 3.3 Drop…