2009年3月4日星期三

ossec的新功能--预编译规则之一:ossec的规则

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

1. ossec的规则

ossec的规则是XML格式的,主要有两种:

  • 解码规则:用于判断日志的种类和格式,所有的内容都在decode.xml文件中;
  • 检测规则:依赖于检测规则,主要用于检测日志中记录的安全问题。

1.1. 解码规则

根据decoder.xml的定义,ossec的日志分析程序会从被监控的日志中提取某些字段,根据这些字段判断日志的种类,例如:sshd日志、 web日志,然后在根据其中的某些字段,确定日志记录了那种信息,例如:sshd登录成功、失败。下面我们看一段linux sshd日志的片段(来源于ossec wiki的日志样本):

  • 登录成功:

May 21 20:22:28 slacker2 sshd[8813]: Accepted password for root from 192.168.20.185 port 1066 ssh2
May 21 20:22:28 sol2 sshd[23857]: [ID 702911 auth.notice] User test1, coming from 192.168.2.185, - authenticated.
Oct 11 08:05:46 hostname auth|security:info sshd[323808]: Accepted publickey for usr1 from 2.3.4.5 port 37909 ssh2


  • 登录失败:

May 21 20:22:28 slacker sshd[21487]: Failed password for root from 192.168.20.185 port 1045 ssh2

  • 无效的用户登录企图:

Jul 7 10:51:24 chaves sshd[19537]: Invalid user admin from spongebob.lab.ossec.net
Jul 7 10:53:24 chaves sshd[12914]: Failed password for invalid user test-inv from spongebob.lab.ossec.net
Jul 7 10:53:24 kiko sshd[3251]: User dcid not allowed because listed in DenyUsers



decoder.xml文件中,相关规则如下:

<!-- 判断sshd日志的规则,从日志条目的开头匹配是否存在字符:sshd。 -->
<!-- 也是其它sshd日志解析规则的上级规则。 -->
<decoder name="sshd">
<program_name>^sshd</program_name>
</decoder>


<decoder name="sshd-success"><!-- 解析sshd登录成功日志 -->
<parent>sshd</parent><!-- 只有符合sshd的条件才启用这条规则 -->
<prematch>^Accepted</prematch><!-- 判断是否为登录成功,条件是从头搜索,发现Accepted字符 -->

<!-- 从日志条目中,利用正则表达式提取变量 -->
<regex offset="after_prematch">^ \S+ for (\S+) from (\S+) port </regex>

<!-- 两个(\S+)提取的值分别赋给变量:user(用户名)和srcip(源IP地址) -->
<order>user, srcip</order>

<!-- 根据name, user, location判断fts??? -->
<!-- fts是首次看到(First Time Seen)的简写 -->
<fts>name, user, location</fts>
</decoder>

<!-- 无效的用户或者失败的登录 -->
<decoder name="ssh-invfailed">
<parent>sshd</parent>

<!-- 判断 -->
<prematch>^Failed \S+ for invalid user|^Failed \S+ for illegal user</prematch>

<!-- 提取源IP地址 -->
<regex offset="after_prematch">from (\S+) port \d+ \w+$</regex>
<order>srcip</order>
</decoder>

<!-- 登录失败 -->
<decoder name="ssh-failed">
<parent>sshd</parent>
<prematch>^Failed \S+ </prematch>
<regex offset="after_prematch">^for (\S+) from (\S+) port \d+ \w+$</regex>
<order>user, srcip</order>
</decoder>

<!-- 无效用户 -->
<decoder name="ssh-invalid-user">
<parent>sshd</parent>
<prematch>^Invalid user|^Illegal user</prematch>
<regex offset="after_prematch"> from (\S+)$</regex>
<order>srcip</order>
</decoder>


1.2. 检测规则

检测规则位于etc/rules/目录中,还是以sshd的规则为例:

<group name="syslog,sshd,"> <!-- 定义规则组 -->
<rule id="5700" level="0" noalert="1">
<decoded_as>sshd</decoded_as> <!-- 判断是否为sshd日志 -->
<description>SSHD messages grouped.</description>
</rule>

<rule id="5701" level="8">
<if_sid>5700</if_sid> <!-- 只处理sshd日志 -->
<match>Bad protocol version identification</match>
<description>Possible attack on the ssh server </description>
<description>(or version gathering).</description>
</rule>

<!-- 其余规则省略 -->
</group>

没有评论: