OSSEC 与 Wazuh 规则引擎之对比

参考:https://blog.csdn.net/qq_29490749/article/details/142253399

引言

Wazuh 是 ossec的分支,那为啥非要用分支不用原生呢?其实问题就在于Wazuh对ossec的规则引擎进行改良和扩展,使得规则不限制于 少量且写死的字段,譬如源地址、目的地址等字段,可以进行无限制的字段扩展

两者 规则引擎,支持以下共同特性 ——单事件正则统计类规则前后关联,例如暴力破解爆破成功检测;
Wazuh本质上 语法层面 和 ossec 没有变化,但是公共字段提取出来了,同时正则匹配数据提取灵活性更强

一、OSSEC 规则

OSSEC包括两类规则,分别是静态c编译规则,动态xml扩展规则。

规则语法详解:https://ossec-documentation.readthedocs.io/en/latest/manual/lids/rules.html

(一)预编译规则(Compiled Rules)-- 静态

OSSEC的静态预编译规则(Compiled Rules)为了方便不喜欢编写xml格式规则的用户。
ossec预编译规则的位置是源代码的 src/analysisd/compiled_rules 目录。
利用这项功能,用户可以直接使用 c语言来编写日志处理规则,在编译的时候,连接到 analysisd 程序。并非一种动态的规则扩展机制。
为了了解预编译规则,我们先看一下ossec的xml规则定义。

(二)XML 规则 -- 动态

ossec 的动态配置规则是XML格式的,可以继续划分为两个子类:
解码规则:用于判断日志的种类和格式,所有的内容都在decode.xml文件中;
检测规则:依赖于检测规则,主要用于检测日志中记录的安全问题。

OSSEC的解码规则与检测规则是其入侵检测能力的核心组件,两者协同工作以实现日志分析和威胁识别。以下为详细解析:

1. 解码规则(Decoders)

功能与作用‌
解码器用于将原始日志解析为结构化数据,提取关键字段(如时间戳、IP地址、事件类型等),为后续规则匹配提供标准化输入。例如,针对SSH登录日志的解码器会提取用户名、IP和登录状态等信息‌。

配置方式‌

解码器定义在 /var/ossec/etc/decoders.xml 文件中,支持正则表达式匹配日志格式‌。
每个解码器需指定 parent 字段继承父类解码逻辑,或通过 prematch 预匹配条件筛选日志‌。

自定义开发‌
用户可为特定应用日志编写自定义解码器。例如,解析自定义服务日志需在 <decoder> 标签中定义匹配规则和字段提取逻辑‌。

 2. 检测规则(Rules)

功能与作用‌
检测规则基于解码后的结构化数据,通过逻辑条件匹配异常行为或攻击特征。例如,检测多次SSH登录失败可触发暴力破解告警‌。

配置方式‌

规则定义在 /var/ossec/rules/ 目录下的XML文件中,按威胁类型分类(如系统、Web应用等)‌。
规则包含<if_sid>引用父规则ID,实现多级关联分析。XML Code 例如:

<rule id="10001" level="5">
<decoded_as>ssh_login</decoded_as>
<description>SSH login failed</description>
</rule>
<rule id="10002" level="10">
<if_sid>10001</if_sid>
<same_source_ip />
<description>Multiple SSH login failures from same IP</description>
</rule>

此规则链在单次失败(level 5)基础上,检测同一IP的多次失败并提升告警级别(level 10)‌。

自定义开发‌
用户可通过 <rule> 标签定义新规则,结合 <regex> 匹配字段内容,并通过 <group> 分类告警类型‌。

(三)协同工作流程

 

1. 日志处理流程‌:

ossec-logcollector  // 收集日志
ossec-analysisd     // 范式化日志并进行分析,匹配规则并触发告警信息
ossec-syscheckd     // 检测定义监控的文件完整性变化(校验和、权限、属组)
ossec-maild         // 触发邮件或短信告警
ossec-execd         // 触发执行响应处理脚本
ossec-remoted       // 服务端与客户端通信服务守护进程(UDP 1514)

I. ossec-logcollector(源代码在src/logcollector)监控各种日志的变更,ossec支持syslog、mysql、postgresql、snort、nmap,以及djbmultilog等日志;
II. 一旦发现日志变动,就读取信产生的日志,根据日志类型的不同,分别调用read_syslog、read_djbmultilog、 read_nmapg、read_mysql_log、read_snortfull、read_postgresql_log等函数进行处理。在这里我 们只关注syslog的处理。
III. read_syslog读取日志条目,调用 SendMSG 向 ossec-analysisd (源代码在src/analysisd)投递。在ossec启动时,analysisd会打开一个UNIX套接字,接收事件日志,进行分析处理。
IV. ossec-analysisd调用OS_ReadMSG_analysisd函数接收事件信息,然后调用OS_CleanMSG将收到的数据转换为 Eventinfo 结构。

typedef struct _Eventinfo
{
    /* 从事件信息中提取的数据 */
    char *log;
    char *full_log;
    char *location;
    char *hostname;
    char *program_name;

    /* 从解码器中提取的数据 */
    char *srcip;
    char *dstip;
    char *srcport;
    char *dstport;
    char *protocol;
    char *action;
    char *srcuser;
    char *dstuser;
    char *id;
    char *status;
    char *command;
    char *url;
    char *data;
    char *systemname;

    /* Pointer to the rule that generated it */
    RuleInfo *generated_rule;

    /* Pointer to the decoder that matched */
    OSDecoderInfo *decoder_info;

    /* Sid node to delete */
    OSListNode *sid_node_to_delete;

    /* Extract when the event fires a rule */
    int size;
    int p_name_size;

    /* Other internal variables */
    short int matched;
    
    int time;
    int day;
    int year;
    char hour[9];
    char mon[4];
}Eventinfo;

Eventinfo 是 ossec检测核心对象,所有的检测都是针对Eventinfo进行的。
ossec-analysisd接收原始日志对Eventinfo的处理又分以下阶段:
a. 预处理阶段OS_CleanMSG函数从接收到的信息中,提取相关数据,填写Eventinfo的第一部分;
b. 解码阶段。调用 DecodeEvent 函数,完成解码处理。应用解码器解析原始日志为结构化数据;
c. 检测阶段。剩下的检测过程全部由OS_ReadMSG / OS_ReadMSG_analysisd调度完成。

  • 规则匹配‌:基于结构化数据,调用OS_CheckIfRuleMatch逐级匹配检测规则;
  • 事件处理记录事件/触发警报/执行响应) :OS_Exec(execdq, arq, lf, *rule_ar) 触发对应告警级别,并执行预设响应动作(如阻断IP)‌

预编译规则
ossec预编译规则的位置是源代码的 src/analysisd/compiled_rules 目录。
在上述阶段中,预处理规则 只能用于" c.检测阶段 " ,与 xml 定义的 检测规则 等同。下面我们看一下ossec源代码中的一段示例,检测源用户和目标用户是否相同。

void *comp_srcuser_dstuser(Eventinfo *lf)
{
    if(!lf->srcuser || !lf->dstuser)
    {
        return(lf);
    }
    /* 对比Eventinfo中,srcuser是否等于dstuser */
    if(strcmp(lf->srcuser, lf->dstuser) == 0)
    {
        return(lf);
    }
    /* In here, srcuser and dstuser are present and are different. */
    return(NULL);
}

 编写预处理插件时,我们只需要编写我们需要的功能即可,剩下的相关工作可以由 register_rule.sh 脚本完成,然后重新编译 ossec 的源代码,即可完成安装。register_rule.sh支持以下选项:

add <函数名>    #添加函数
list           #列出加入的函数
build          #生成头文件 compiled_rules.h
save           #备份函数列表
restore        #恢复函数列表

 

2. 测试工具‌

使用ossec-logtest工具可模拟日志输入,实时查看解码和规则匹配结果。bash  Code 例如:

/var/ossec/bin/ossec-logtest
> Jul 4 09:42:16 enigma sshd[11990]: Failed password for root from 192.168.1.10

 

输出将显示匹配的解码器、规则ID及告警级别‌。

(四)配置文件与目录结构

组件 路径/文件 说明 来源
解码器‌ /var/ossec/etc/decoders.xml 存储全局解码器定义  
规则‌ /var/ossec/rules/*.xml 按类别存储检测规则 (如syslog_rules.xml)
测试工具‌ /var/ossec/bin/ossec-logtest 模拟日志输入验证解码器与规则有效性   

通过合理配置解码规则与检测规则,OSSEC可实现细粒度威胁检测,例如精准识别Web攻击、异常登录行为及文件篡改等场景‌。

 

二、Wazuh 规则

Wazuh 规则定义‌:Wazuh规则是一组用XML格式编写的条件,用于解释日志数据。这些规则位于/var/ossec/etc/rules/和 /var/ossec/ruleset/rules/由Wazuh Manager使用,用于在日志消息中检测特定的模式或行为,并相应地生成警报或响应。

规则语法详解:https://documentation.wazuh.com/current/user-manual/ruleset/ruleset-xml-syntax/rules.html

(一)规则分类

分为两类,默认规则 和自定义规则。

1. 默认规则

Wazuh 默认规则是随 Wazuh 安装包一起提供的内置规则。这些规则可以在 Wazuh 服务器的 /var/ossec/ruleset/rules/ 目录下找到。这些规则涵盖了广泛的安全事件和日志来源,为常见的安全威胁提供了一个基准。
默认规则旨在检测各种类型的攻击、漏洞或可疑活动。它们由Wazuh团队不断更新和维护,以应对新出现的威胁,并确保安全检测能力的有效性。
例如,Wazuh内置的对网络入侵检测引擎Suricata日志解析的规则示例,该规则示例在/var/ossec/ruleset/rules/0475-suricata_rules.xml文件中。

2. 自定义规则

Wazuh中的自定义规则允许用户定义特定条件或模式,这些条件或模式与他们独特的环境、应用程序或安全需求相关。这些规则可以在 Wazuh 服务器的 /var/ossec/etc/rules/ 目录下找到。虽然Wazuh自带一组默认规则,覆盖了广泛的安全事件,但自定义规则使用户能够根据他们的具体需求定制系统,并增强其能力。
Wazuh有两种方式供用户选择,分别是新增自定义规则修改默认规则

‌Wazuh规则的添加‌:

(1)新增自定义规则‌:用户可以创建自定义规则来扩展Wazuh的功能。自定义规则与解码器类似,都是以XML配置文件方式实现,根据不同的条件来识别日志内容。例如,可以创建一个自定义规则来检测命令执行日志,首先将命令转存到日志文件中,然后使用解码器解析这些日志‌

  自定义规则有以下三点需要注意:

  • 新增的规则ID应该设置为100000~120000范围。
  • 如果新增规则数量较少,可以在/var/ossec/etc/rules/local_rules.xml文件中添加,如果规则数量较多,建议在/var/ossec/etc/rules/文件夹下创建规则文件。
  • 更改规则后需要执行systemctl restart wazuh-manager命令重启wazuh-manager才能生效。

(2)根规则与派生规则‌:根规则是基础规则,负责区分规则类别;派生规则可以引用根规则进行更详细的过滤和匹配,从而派生出更具体的描述安全事件的规则‌

(3)修改默认规则:Wazuh默认的规则文件在 /var/ossec/ruleset/rules 文件夹下,如果想要修改默认规则,先将默认的规则文件拷贝复制到 /var/ossec/etc/rules/ 文件夹下,然后进行修改,并添加overwrite="yes"属性。
        需要注意的是,尽量不要在/var/ossec/ruleset/rule s文件夹下直接修改规则文件,因为这样在Wazuh升级的时候很有可能会将之前的修改覆盖掉。

‌Wazuh的安装和配置‌:

  1. ‌安装方式‌:Wazuh可以通过仓库安装、虚拟机OVA安装、镜像下载、部署在Docker、K8s上、使用ES安装、使用ansible安装等多种方式进行安装。具体步骤可以参考Wazuh的官方文档‌
  2. ‌主动响应‌:Wazuh支持主动响应功能,当检测到危险或告警时,可以根据设定的条件执行一系列反应,如禁止账户登录等。主动响应的脚本位于/var/ossec/active-response/bin目录下‌

(二)规则分级

Wazuh规则被分为多个级别,从最低的0级到最高的16级。下面的表格概述了每个级别,提供了对每个触发警报的严重性的见解,并帮助创建自定义规则。

下面是对不同等级规则的介绍:
这段内容描述了一个安全事件管理系统中不同级别的事件及其描述。每个级别代表了事件的严重性及其对安全的影响。以下是对每个级别的简要解释:

低:

0 - Ignored: 无操作。用于避免误报。这些规则在其他所有规则之前被扫描,包括没有安全相关性的事件,并且不会出现在安全事件仪表板中。
2 - System low priority notification: 系统低优先级通知。系统通知或状态消息。这些没有安全相关性,不会出现在安全事件仪表板中。
3 - Successful/Authorized events: 成功/授权事件。包括成功的登录尝试、防火墙允许事件等。
4 - System low priority error: 系统低优先级错误。与不良配置或未使用的设备/应用程序相关的错误。这些没有安全相关性,通常由默认安装或软件测试引起。
5 - User generated error: 用户生成的错误。包括错过的密码、被拒绝的操作等。就其本身而言,这些没有安全相关性。
6 - Low relevance attack: 低相关性攻击。表明对系统没有影响的蠕虫或病毒(例如对Apache服务器的代码红等)。这也包括频繁的IDS事件和频繁的错误。


7 - “Bad word” matching: “坏词”匹配。包括“坏”、“错误”等词。这些事件大多数时候是未分类的,可能有一定的安全相关性。
8 - First time seen: 第一次看到。包括第一次看到的事件。第一次IDS事件被触发或用户第一次登录。它还包括安全相关的操作,如激活嗅探器或类似活动。
9 - Error from invalid source: 来自无效源的错误。包括作为未知用户或来自无效源的登录尝试。可能具有安全相关性(特别是如果重复出现)。这也包括关于“管理员”(root)账户的错误。
10 - Multiple user generated errors: 多个用户生成的错误。包括多个错误的密码、多次失败的登录等。这可能表明攻击,或者仅仅是用户忘记了他们的凭据。
11 - Integrity checking warning: 完整性检查警告。包括有关二进制文件修改或存在rootkit(由Rootcheck检测)的消息。这可能表明成功的攻击。还包括将被忽略的IDS事件(重复次数高)。

高:
12 - High importance event: 高重要性事件。包括来自系统、内核等的错误或警告消息。这可能表明针对特定应用程序的攻击。
13 - Unusual error (high importance): 不寻常的错误(高重要性)。大多数时候匹配常见的攻击模式。
14 - High importance security event: 高重要性安全事件。大多数时候通过相关性触发,表明攻击。

严重:
15 - Severe attack: 严重攻击。没有误报的可能性。需要立即关注。

 

posted @ 2025-02-26 22:52  suntroop  阅读(297)  评论(0)    收藏  举报