2009年3月5日星期四

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

预编译规则

根据上面的介绍,我们知道ossec有两种规则,其中解码器负责日志解码、分类,规则实现入侵检测和日志分析。想了解预编译规则能干什么,我们现看看ossec处理日志(以syslog为例)的基本处理流程:

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

Eventinfo

我们先看一下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进行的。对Eventinfo的处理又分以下阶段:

  1. 预处理阶段。OS_CleanMSG函数从接收到的信息中,提取相关数据,填写Eventinfo的第一部分;
  2. 解码处理阶段。调用DecodeEvent函数,完成解码处理。
  3. 检测阶段。剩下的检测过程全部由OS_ReadMSG_analysisd调度完成。

预编译规则

ossec预编译规则的位置是源代码的src/analysisd/compiled_rules目录。在上述阶段中,预处理规则只能用于检测阶段,与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 #恢复函数列表

没有评论: