2009年3月9日星期一

bro的事件

什么是事件

在Bro中,事件(event)用于反应特定网络行为。而事件处理引擎是Bro的核心。事件可以针对底层的网络协议,也可以针对应用层协议。

事件处理器

事件处理器从语法上非常接近于函数,两者的不同是事件处理器没有返回值,也不能被调用。事件处理器可以采用如下方式声明:

event ( argument*  )

例如:

local eh: event(attack_source: addr, severity: count)

声明了局部变量eh,eh是一个事件处理器类型,有两个参数:attack_source是地址(addr)类型;severity是计数(count)类型。

如果想声明一个有处理代码的事件处理器,语法是:

event handler  ( argument  )  { statement @code{}}

另外,可以把事件处理器赋值给一个相同类型的变量。

事件产生的方式

事件的产生有以下三种方式:

  • 事件引擎产生

当事件引擎检测到一个定义了事件处理器的事件时,会将其放入队列中,等待事件处理器处理。一旦事件引擎处理完当前数据包,会立即调用事件处理器。

  • 通过事件语句产生

例如,在策略脚本中使用:

event password_exposed(c, user, password);

事件引擎就会以参数c、user、password调用事件处理器password_exposed。注意:必须已经在调用之前,对password_exposed进行声明,而且参数也必须兼容。

  • 通过调度表达式

调度表达式在将来的某个时刻启动事件表达式。例如:

schedule 5 secs { password_exposed(c, user, password) };

表示password_exposed将在5秒之后启动。

事件处理机制

强大的事件模型是bro的核心,通过bro的通讯框架,可以实现事件处理的分布操作,这也是bro入侵检测系统能够分布式部署的基础之一。

将事件检测机制与事件处理机制分离是bro的核心思想之一。事件由bro核心的分析器产生。分析器持续地进行分析操作,一旦看到相关的行为就以异步的方式 出发事件,例如,新建了一个TCP连接,或者看到了HTTP请求的URL。Bro核心的分析器能够进行广泛的协议分析,例如:TCP、UDP、FTP、 HTTP、ICMP、SMTP、RPM等。不过,为了降低CPU资源的占用,需要注意:只启用分析所需的事件触发。

一旦某个事件触发,事件处理引擎将其投递到策略层。每个Bro阶段都有相关的策略来控制器策略层的行为。这些策略对应于站点的安全策略,由Bro脚 本语言写成。这种语言是一种强类型,函数风格的语言,为网络行为分析提供了大量的数据类型。在策略层还维护着大量状态信息变量,这些变量主要是描述相关的 网络行为。每种事件,都可以定义一种或多种事件处理器进行处理,事件处理器甚至还可以触发新的事件。事件类型由名称和一系列参数组成,可以唯一识别特定的 事件。

没有评论: