OSSEC是一款开源的多平台的入侵检测系统,一个很显著的特点是容易定制,基于XML更改配置和增加规则。OSSEC通过规则实现数据的解码和分析。
用户可以根据自己的理解,编写解码规则,对数据进行解码和分析。在编写自己的规则之前,首先要了解decoder的规则语言。
研究一下decoder的规则语言。
decoder 中的关键字及含义:
decoder 是一个规则节点的标志,后面的属性包括name(规则名称)和status(程序中定义的为状态,已有规则中不包含)
program_name 进程名,是一棵规则树的根节点中包含的信息,与日志中的进程名进行匹配
parent 父节点,指明规则节点的父节点
prematch 匹配的字符串格式
regex 匹配的正则表达式
offset 是 prematch和regex中补充的条件:after_prematch、after_parent,说明匹配的条件
order 用在regex之后,定义解析的字段名称及匹配顺序
type 指明decoder的类型,包括:firewall、ids、web-log、windows、ossec、squid、syslog、host-information
use_own_name 标识:true,在设置decoder的id时,是否与根节点用一个id,对应后面的decoded_as
fts 判断(First Time Seen)的字段,计算得到rule中的if_fts条件标识
ftscomment 对(First Time Seen)的描述,程序中此处为空,在rule中实现
plugin_decoder 是decoder中的其他插件,系统本身定义的解码规则(代码中实现)
实例分析decoder规则的实现:
<decoder name="pam"> <program_name>(pam_unix)$</program_name> </decoder> <decoder name="pam"> <program_name></program_name> <prematch>^pam_unix|^(pam_unix)</prematch> </decoder> <decoder name="pam-user"> <parent>pam</parent> <prematch>^session w+ </prematch> <regex offset="after_prematch">^for user (S+)</regex> <order>user</order> </decoder> <decoder name="pam-host-user"> <parent>pam</parent> <prematch>rhost=S+s+user=S+</prematch> <regex>rhost=(S+)s+user=(S+)</regex> <order>srcip, user</order> </decoder> <decoder name="pam-host"> <parent>pam</parent> <prematch> rhost</prematch> <regex offset="after_prematch">^=(S+)</regex> <order>srcip</order> </decoder>
程序中如何实现规则树:decoder链表在内存中有两个:forpname;nopname。
如果规则节点有program_name,则保存到forpname链表中,否则保存到nopname链表中。
然后找规则节点中的parent关系,找到每一个规则节点的父节点,构建规则树。
匹配的时候,首先匹配program_name,找到规则树的根节点,然后匹配prematch,继续匹配child项,也就是父节点的子规则节点,prematch匹配成功后,继续匹配regex,如果没有prematch项,直接匹配regex。
当有offset条件时,AFTER_PARENT是在匹配完父节点的结果上继续匹配,如果没有offset,则匹配整条日志内容。AFTER_PREMATCH是在匹配完子节点的prematch的基础上继续匹配,如果没有,则匹配整条日志内容。(实现函数:void DecodeEvent(Eventinfo *lf))
order是要获取的字段的名称,根据order中定义的字段,获取日志中的信息(ReadDecodeXML)
然后看有没有插件解码规则: plugin_decoder(系统中实现的)
<decoder name="windows-date-format"> <prematch>^dddd-dd-dd dd:dd:dd </prematch> </decoder> <decoder name="windows-firewall"> <parent>windows-date-format</parent> <type>firewall</type> <use_own_name>true</use_own_name> <prematch offset="after_parent">^OPEN|^CLOSE|^DROP</prematch> <regex offset="after_parent">^(w+) (w+) </regex> <regex>(S+) (S+) (d+) (d+) </regex> <order>action, protocol, srcip, dstip, srcport, dstport</order> </decoder>
有的decoder中还包含一些特殊的关键字,type表示decoder的类型,也就是日志的类型,表示特殊的日志,包括firewall、syslog、IDS、Apache等。这些特殊的日志,当获取到信息之后,可以通过算法实现进一步的分析,如firewall日志中,可以通过id和type分析得到防火墙的状态。
use_own_name为true时,为规则节点分配独立的ID,否则与父节点一样。这里主要是为了后面的rule匹配的decoded_as.
<decoder name="cisco-ios-ids"> <parent>cisco-ios</parent> <type>ids</type> <prematch>^%IPS-4-SIGNATURE: </prematch> <regex offset="after_prematch">^Sig:(d+) .+[(S+):(d+) -> </regex> <regex>(S+):(d+)]</regex> <order>id, srcip, srcport, dstip, dstport</order> <fts>name, id, srcip, dstip</fts> <ftscomment>First time Cisco IOS IDS/IPS module rule fired.</ftscomment> </decoder> <decoder name="symantec-websecurity"> <prematch>^dddddddd,ddd+,</prematch> <plugin_decoder>SymantecWS_Decoder</plugin_decoder> 插件解码规则(程序中实现) </decoder>
fts(First Time Seen),对应rule中的if_fts,第一次触发的规则。(如第一次执行sudo命令)
Ftscomment这里没有用到。程序中为空。(与rule中description重复)