嵌入式系统中入侵检测的设计及实现
扫描二维码
随时随地手机看文章
随着通信技术和电子技术的不断发展,嵌入式系统在电力系统中得到越来越广泛的应用,电力嵌入式系统连接Internet将成为一大发展趋势。但是Internet是一个不确定的网络,存在着许多安全隐患,这是一个突出的、急待解决的问题。因此要求嵌入式操作系统设计时,除了考虑实时性,还必须考虑其安全性设计。
目前,比较流行的嵌入式操作系统有QNX、VxWorks、Widow CE、μC/OS-II等。其中,μC/OS-II内核以稳定、简短、源代码公开等特性得到了人们的青睐。但μC/OS-II只是一个微内核,并没有安全方面的设计。为了更加适合应用在电力系统中,这部分功能必须增强。
本文将针对电力系统的需求,基于一个改写的μC/OS-II说明该嵌入式操作系统中入侵检测模块的设计与实现。
1、针对电力系统的安全威胁分析
嵌入式系统在电力系统中主要应用于数据采集和远程监控,所以它面临的最大威胁是数据(指令也认为是一种数据)的保密性和完整性问题。通过现有的保密技术和网络安全措施可以基本上保证数据的安全,但并不能绝对保证。入侵检测模块可以认为是整个系统的最后一道防线,在系统遭受威胁或被攻击后,可以分析攻击行为,有效保护系统免受同样的攻击。针对电力系统,可以归纳出三个主要的安全威胁,这些威胁不能通过常规的数据保密技术和网络安全措施得到绝对有效的解决。
(1) 内部人员的违规行为。通常,数据保密技术和账户安全管理手段,只能防止外来人员的攻击,而对于内部人员则束手无策。若内部人员滥用权限也会使系统面临很大的威胁。小则造成设备损坏,大则危害公共安全和经济生产。
(2) 非授权用户登录操作。一个电力监控系统不仅可以远程采集电力终端设备的数据,同时也可以进行设备故障诊断、实时控制等操作。非授权用户通过盗取密码等非法手段登录嵌入式系统并进行非法的设备控制是监控系统面临的最大安全威胁。
(3) 对系统资源的非法访问。这里所谓的系统资源主要包括存储器中的数据、系统的运行参数以及用于控制电力设备的硬件。当攻击者绕过正常的操作顺序获取数据或是硬件的控制权时,系统的所有安全措施形同虚设。
通过上述分析可知,为了进一步加强系统的安全性,必须使系统具有个人行为监控、事件重建、抵御网络攻击和故障分析能力。这些都将在入侵检测模块中实现。
2、基于主机的入侵检测模块设计
2.1 检测技术
考虑到嵌入式系统资源的有限性,入侵检测模块将采用滥用检测技术。所谓滥用检测是直接对入侵行为进行特征化描述,建立某种或某类入侵的特征行为模式库。如果发现当前行为与某个入侵模式一致,则表示发生了这种入侵。采用这种技术将降低判断入侵检测程序的复杂度,并且大大减少审计开销,系统只记录一些必要的日志信息,节省了有限的存储器空间。
2.2 框架设计
入侵检测模块一般分为四部分:
(1) 事件产生器。从环境中抽取感兴趣的信息,并把信息转化为标准格式供系统其他部件使用。
(2) 事件数据库。事件数据库保存事件日志。
(3) 事件分析器。分析输入的格式化后的事件,进行真正意义上的入侵检测,并产生新的警告。
(4) 响应单元。响应单元按照警告进行相应的保护,反击入侵行为。
根据电力应用的特性和嵌入式系统的特点,对上述入侵检测框架进行修改如下:
(1)事件发生器产生原始日志数据,为了避免对进程实时性造成太大的影响,先不做格式化处理。
(2)事件数据库将接收的原始日志数据进行格式化处理,并进行相应的分类保存。
(3)事件分析器与响应单元合并,以减少对系统进程的占用。
整个入侵检测框架如图1所示。
图1 入侵检测框架图
3 基于主机的入侵检测模块的实现
3.1 入侵检测模块的实现流程
该操作系统是一个实时操作系统,为了不影响系统的实时性,入侵检测并不是实时处理,数据流在整个处理过程中可能并不是很流畅,所以在设计时采用消息队列形式传递原始记录。即每个事件产生器发送的消息都送到一个消息队列中,事件数据库在系统空闲时取出消息做统一的格式化处理,并保存到数据库中。当日志记录累积到一定程度时,由事件数据库触发事件分析器做分析检测,经过检测的日志记录可以适当删除,以保持事件数据库接收新日志的能力。事件分析器作为整个入侵检测模块的核心,其程序流程如图2所示。[!--empirenews.page--]
图2 事件分析器程序流程图
从图2可以看出,系统目前只检测三种安全威胁,这是针对电力系统的威胁而确定。检测的结果保存到威胁日志中并生成相应错误号,辅助响应单元完成后续操作。可以根据需求,通过修改检测策略库增加检测的攻击类型,但是为了不影响嵌入式系统的实时性,原则上只检测必要的攻击行为。
3.2 主要数据结构和方法
大型入侵检测系统采用标准的日志数据结构,以方便系统之间的数据交流。但作为一个嵌入式的应用,目前并没有做分布式架构的设计。若采用标准数据结构,则会使日志记录的数据量大大增加,占用大量有限的存储器空间。因此系统自定义了一个日志记录的数据结构,而事件数据库以一个结构体数组形式存在,并通过一个结构体控制数组使其成为一个循环区域。日志记录和控制循环区域的结构体数据格式如下:
struct log {
unsigned char tp; //说明日志文件类型
unsigned char action; //说明操作类型
unsigned long time; //说明操作时间
unsigned long ip; //说明操作地点
long backup; //供扩展用
}
日志记录是整个模块中最占用存储器的部分,为了尽量减少占用存储区域,各个字段都做了优化处理。在时间上并不采用传统标准的年/月/日/时/分/秒表示,而是以一个无符号的长整型表示时间差来计算时间。这样不仅节省了存储空间,还简化了检测过程中时间差计算的复杂度。具体操作类型通过char tp与char action确定,用每一个bit位表示一个操作,这样可以表示64个具体操作类型。
struct logchain {
struct log* start; //缓存区开始的地址
struct log* end; //缓存区结束的地址
unsigned short lpoint//上次入侵检测提取的最后一条记录
unsigned short ttsize//整个缓存区的大小
unsigned short entries//目前被占用的记录数目
unsigned short curpoint//指向当前可以写入的缓存区点
}
上述数据结构将控制整个事件数据库日志的存储管理。事件数据库以一个循环的结构体数组表示,可以避免数据缓冲区的溢出。
整个入侵检测模块主要有以下几个功能函数。为了保证通用性,所有函数都是以标准C语言编写。
(1)入侵检测模块的启动:unsigned char audit_init(void)。该功能函数将完成事件数据库存储区域的初始化、消息队列的初始化和常驻任务的建立。
(2)常驻任务:void audittrail_thread(void*arg)。当系统启动入侵检测服务后,该任务将作为常驻任务运行在系统中。常驻任务是接收事件产生器发送的消息,经格式化处理保存在事件数据库中,并根据事件数据库的情况触发事件分析器。
(3)检测函数
密码猜测攻击:void check_countguess(void)
异常操作行为:void check_abnormalaction(void)
资源访问情况:void check_resoucestatus(void)
这三个功能函数用来分析用户登录日志记录,检测是否存在恶意攻击。
(4)响应单元主函数:void response_main(unsigned char alarm)。该函数根据分析器得出的警告,调用响应策略库中的相关策略,实施保护或者反击措施。
本文提出的基于改进的μC/OS-II入侵检测模块的设计已基本实现。并且,作者修改了本实验室已实现的智能脱扣器项目的软件,并把它加载到修改后的嵌入式操作系统上进行初步测试。测试结果表明:系统的实时性和安全性均能满足要求。在本论文的基础上,作者将对入侵检测的策略进行进一步改进和扩充,增强其稳定性和实时性,以使其能更适应实际的电力应用领域。