嵌入式系统中入侵检测的设计及实现
图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入侵检测模块的设计已基本实现。并且,作者修改了本实验室已实现的智能脱扣器项目的软件,并把它加载到修改后的嵌入式操作系统上进行初步测试。测试结果表明:系统的实时性和安全性均能满足要求。在本论文的基础上,作者将对入侵检测的策略进行进一步改进和扩充,增强其稳定性和实时性,以使其能更适应实际的电力应用领域。
linux操作系统文章专题:linux操作系统详解(linux不再难懂)
评论