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
相关文章:
wazuh-modules-sca
wazuh中安全配置评估模块主线程执行wm_sca_main最后在wm_sca_start中循环执行,不会返回 // Module main function. It wont 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 * dat…...
Uniapp的App环境下使用Map获取缩放比例
概述 目前我试过的就是你用vue后缀是拿不到比例的你可以用nvue当然uniapp的uvue应该是更加可以的我使用的是高德所以你得在高德的后台声请原生的Android的key才可以如果是vue3的开发模式的话不用使用this来获取当前对象使用scale对象来接受和改变缩放比例会比较友好然后直接走…...
微信小程序配置less并使用
1.在VScode中下载Less插件 2.在微信小程序中依次点击如下按钮 选择 从已解压的扩展文件夹安装… 3.选中刚在vscode中下载安装的插件文件 如果没有修改过插件的安装目录,一般是在c盘下C:\用户\用户名.vscode\extensions\mrcrowl.easy-less-2.0.2 我的路径是…...
“全面支持公路数字化转型升级四大任务”视频孪生解决方案
数字经济的加速布局,对交通领域数字化转型、智能化升级提出明确要求。2024年上半年,为深入贯彻落实中共中央、国务院关于加快建设交通强国、数字中国等决策部署,推进公路水路交通基础设施数字转型、智能升级、融合创新,加快发展新…...
顶顶通电话机器人开发接口对接大语言模型之实时流TTS对接介绍
大语言模型一般都是流式返回文字,如果等全部文字返回了一次性去TTS,那么延迟会非常严重,常用的方法就是通过标点符号断句,返回了一句话就提交给TTS。随着流TTS的出现,就可以直接把大模型返回的文字灌给流TTS࿰…...
P3379 【模板】最近公共祖先(LCA)
【模板】最近公共祖先(LCA) https://www.luogu.com.cn/problem/P3379 题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。 输入格式 第一行包含三个正整数 N , M , S N,M,S N,M,S,分别表示…...
2030. gitLab A仓同步到B仓
文章目录 1 A 仓库备份 到 B 仓库2 B 仓库修改main分支的权限 1 A 仓库备份 到 B 仓库 #!/bin/bash# 定义变量 REPO_DIR"/home/xhome/opt/git_sync/zz_xx_xx" # 替换为你的本地库A的实际路径 REMOTE_ORIGIN"http://192.168.1.66:8181/zzkj_software/zz_xx_xx.…...
网易博客旧文-----如何在WINDOWS下载安卓(android)源代码并和eclipse做关联
如何在WINDOWS下载安卓(android)源代码并和eclipse做关联 2013-02-05 17:27:16| 分类: 安卓开发 | 标签: |举报 |字号大中小 订阅 编写安卓程序时,有时想看看安卓某些类的实现,但默认情况下环境是不带的。…...
MATLAB中axes函数用法
目录 语法 说明 示例 在图窗中定位多个坐标区 将坐标区设置为当前坐标区 在选项卡上创建坐标区 axes函数的功能是创建笛卡尔坐标区。 语法 axes axes(Name,Value) axes(parent,Name,Value) ax axes(___) axes(cax) 说明 axes 在当前图窗中创建默认的笛卡尔坐标区&…...
构建 Java Web 应用程序:实现简单的增删查改(Mysql)
简介 本教程将指导您如何使用Java Servlet和JSP技术构建一个简单的Web应用程序。该应用程序将包括用户注册、登录、注销(删除用户信息)、修改密码以及根据性别查询用户信息等功能。我们将使用MySQL数据库来存储用户数据。 环境准备 Java Development …...
3d行政区划-中国地图
前言 技术调研:做底代码平台的3d行政区组件 写的demo 效果图: 实现的功能项 地标、打点、飞线、three.js 3d 中国地图的一些基础配置补充 geo中国地图文件获取 其他项:包 "dependencies": {"d3": "^7.9.0","d3-…...
适合存储时序数据的数据库和存储系统
时序数据的存储通常要求高效地处理大量按时间排序的数据,同时支持快速查询、实时分析和高并发写入。以下是一些适合存储时序数据的数据库和存储系统: 1. InfluxDB 概述:InfluxDB 是一个开源的时序数据库,专门为处理时序数据而设…...
dolphinscheduler集群服务一键安装启动实现流程剖析
1.dolphinscheduler的安装部署 dolphinscheduler服务的安装部署都是非常简单的,因为就服务本身而言依赖的服务并不多。 mysql / postgresql。由于需要进行元数据及业务数据的持久化存储所以需要依赖于数据库服务,数据库服务支持mysql、postgresql等&am…...
深入了解Linux —— 学会使用vim编辑器
前言 学习了Linux中的基本指令也理解了权限这一概念,但是我们怎么在Linux下写代码呢? 本篇就来深入学习Linux下的vim编辑器;学会在Linux下写代码。 软件包管理器 1. 软件包? 在Linux下安装软件,通常是下载程序的源码…...
C05S01-Web基础和HTTP协议
一、Web基础 1. Web相关概念 1.1 URL URL(Uniform Resource Locator,统一资源定位符),是一种用于在互联网上标识和定位资源的标准化地址,提供了一种访问互联网上特定资源的方法。URL的基本格式如下所示:…...
MIT工具课第六课任务 Git基础练习题
如果您之前从来没有用过 Git,推荐您阅读 Pro Git 的前几章,或者完成像 Learn Git Branching 这样的教程。重点关注 Git 命令和数据模型相关内容; 相关内容整理链接:Linux Git新手入门 git常用命令 Git全面指南:基础概念…...
计算机网络安全
从广义来说,凡是涉及到网络上信息的机密性、报文完整性、端点鉴别等技术和理论都是网络安全的研究领域。 机密性指仅有发送方和接收方能理解传输报文的内容,而其他未授权用户不能解密(理解)该报文报文完整性指报文在传输过程中不…...
Delphi 实现键盘模拟、锁定键盘,锁定鼠标等操作
Delphi 模拟按键的方法 SendMessageA 说明: 调用一个窗口的窗口函数,将一条消息发给那个窗口。除非消息处理完毕,否则该函数不会返回SendMessage所包含4个参数: 1. hwnd 32位的窗口句柄窗口可以是任何类型的屏幕对象,因为Win32能够维护大多数…...
RTK数据的采集方法
采集RTK(实时动态定位)数据通常涉及使用高精度的GNSS(全球导航卫星系统)接收器,并通过基站和流动站的配合来实现。本文给出RTK数据采集的基本步骤 文章目录 准备设备设置基站设置流动站数据采集数据存储与处理应用数据…...
Next.js 入门学习
一、引言 在现代 Web 开发领域,Next.js 已成为构建高性能、可扩展且用户体验卓越的 React 应用程序的重要框架。它基于 React 并提供了一系列强大的特性和工具,能够帮助开发者更高效地构建服务器端渲染(SSR)、静态站点生成&#…...
微信小程序 - 手机震动
一、界面 <button type"primary" bindtap"shortVibrate">短震动</button> <button type"primary" bindtap"longVibrate">长震动</button> 二、js逻辑代码 注:文档 https://developers.weixin.qq…...
sqlserver 根据指定字符 解析拼接字符串
DECLARE LotNo NVARCHAR(50)A,B,C DECLARE xml XML ( SELECT <x> REPLACE(LotNo, ,, </x><x>) </x> ) DECLARE ErrorCode NVARCHAR(50) -- 提取 XML 中的值 SELECT value x.value(., VARCHAR(MAX))…...
论文笔记——相干体技术在裂缝预测中的应用研究
目录 相关地震知识补充地震数据的认识地震几何属性 相干体算法定义基本原理第一代相干体技术:基于互相关的相干体技术(Correlation)第二代相干体技术:基于相似的相干体技术(Semblance)基于多道相似的相干体…...
MySQL 知识小结(一)
一、my.cnf配置详解 我们知道安装MySQL有两种方式来安装咱们的MySQL数据库,分别是二进制安装编译数据库或者使用三方yum来进行安装,第三方yum的安装相对于二进制压缩包的安装更快捷,但是文件存放起来数据比较冗余,用二进制能够更好管理咱们M…...
C/C++ 中附加包含目录、附加库目录与附加依赖项详解
在 C/C 编程的编译和链接过程中,附加包含目录、附加库目录和附加依赖项是三个至关重要的设置,它们相互配合,确保程序能够正确引用外部资源并顺利构建。虽然在学习过程中,这些概念容易让人混淆,但深入理解它们的作用和联…...
【Linux】Linux 系统默认的目录及作用说明
博主介绍:✌全网粉丝23W,CSDN博客专家、Java领域优质创作者,掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域✌ 技术范围:SpringBoot、SpringCloud、Vue、SSM、HTML、Nodejs、Python、MySQL、PostgreSQL、大数据、物…...
搭建DNS域名解析服务器(正向解析资源文件)
正向解析资源文件 1)准备工作 服务端及客户端都关闭安全软件 [rootlocalhost ~]# systemctl stop firewalld [rootlocalhost ~]# setenforce 0 2)服务端安装软件:bind 1.配置yum源 [rootlocalhost ~]# cat /etc/yum.repos.d/base.repo [Base…...
CRMEB 中 PHP 短信扩展开发:涵盖一号通、阿里云、腾讯云、创蓝
目前已有一号通短信、阿里云短信、腾讯云短信扩展 扩展入口文件 文件目录 crmeb\services\sms\Sms.php 默认驱动类型为:一号通 namespace crmeb\services\sms;use crmeb\basic\BaseManager; use crmeb\services\AccessTokenServeService; use crmeb\services\sms\…...
(一)单例模式
一、前言 单例模式属于六大创建型模式,即在软件设计过程中,主要关注创建对象的结果,并不关心创建对象的过程及细节。创建型设计模式将类对象的实例化过程进行抽象化接口设计,从而隐藏了类对象的实例是如何被创建的,封装了软件系统使用的具体对象类型。 六大创建型模式包括…...
Spring AI Chat Memory 实战指南:Local 与 JDBC 存储集成
一个面向 Java 开发者的 Sring-Ai 示例工程项目,该项目是一个 Spring AI 快速入门的样例工程项目,旨在通过一些小的案例展示 Spring AI 框架的核心功能和使用方法。 项目采用模块化设计,每个模块都专注于特定的功能领域,便于学习和…...
