IDS的标准化
公共入侵检测框架(CIDF)
CIDF所做的工作主要包括四部分:IDS的体系结构、通信机制、描述语言和应用编程接口API。
一.CIDF的体系结构
CIDF在IDES和NIDES的基础上提出了一个通用模型,将入侵检测系统分为四个基本组件:事件产生器、事件分析器、响应单元和事件数据库。结构如图5所示。
在这个模型中,事件产生器、事件分析器和响应单元通常以应用程序的形式出现,而事件数据库则往往是文件或数据流的形式,很多IDS厂商都以数据收集部分、数据分析部分和控制台部分三个术语来分别代替事件产生器、事件分析器和响应单元。
CIDF将IDS需要分析的数据统称为事件,它可以是网络中的数据包,也可以是从系统日志或其他途径得到的信息。
以上四个组件只是逻辑实体,一个组件可能是某台计算机上的一个进程甚至线程,也可能是多个计算机上的多个进程,它们以GIDO(统一入侵检测对象)格式进行数据交换。GIDO是对事件进行编码的标准通用格式(由CIDF描述语言CISL定义),GIDO数据流在图5中以虚线表示,它可以是发生在系统中的审计事件,也可以是对审计事件的分析结果。
1.事件产生器
事件产生器的任务是从入侵检测系统之外的计算环境中收集事件,并将这些事件转换成CIDF的GIDO格式传送给其他组件。例如,事件产生器可以是读取C2级审计踪迹并将其转换为GIDO格式的过滤器,也可以是被动地监视网络并根据网络数据流产生事件的另一种过滤器,还可以是SQL数据库中产生描述事务的事件的应用代码。
2.事件分析器
事件分析器分析从其他组件收到的GIDO, 并将产生的新GIDO再传送给其他组件。分析器可以是一个轮廓描述工具,统计性地检查现在的事件是否可能与以前某个事件来自同一个时间序列; 也可以是一个特征检测工具,用于在一个事件序列中检查是否有已知的滥用攻击特征;此外,事件分析器还可以是一个相关器,观察事件之间的关系,将有联系的事件放到一起,以利于以后的进一步分析。
3.事件数据库
用来存储GIDO,以备系统需要的时候使用。
4.响应单元
响应单元处理收到的GIDO,并据此采取相应的措施,如杀死相关进程、将连接复位、修改文件权限等。
由于CIDF有一个标准格式GIDO,所以这些组件也适用于其他环境,只需要将典型的环境特征转换成GIDO格式,这样就提高了组件之间的消息共享和互通。
二、CIDF的通信机制
为了保证各个组件之间安全、高效的通信,CIDF将通信机制构造成一个三层模型:GIDO层、消息层和协商传输层。
要实现有目的的通信,各组件就必须能正确理解相互之间传递的各种数据的语义,GIDO层的任务就是提高组件之间的互操作性,所以GIDO就如何表示各种各样的事件做了详细的定义。
消息层确保被加密认证消息在防火墙或NAT等设备之间传输过程中的可靠性。消息层只负责将数据从发送方传递到接收方,而不携带任何有语义的信息;同样,GIDO层也只考虑所传递信息的语义,而不关心这些消息怎样被传递。
单一的传输协议无法满足CIDF各种各样的应用需求,只有当两个特定的组件对信道使用达成一致认识时,才能进行通信。协商传输层规定GIDO在各个组件之间的传输机制。
CIDF的通信机制主要讨论消息的封装和传递,主要分为四个方面:
1. 配对服务
配对服务采用了一个大型目录服务LDAP(轻量级目录访问协议),每个组件都要到此目录服务进行注册,并通告其他组件它所使用或产生的GIDO类型。在此基础上,组件才能被归入它所属的类别中,组件之间才能互相通信。
配对服务还支持一些安全选项(如公钥证书、完整性机制等),为各个组件之间安全通信、共享信息提供了一种统一的标准机制,大大提高了组件的互操作性,降低了开发多组件入侵检测与响应系统的难度。
2. 路由
组件之间要通信时,有时需经过非透明的防火墙,发送方先将数据包传递给防火墙的关联代理,然后再由此代理将数据包转发到目的地。CIDF采用了两种路由:源路由和绝对路由。
3. 消息层
消息层要实现的功能包括:
(1)提供一个开放的体系结构。
(2)使消息独立于操作系统、编程语言和网络协议。
(3)简化向CIDF中增添新组件的过程。
(4)支持鉴定与保密等安全需求。
(5)同步(封锁进程与非封锁进程)。
4. 消息层处理
消息层处理规定了消息层消息的处理方式,它包括四个规程:标准规程、可靠传输规程、保密规程和鉴定规程。
三、CIDF语言
CIDF的总体目标是实现软件的复用和IDR(入侵检测与响应)组件之间的互操作性。首先,IDR组件基础结构必须是安全、健壮、可伸缩的,CIDF的工作重点是定义了一种应用层的语言CISL(公共入侵规范语言),用来描述IDR组件之间传送的信息,以及制定一套对这些信息进行编码的协议。CISL可以表示CIDF中的各种信息,如原始事件信息(审计踪迹记录和网络数据流信息)、分析结果(系统异常和攻击特征描述)、响应提示(停止某些特定的活动或修改组件的安全参数)等。
CISL使用了一种被称为S表达式的通用语言构建方法,S表达式可以对标记和数据进行简单的递归编组,即对标记加上数据,然后封装在括号内完成编组,这跟LISP有些类似。S表达式的最开头是语义标识符(简称为SID),用于显示编组列表的语义。例如下面的S表达式:
(HostName ‘first.example.com’)
该编组列表的SID是HostName,它说明后面的字符串“first.example.com”将被解释为一个主机的名字。
有时侯,只有使用很复杂的S表达式才能描述出某些事件的详细情况,这就需要使用大量的SID。SID在CISL中起着非常重要的作用,用来表示时间、定位、动作、角色、属性等,只有使用大量的SID,才能构造出合适的句子。CISL使用范例对各种事件和分析结果进行编码,把编码的句子进行适当的封装,就得到了GIDO。
GIDO的构建与编码是CISL的重点。
四、CIDF的API接口
CIDF的API负责GIDO的编码、解码和传递,它提供的调用功能使得程序员可以在不了解编码和传递过程具体细节的情况下,以一种很简单的方式构建和传递GIDO。
GIDO的生成分为两个步骤:第一,构造表示GIDO的树型结构;第二,将此结构编成字节码。
在构造树形结构时,SID被分为两组:一组把S表达式作为参数(即动词、副词、角色、连接词等),另一组把单个数据或一个数据阵列作为参数(即原子),这样就可以把一个完整的句子表示成一棵树,每个SID表示成一个节点,最高层的SID是树根。因为每个S表达式都包含一定的数据,所以,树的每个分支末端都有表示原子SID的叶子。
由于编码规则是定义好的,所以对树进行编码只是一个深度优先遍历和对各个节点依次编码的过程。在这种情况下,我们可以先对V编码,然后对R1子树编码,再对R2子树编码。如果上面的句子是一个连接句的一部分,那么,每个成分句都可以从中完好地提取出来。也就是说,如果句子事先已经编码,在插入到一个连接句时无须再进行编码。
将字节码进行解码跟上面的过程正好相反,在SID码的第一个字节里有一个比特位显示其需要的参数:是基本数据类型,还是S表达式序列。然后语法分析器再对后面的字节进行解释。CIDF的API并不能根据树构建逻辑GIDO,但提供了将树以普通GIDO的S表达式格式进行打印的功能。
CIDF的API为实现者和应用开发者都提供了很多的方便,它分为两类:GIDO编码/解码API和消息层API。(完)