wazuh-modules-sca

wazuh中安全配置评估模块主线程执行wm_sca_main最后在wm_sca_start中循环执行,不会返回

// Module main function. It won't return
#ifdef WIN32
DWORD WINAPI wm_sca_main(void *arg) {wm_sca_t *data = (wm_sca_t *)arg;
#else
void * wm_sca_main(wm_sca_t * data) {
#endif// If module is disabled, exitif (data->enabled) {minfo("Module started.");} else {minfo("Module disabled. Exiting.");pthread_exit(NULL);}if (!data->policies || data->policies[0] == NULL) {minfo("No policies defined. Exiting.");pthread_exit(NULL);}data->msg_delay = 1000000 / wm_max_eps;data->summary_delay = 3; /* Seconds to wait for summary sending */data_win = data;/* Reading the internal options */// Default valuesdata->request_db_interval = 300;data->remote_commands = 0;data->commands_timeout = 30;data->request_db_interval = getDefine_Int("sca","request_db_interval", 1, 60) * 60;data->commands_timeout = getDefine_Int("sca", "commands_timeout", 1, 300);
#ifdef CLIENTdata->remote_commands = getDefine_Int("sca", "remote_commands", 0, 1);
#elsedata->remote_commands = 1;  // Only for agents
#endif/* Maximum request interval is the scan interval */if(data->request_db_interval > data->scan_config.interval) {data->request_db_interval = data->scan_config.interval;minfo("The request_db_interval option cannot be higher than the scan interval. It will be redefined to that value.");}int i;for(i = 0; data->policies[i]; i++) {if(data->policies[i]->enabled){minfo("Loaded policy '%s'", data->policies[i]->policy_path);} else {minfo("Policy '%s' disabled by configuration.", data->policies[i]->policy_path);}}/* Create Hash for each policy file */for(i = 0; data->policies[i]; i++) {os_realloc(cis_db, (i + 2) * sizeof(OSHash *), cis_db);cis_db[i] = OSHash_Create();if (!cis_db[i]) {merror(LIST_ERROR);pthread_exit(NULL);}OSHash_SetFreeDataPointer(cis_db[i], (void (*)(void *))wm_sca_free_hash_data);/* DB for calculating hash only */os_realloc(cis_db_for_hash, (i + 2) * sizeof(cis_db_hash_info_t), cis_db_for_hash);/* Last summary for each policy */os_realloc(last_summary_json, (i + 2) * sizeof(cJSON *), last_summary_json);last_summary_json[i] = NULL;/* Prepare first ID for each policy file */os_calloc(1,sizeof(cis_db_info_t *),cis_db_for_hash[i].elem);cis_db_for_hash[i].elem[0] = NULL;}/* Create summary hash for each policy file */for(i = 0; data->policies[i]; i++) {os_realloc(last_sha256, (i + 2) * sizeof(char *), last_sha256);os_calloc(1,sizeof(os_sha256),last_sha256[i]);}#ifndef WIN32data->queue = StartMQ(DEFAULTQUEUE, WRITE, INFINITE_OPENQ_ATTEMPTS);if (data->queue < 0) {merror("Can't connect to queue.");}#endifrequest_queue = queue_init(1024);w_rwlock_init(&dump_rwlock, NULL);#ifndef WIN32w_create_thread(wm_sca_request_thread, data);w_create_thread(wm_sca_dump_db_thread, data);
#elsew_create_thread(NULL,0,(void *)wm_sca_dump_db_thread,data,0,NULL);
#endifwm_sca_start(data);#ifdef WIN32return 0;
#elsereturn NULL;
#endif
}

1. 检查模块是否开启,否则退出模块主线程

2. 对于agents模式,remote_commands = 1

3. 配置最大扫描间隔 data->request_db_interval = data->scan_config.interval;

4. 加载每一个policy文件(.yml或者yaml),为每一个policy文件创建一个hash,到data结构指针中cis_db_for_hash[i],与data[i]通过下标对应起来

5. 创建一个写类型的队列data->queue = StartMQ(DEFAULTQUEUE, WRITE, INFINITE_OPENQ_ATTEMPTS);

6. w_create_thread(wm_sca_request_thread, data); 接收扫描请求,检查处理发送到队列中

7. w_create_thread(wm_sca_dump_db_thread, data); 从队列中消费请求,

8. wm_sca_start(data) -> wm_sca_read_files()按照每一个policy进行扫描  -> rules扫描核心函数wm_sca_do_scan() -> wm_sca_read_command()

         8.1 wm_sca_read_files()函数读policy监控文件到buffer,将buffer中yaml结构转换为json结构

         8.2 检查policy是否满足要求

         8.3 设置一个唯一的id为每个扫描

         8.4 检查文件完整性是否改变,改变则清理

         8.5 调用wm_sca_do_scan()做扫描

         8.6 发送扫描汇总信息wm_sca_send_summary()

9. wm_sca_do_scan()

    char *value = wm_sca_get_value(rule_cp_ref, &type);得到不同的type 例如:WM_SCA_TYPE_FILE,WM_SCA_TYPE_COMMAND,WM_SCA_TYPE_DIR等做不同的处理

已, 以WM_SCA_TYPE_COMMAND类型为例将调用wm_sca_read_command()处理

10. wm_sca_read_command()

static int wm_sca_read_command(char * command,char * pattern,wm_sca_t * data,char ** reason,w_expression_t * regex_engine)
{if (command == NULL) {mdebug1("No Command specified Returning.");return RETURN_NOT_FOUND;}if (!pattern) {mdebug1("No pattern given. Returning FOUND.");return RETURN_FOUND;}mdebug1("Executing command '%s', and testing output with pattern '%s'", command, pattern);char *cmd_output = NULL;int result_code;switch (wm_exec(command, &cmd_output, &result_code, data->commands_timeout, NULL)) {case 0:mdebug1("Command '%s' returned code %d", command, result_code);break;case WM_ERROR_TIMEOUT:os_free(cmd_output);mdebug1("Timeout overtaken running command '%s'", command);if (*reason == NULL) {os_malloc(snprintf(NULL, 0, "Timeout overtaken running command '%s'", command) + 1, *reason);sprintf(*reason, "Timeout overtaken running command '%s'", command);}os_free(cmd_output);return RETURN_INVALID;default:if (result_code == EXECVE_ERROR) {mdebug1("Invalid path or wrong permissions to run command '%s'", command);if (*reason == NULL) {os_malloc(snprintf(NULL, 0, "Invalid path or wrong permissions to run command '%s'", command) + 1, *reason);sprintf(*reason, "Invalid path or wrong permissions to run command '%s'", command);}} else {mdebug1("Failed to run command '%s'. Returned code %d", command, result_code);if (*reason == NULL) {os_malloc(snprintf(NULL, 0, "Failed to run command '%s'. Returned code %d", command, result_code) + 1, *reason);sprintf(*reason, "Failed to run command '%s'. Returned code %d", command, result_code);}}return RETURN_INVALID;}if(!cmd_output) {mdebug2("Command yielded no output. Returning.");return RETURN_NOT_FOUND;}char **output_line;output_line = OS_StrBreak('\n', cmd_output, 256);if(!output_line) {mdebug1("Command output could not be processed. Output dump:\n%s", cmd_output);os_free(cmd_output);return RETURN_NOT_FOUND;}os_free(cmd_output);int i;int result = RETURN_NOT_FOUND;for (i=0; output_line[i] != NULL; i++) {char *buf = output_line[i];os_trimcrlf(buf);result = wm_sca_pattern_matches(buf, pattern, reason, regex_engine);if (result == RETURN_FOUND){break;}}free_strarray(output_line);mdebug2("Result for (%s)(%s) -> %d", pattern, command, result);return result;
}

10. wm_sca_send_policies_scanned(data);发送管理端数据库中被清理的policy

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

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

大数据新视界 -- 大数据大厂之 Hive 临时表与视图:灵活数据处理的技巧(上)(29 / 30)

&#x1f496;&#x1f496;&#x1f496;亲爱的朋友们&#xff0c;热烈欢迎你们来到 青云交的博客&#xff01;能与你们在此邂逅&#xff0c;我满心欢喜&#xff0c;深感无比荣幸。在这个瞬息万变的时代&#xff0c;我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

Python批量生成个性化Word录用通知书

你是一名人力资源部门的员工&#xff0c;你需要根据一份Excel表格中的员工信息&#xff0c;为每位员工生成一份录用通知书。 Excel表格中包含了员工的姓名、性别、职位、入职日期等信息&#xff0c;你需要将这些信息填充到Word模板中&#xff0c;并生成独立的录用通知书文件。…

Android显示系统(05)- OpenGL ES - Shader绘制三角形(使用glsl文件)

一、前言&#xff1a; 上一篇文章我们使用了Shader绘制了一个基本的三角形&#xff0c;但是&#xff0c;发现那样写Shader程序特别麻烦&#xff0c;各种加双引号&#xff0c;还没有语法高亮提示。因为glsl也和java、c一样是一门语言&#xff0c;实际工程项目都是单独的glsl文件…

Linux显卡驱动安装

前言 使用Windows配置环境失败&#xff0c;其中有一个包只有Linux版本&#xff0c;Windows版本的只有python3.10的&#xff0c;所以直接选用Linux来配置环境&#xff0c;显卡安装比较麻烦&#xff0c;单独出一期。 显卡驱动安装 参考文章&#xff1a;Ubuntu显卡驱动安装和这…

【Linux】进程控制

目录 一、进程创建1.1 fork函数1.2 fork函数返回值1.3 写时拷贝1.4 fork常规用法1.5 fork调用失败的原因1.6 使用fork创建多进程 二、进程退出2.1 进程退出场景2.1.1 进程运行完毕2.1.2 代码异常终止2.1.3 小结 2.2 进程常见退出方法2.2.1 return2.2.2 调用exit函数2.2.3 调用_…

smart-doc 使用

文档地址 添加插件 <plugin><groupId>com.ly.smart-doc</groupId><artifactId>smart-doc-maven-plugin</artifactId><version>3.0.9</version><configuration><includes><!--格式为&#xff1a;groupId:artifactId;…

Spring04——注解开发

Spring3.0启用了纯注解开发模式&#xff0c;使用Java类替代配置文件&#xff0c;开启了Spring快速开发赛道 Java类代替Spring核心配置文件&#xff0c; 配置类&#xff08;Configuration&#xff09; Configuration注解用于设定当前类为配置类ComponentScan注解用于设定扫描路…

ImportError: cannot import name ‘implements‘ from ‘zope.interface‘

ImportError: cannot import name ‘implements’ from ‘zope.interface’ 1. 问题分析 问题原因&#xff1a; /home/user/.conda/envs/vectornet/lib/python3.8/site-packages/apex/interfaces.py中在使用zope.interace中使用了老表达。 2. 解决办法 原文件内容&#xff…

多线程的操作

1、Thread类 1.1 Thread类的作用 上篇博文中我们了解了线程与操作系统的关系&#xff1a;线程是操作系统中的概念&#xff0c;操作系统内核实现了线程这样的机制, 并且对用户层提供了一些 API 供用户使用&#xff0c;Java 标准库中 Thread 类可以视为是对操作系统提供的 API 进…

51单片机应用开发(进阶)---串口接收字符命令

实现目标 1、巩固UART知识&#xff1b; 2、掌握串口接收字符数据&#xff1b; 3、具体实现目标&#xff1a;&#xff08;1&#xff09;上位机串口助手发送多字符命令&#xff0c;单片机接收命令作相应的处理&#xff08;如&#xff1a;openled1 即打开LED1;closeled1 即关…

3-5 C常用的字符串库函数

1.0 字符串库函数 strlen()函数用于返回字符串的长度&#xff0c;不包括结尾\0 uint32_t strlen(char *str) {uint32_t len 0;while (str[len] ! \0){len;}return len; } 编译器在处理字符串时&#xff0c;会自动的在数据末尾添加ASCI码“0对应十进制0&#xff0c;便于程序对…

python语法基础---正则表达式(补充)

&#x1f308;个人主页&#xff1a;羽晨同学 &#x1f4ab;个人格言:“成为自己未来的主人~” 上一篇文章中&#xff0c;我们讲到了贪婪匹配和非贪婪匹配&#xff0c;我们在这篇文章中&#xff0c;主要讲的就是贪婪匹配和非贪婪匹配的剩下的部分&#xff0c;话不多说&#x…

如何在谷歌浏览器中设置网络代理

在当今的网络环境中&#xff0c;使用代理服务器可以增强您的隐私和安全性。如果您希望在谷歌浏览器中设置网络代理&#xff0c;本文将为您提供详细的步骤指南。此外&#xff0c;我们还会简要介绍如何使用谷歌浏览器的任务管理器、查看Cookies以及更换侧边栏位置&#xff0c;以便…

【AI系统】MobileNet 系列

MobileNet 系列 在本文会介绍 MobileNet 系列&#xff0c;重点在于其模型结构的轻量化设计&#xff0c;主要介绍详细的轻量化设计原则&#xff0c;基于这原则&#xff0c;MobileNetV1 是如何设计成一个小型&#xff0c;低延迟&#xff0c;低功耗的参数化模型&#xff0c;可以满…

分层架构 IM 系统之 Router 假在线分析

通过对分层架构 IM 系统的分析&#xff0c;Router 的核心职责是作为中央存储记录在线客户端与 Entry 节点之间的映射关系&#xff0c;在本质上 Router 是一个内存数据库。 客户端已经离线&#xff0c;Entry 还未感知&#xff0c;或者 Entry 已经感知并且切断了连接&#xff0c;…

04 创建一个属于爬虫的主虚拟环境

文章目录 回顾conda常用指令创建一个爬虫虚拟主环境Win R 调出终端查看当前conda的虚拟环境创建 spider_base 的虚拟环境安装完成查看环境是否存在 为 pycharm 配置创建的爬虫主虚拟环境选一个盘符来存储之后学习所写的爬虫文件用 pycharm 打开创建的文件夹pycharm 配置解释器…

在Java的xml的sql语句里面的某一个参数是list集合的时候

经常在Java里面&#xff0c;遇到这样的问题&#xff0c;sql的一个查询语句&#xff0c;它的某一个参数是一个List集合&#xff0c;然而&#xff0c;在xml.mapper文件里面的时候&#xff0c;不知道如何去组成这个查询语句&#xff0c;不知道兄弟们是否经常忘记如何去写这个语句&…

pdf转word/markdown等格式——MinerU的部署:2024最新的智能数据提取工具

一、简介 MinerU是开源、高质量的数据提取工具&#xff0c;支持多源数据、深度挖掘、自定义规则、快速提取等。含数据采集、处理、存储模块及用户界面&#xff0c;适用于学术、商业、金融、法律等多领域&#xff0c;提高数据获取效率。一站式、开源、高质量的数据提取工具&…

一文讲清楚ROS2中多线程、并发、回调组的概念和基础使用

前言 在机器人开发中&#xff0c;多线程的使用司空见惯。ROS2借助executor类帮助开发者简化多线程的使用&#xff0c;但是还是得先把基本概念搞清楚&#xff0c;才能正确的使用。本文解释了ROS1和ROS2中的并发/多线程概念&#xff0c;并且给出了ROS2版本一些实际例子帮助理解。…

《向量数据库指南》——Mlivus Cloud:OPPO的向量数据库选型秘籍

Why Mlivus Cloud? —— 向量数据库选型的深度剖析与实战分享 在当今这个数据驱动的时代,向量数据库作为处理非结构化数据的重要工具,正逐渐受到业界的广泛关注。OPPO,作为全球知名的智能手机制造商,也在这场技术变革中积极探索和实践。他们在向量检索的道路上,从最初的…