发明内容
有鉴于此,本发明提供一种入侵检测方法,将入侵检测***嵌于***内核中,使入侵检测减少对CPU的开销,不需要进行频繁的上下文切换和数据拷贝的抓包过程。
本发明为一种入侵检测方法,外部网络传送来的数据包经由网卡驱动上传给内核层的协议栈之后,再送至应用层;入侵检测***对外部网络传送的数据包进行检测,其特征在于,该方法包括:网卡驱动向协议栈上传接收到的数据包时,先由嵌于***内核层中的入侵检测***对当前上传的数据包进行入侵检测,然后再将经过检测的数据包发送给协议栈。
其中,该方法进一步包括:入侵检测***根据预先设定的检测规则,判断当前检测到的数据包是否为入侵数据包,如果是,则直接丢弃该数据包并退出当前入侵检测流程;否则,将经过检测的数据包上传给协议栈。
其中,该方法进一步包括:预先在网卡驱动将数据包向协议栈上传时所调用的数据包处理函数中设置钩子代码。
其中,该方法进一步包括:网卡驱动上传数据包时,执行自身所调用数据包处理函数中的钩子代码,通过钩子代码中设置的指向入侵检测***的指针函数进入入侵检测***,对当前上传的数据包进行检测。
由上述方法可以看出,本发明入侵检测***嵌入于***内核中,不依赖于抓包软件包来获取数据包,因此不需要拷贝数据包到应用层,也不需要频繁的上下文切换,因而减少了CPU开销,节省了访存带宽,提高了检测效率和性能。另一方面,入侵检测***嵌入于***内核中,而不是分离于***内核层之外,因而比运行在应用层更安全。另外,由于每一个进入到协议栈的数据包必须首先经过入侵检测***的审查,只有不构成入侵的数据包才能传送到协议栈,如果数据包经入侵检测***检测后认为构成入侵,就会在数据包传送到协议栈之前丢弃该数据包,因而协议栈之上的应用程序不会受到任何影响,做到了完全的入侵预防,尤为适用于对Web服务器的保护。
具体实施方式
图1为入侵检测***与***内核结合的示意图。如图1,本发明将入侵检测***嵌入于***内核,例如,对于Linux***,入侵检测***可以使用Linux的可装载内核模块(LKM)实现,用Linux提供的二进制应用工具insmod将入侵检测嵌入于***内核中。同时,入侵检测***还要挂接到数据链路层与网络层之间,即网卡驱动程序和协议栈之间。这样在网卡驱动将数据包上传时,数据包会首先传送到入侵检测***,经过检测后再向协议栈传送。另外,入侵检测***还包括管理模块,用于控制入侵检测及其相关功能的实现并完成相关的数据配置,由于管理模块功能不是对数据包进行检测,其实现方法可以在应用层实现。
入侵检测***挂接到网卡驱动程序和协议栈之间的实现方法,是在网卡驱动提交数据包并准备上传到协议栈时,在其所调用的数据包处理函数如net_bh函数,***一个钩子(hook),将入侵检测***挂接在该钩子上,利用钩子引导***执行钩子所指定的函数,执行完该功能函数后再继续执行***原有操作。本例中,该段钩子代码包含一个指针函数,该指针函数指向入侵检测***,传向协议栈的数据包便会根据钩子代码中的该指针首先由入侵检测***进行检测。
以下以受护主机接收外部网络数据包,上传到协议栈的过程为例,参照图1所示,对本发明入侵检测实现方法进一步详细说明。
步骤1,网卡接收由外部网络传送来的数据包,并将接收到的数据包通过网卡驱动程序向上提交,调用net_bh函数,准备将数据包上传到协议栈。
步骤2,执行net_bh函数时,触发该net_bh函数中的钩子。由于该钩子代码添加在net_bh函数中,因此在每次数据包上传到协议栈的过程中,这段钩子必定被触发执行。
首先,根据钩子代码中指向入侵检测***的指针函数的值判断是否已经启用入侵检测***,若该指针函数值表示否,则退出本流程,继续执行钩子代码之后的原net_bh函数代码,将数据包上传到协议栈;若指针函数值表示已经启用了入侵检测***,则数据包由入侵检测***按照检测规则进行检测,检测过程与现有技术相同。以上可以看出,任何数据包通过网卡上传到协议栈的过程中,该数据包必先经过入侵检测过程。
步骤3,若通过入侵检测***的管理模块启动了入侵预防功能,入侵检测***可在检测到可疑数据包后,将该数据包进行丢弃,不再上传。
这里所述的入侵预防是指:在入侵检测***中,可以通过其管理模块,设定是否对入侵数据包进行预防,根据其设定的结果值,入侵检测***在检测数据包后,根据其检测结果向钩子代码返回一个值,该返回值指示下一步对数据包的处理。举例如下:
若对入侵数据包不进行预防,即仅对数据包进行入侵检测,则在入侵检测***检测完该数据包后,返回执行码0,net_bh函数***的钩子代码接收到0后,继续执行位于钩子代码之后的原net_bh函数代码,将数据包继续上传到协议栈。
若对入侵数据包进行预防,则在入侵检测***检测到可疑数据包后,直接将该数据包丢弃,并向钩子代码返回退出码-1。net_bh函数中***的钩子代码接收到-1,就直接退出并结束对该数据包的处理流程,中止该数据包的上传过程。因此,可疑数据包在数据链路层会被拦截丢弃,不会上传到协议栈,保证了被保护设备的安全。若检测后认为数据包为合法,则返回执行码0,将数据包继续上传到协议栈。
步骤4,入侵检测***完成对数据包的处理后,入侵检测***进行结果记录,并按照预先设定的响应策略进行响应。
结果记录包括做日志或将检测结果发送到数据库进行记录,日志可以通过调用实现syslog功能的内核函数实现,也可以用printk指令实现。
这里,响应策略是指预先设定检测到可疑数据包时所要执行的动作,如响应策略为检测到可疑数据包时进行报警,则入侵检测***检测到可疑数据包时,将该事件通过报警的方式发送给控制台,这可以通过unix domainsocket发送给本机的报警代理,然后本机的报警代理再把报警发送到控制台的方式实现。
本发明在Linux实现的方法举例如下:以对Linux内核打补丁的方式,在***内核中网卡驱动把数据包提交给协议栈的地方设置一个钩子代码(hook),即把钩子代码添加到net bh函数中,并重新编译内核。然后使用insmod命令把入侵检测******到内核,通过钩子代码的指针函数把入侵检测***挂接到这个钩子上。然后,使用入侵检测***管理模块把入侵检测的规则文件导入到***内核中。之后,启动入侵检测***,并使用入侵检测***管理模块使钩子生效,便可进行入侵检测了。若需要升级更新入侵检测***的入侵检测规则文件,则先把钩子失效,然后重新导入新的规则再使钩子重新生效。
以上所述仅为本发明的较佳实施例而已,并不用以限制本发明,凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。